Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

Ё чӣ гуна дар як шоми рамзгузории осон барои лоиҳаи худ нишонҳои зебо ба даст овардан мумкин аст

Эҳтимол, ҳар як таҳиягаре, ки ҳадди аққал як лоиҳаи ҳайвоноти хонагӣ дорад, дар бораи аломатҳои зебо бо статусҳо, фарогирии рамзҳо, версияҳои бастаҳо дар nuget ҳашамат дорад ... Ва ин хориш маро водор кард, ки ин мақоларо нависам. Ҳангоми омодагӣ ба навиштани он ман ин зебоиро дар яке аз лоиҳаҳои худ гирифтам:

Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

Ин мақола ба шумо тавассути танзими асосии ҳамгироии муттасил ва таҳвил барои лоиҳаи китобхонаи синфи .Net Core дар GitLab, нашри ҳуҷҷатҳо дар GitLab Pages ва тела додани бастаҳои сохташуда ба канали хусусӣ дар Azure DevOps роҳнамоӣ мекунад.

VS Code ҳамчун муҳити рушд бо тамдид истифода мешуд Ҷараёни кории GitLab (барои тасдиқи файли танзимот бевосита аз муҳити таҳия).

Маълумоти мухтасар

CD - ин вақте ки шумо танҳо тела додед ва ҳама чиз аллакай ба муштарӣ афтодааст?

CI / CD чист ва чаро он ба шумо лозим аст - шумо метавонед онро ба осонӣ дар Google ҷустуҷӯ кунед. Дар GitLab ҳуҷҷатҳои мукаммалро дар бораи конфигуратсияи қубурҳо пайдо кунед низ осон. Дар ин ҷо ман ба таври мухтасар ва агар имконпазир бошад, бе камбудиҳо раванди системаро аз нигоҳи парранда тавсиф мекунам:

  • таҳиякунанда ба анбор ӯҳдадорӣ мефиристад, тавассути сайт дархости якҷоя эҷод мекунад, ё ба таври дигар, ба таври возеҳ ё ба таври возеҳ лӯларо оғоз мекунад,
  • ҳама вазифаҳо аз конфигуратсия интихоб карда мешаванд, ки шартҳои он имкон медиҳанд, ки онҳо дар контексти додашуда оғоз карда шаванд,
  • вазифаҳо мувофиқи марҳилаҳояшон ташкил карда мешаванд,
  • марҳилаҳо бо навбат иҷро мешаванд - яъне. мувозӣ ҳамаи вазифаҳои ин марҳила анҷом дода мешаванд,
  • агар марҳила ноком шавад (яъне ақаллан яке аз вазифаҳои марҳила иҷро нашавад), қубур қатъ мешавад (қариб ҳамеша),
  • агар хамаи мархалахо бомуваффакият анчом ёбанд, газопровод бомуваффакият хисоб карда мешавад.

Ҳамин тариқ, мо дорем:

  • лӯла - маҷмӯи вазифаҳое, ки дар марҳилаҳо ташкил карда шудаанд, ки дар онҳо шумо метавонед код созед, санҷед, бастабандӣ кунед, сохтмони анҷомёфтаро ба хидмати абрӣ ҷойгир кунед ва ғайра,
  • марҳила (марҳила) - воҳиди ташкили қубур, дорои 1+ вазифа,
  • вазифа (кор) вохиди кор дар трубопровод мебошад. Он аз скрипт (ҳатмӣ), шартҳои оғозёбӣ, танзимот барои нашр/кэш кардани артефактҳо ва ғайра иборат аст.

Мувофиқи он, вазифа ҳангоми насб кардани CI / CD аз эҷоди маҷмӯи вазифаҳо иборат аст, ки тамоми амалҳои заруриро барои сохтан, озмоиш ва нашр кардани код ва артефактҳо амалӣ мекунанд.

Пеш аз оғоз: чаро?

  • Чаро Gitlab?

Зеро вақте ки зарурати сохтани анборҳои хусусӣ барои лоиҳаҳои ҳайвоноти хонагӣ ба миён омад, онҳо дар GitHub пардохт мекарданд ва ман хасис будам. Анборҳо ройгон шуданд, аммо то ҳол ин сабаби кофӣ барои гузаштан ба GitHub нест.

  • Чаро Azure DevOps Pipelines нест?

Азбаски дар он ҷо танзим оддӣ аст - дониши сатри фармон ҳатто талаб карда намешавад. Интегратсия бо провайдерҳои берунии git - дар як чанд клик, воридоти калидҳои SSH барои фиристодани ӯҳдадориҳо ба анбор - инчунин қубур ба осонӣ танзим карда мешавад, ҳатто на аз қолаб.

Мавқеи ибтидоӣ: он чизе ки шумо доред ва чӣ мехоҳед

Мо дорем:

  • анбор дар GitLab.

Мо мехоҳем:

  • монтаж ва санҷиши автоматӣ барои ҳар як дархости якҷоякунӣ,
  • сохтани бастаҳо барои ҳар як дархости якҷоякунӣ ва тела додан ба устод, ба шарте ки дар паёми супоридани хатти муайян мавҷуд бошад,
  • фиристодани бастаҳои сохташуда ба канали хусусӣ дар Azure DevOps,
  • маҷмӯи ҳуҷҷатҳо ва нашр дар GitLab Pages,
  • нишонхои сарисинагй!11

Талаботи тавсифшуда ба таври органикӣ ба модели қубурҳои зерин рост меоянд:

  • Марҳилаи 1 - Маҷлис
    • Мо кодро ҷамъ мекунем, файлҳои баромадро ҳамчун артефакт нашр мекунем
  • Марҳилаи 2 - санҷиш
    • Мо аз марҳилаи сохтмон артефактҳо мегирем, санҷишҳо мегузорем, маълумоти фарогирии кодҳоро ҷамъ мекунем
  • Марҳилаи 3 - Пешниҳод
    • Вазифаи 1 - бастаи nuget созед ва онро ба Azure DevOps фиристед
    • Вазифаи 2 - мо сайтро аз xmldoc дар коди сарчашма ҷамъоварӣ мекунем ва онро дар GitLab Pages нашр мекунем

Биёед бубинем!

Ҷамъоварии конфигуратсия

Тайёр кардани ҳисобҳо

  1. Эҷоди ҳисоб дар Microsoft Azure

  2. Бирав ба Azure DevOps

  3. Мо лоиҳаи нав эҷод мекунем

    1. Ном - ягон
    2. Намоиш - ҳама гуна
      Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

  4. Вақте ки шумо тугмаи Эҷодро пахш мекунед, лоиҳа эҷод мешавад ва шумо ба саҳифаи он равона карда мешавед. Дар ин саҳифа шумо метавонед бо гузаштан ба танзимоти лоиҳа хусусиятҳои нолозимро ғайрифаъол кунед (пайванди поён дар рӯйхат дар тарафи чап -> Барраси -> Блоки Хадамоти Azure DevOps)
    Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

  5. Ба Atrifacts равед, Эҷоди каналро клик кунед

    1. Номи манбаъро ворид кунед
    2. Намоишро интихоб кунед
    3. Бекор кунед Бастаҳоро аз манбаъҳои умумӣ дохил кунед, то ки манбаъ ба клони нугети партов табдил наёбад
      Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

  6. Барои ғизо пайваст шуданро клик кунед, Visual Studio -ро интихоб кунед, манбаъро аз блоки Setup Machine нусхабардорӣ кунед
    Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

  7. Ба танзимоти ҳисоб равед, аломати дастрасии шахсиро интихоб кунед
    Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

  8. Нишони дастрасии нав эҷод кунед

    1. Ном - худсарона
    2. Ташкилот - ҷорӣ
    3. Эътибор барои ҳадди аксар 1 сол
    4. Доираи - Бастабандӣ / Хондан ва Навиштан
      Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

  9. Токени сохташударо нусхабардорӣ кунед - пас аз баста шудани равзанаи модалӣ, арзиш дастнорас хоҳад буд

  10. Ба танзимоти анбор дар GitLab гузаред, танзимоти CI / CD-ро интихоб кунед
    Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

  11. Блоки тағирёбандаҳоро васеъ кунед, навашро илова кунед

    1. Ном - ягон бе фосила (дар қабати фармон дастрас хоҳад буд)
    2. Арзиш - аломати дастрасӣ аз банди 9
    3. Тағйирёбандаи маска интихоб кунед
      Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

Ин конфигуратсияи пешакиро анҷом медиҳад.

Омода кардани чаҳорчӯбаи конфигуратсия

Бо нобаёнӣ, конфигуратсияи CI/CD дар GitLab файлро истифода мебарад .gitlab-ci.yml аз решаи репозиторий. Шумо метавонед роҳи худсарона ба ин файлро дар танзимоти анбор муқаррар кунед, аммо дар ин ҳолат зарур нест.

Тавре ки шумо аз васеъшавӣ мебинед, файл дорои конфигуратсия дар формат аст YAML. Тафсилоти ҳуҷҷатҳо, ки кадом калидҳоро дар сатҳи болоии конфигуратсия ва дар ҳар як сатҳҳои лона ҷойгир кардан мумкин аст.

Аввалан, биёед пайвандеро ба тасвири докер дар файли конфигуратсия илова кунем, ки дар он вазифаҳо иҷро карда мешаванд. Барои ин мо пайдо мекунем Саҳифаи тасвирҳои .Net Core дар Docker Hub. Дар GitHub як дастури муфассал дар бораи он ки тасвир барои вазифаҳои гуногун интихоб нест. Тасвир бо .Net Core 3.1 барои сохтани мо мувофиқ аст, аз ин рӯ озодона хати аввалро ба конфигуратсия илова кунед

image: mcr.microsoft.com/dotnet/core/sdk:3.1

Ҳоло, вақте ки лӯла аз анбори тасвирҳои Microsoft оғоз мешавад, тасвири муайяншуда зеркашӣ карда мешавад, ки дар он ҳама вазифаҳои конфигуратсия иҷро карда мешаванд.

Қадами навбатӣ илова кардан аст марҳила's. Бо нобаёнӣ, GitLab 5 марҳиларо муайян мекунад:

  • .pre - то ҳама марҳилаҳо анҷом дода мешавад,
  • .post - пас аз ҳама марҳилаҳо анҷом дода мешавад,
  • build — аввал баъд .pre саҳна,
  • test - марҳилаи дуюм,
  • deploy - марҳилаи сеюм.

Бо вуҷуди ин, ҳеҷ чиз ба шумо монеъ намешавад, ки онҳоро ба таври возеҳ эълон кунед. Тартиби номбар кардани қадамҳо ба тартиби иҷрои онҳо таъсир мерасонад. Барои пуррагӣ, биёед ба конфигуратсия илова кунем:

stages:
  - build
  - test
  - deploy

Барои ислоҳ кардани хатогиҳо, гирифтани маълумот дар бораи муҳит, ки дар он вазифаҳо иҷро мешаванд, маъно дорад. Биёед маҷмӯи глобалии фармонҳоро илова кунем, ки пеш аз ҳар як вазифа иҷро карда мешаванд before_script:

before_script:
  - $PSVersionTable.PSVersion
  - dotnet --version
  - nuget help | select-string Version

Барои илова кардани ҳадди аққал як вазифа боқӣ мемонад, то вақте ки ӯҳдадориҳо фиристода мешаванд, қубур оғоз шавад. Ҳоло, биёед як вазифаи холӣ илова кунем, то нишон диҳем:

dummy job:
  script:
    - echo ok

Мо санҷишро оғоз мекунем, мо паём мегирем, ки ҳама чиз хуб аст, мо ӯҳдадор мешавем, мо тела медиҳем, ба натиҷаҳо дар сайт менигарем ... Ва мо хатои скрипт мегирем - bash: .PSVersion: command not found. вф?

Ҳама чиз мантиқист - ба таври нобаёнӣ, давандагон (барои иҷрои скриптҳои вазифа масъуланд ва аз ҷониби GitLab таъмин карда мешаванд) истифода мебаранд bash барои иҷрои фармонҳо. Шумо метавонед инро бо роҳи ба таври возеҳ нишон додани дар тавсифи вазифаҳо, ки кадом тегҳои иҷрокунандаи қубур бояд дошта бошанд, ислоҳ кунед:

dummy job on windows:
  script:
    - echo ok
  tags:
    - windows

Аҷоиб! Холо газопровод кор карда истодааст.

Хонандаи бодиққат қадамҳои зикршударо такрор карда, пай мебарад, ки супориш дар марҳила иҷро шудааст test, гарчанде ки мархаларо муайян накардаем. Тавре ки шумо тахмин карда метавонед test қадами пешфарз аст.

Биёед сохтани скелети конфигуратсияро бо илова кардани ҳамаи вазифаҳои дар боло тавсифшуда идома диҳем:

build job:
  script:
    - echo "building..."
  tags:
    - windows
  stage: build

test and cover job:
  script:
    - echo "running tests and coverage analysis..."
  tags:
    - windows
  stage: test

pack and deploy job:
  script:
    - echo "packing and pushing to nuget..."
  tags:
    - windows
  stage: deploy

pages:
  script:
    - echo "creating docs..."
  tags:
    - windows
  stage: deploy

Мо як лӯлаи на он қадар функсионалӣ, вале ба ҳар ҳол дуруст гирифтем.

Танзими триггерҳо

Аз сабаби он, ки ҳеҷ гуна филтрҳои триггер барои ягон вазифа муайян карда нашудаанд, қубур хоҳад буд пурра ҳар дафъае, ки супориш ба анбор интиқол дода мешавад, иҷро карда мешавад. Азбаски ин умуман рафтори дилхоҳ нест, мо филтрҳои триггерро барои вазифаҳо насб мекунем.

Филтрҳоро дар ду формат танзим кардан мумкин аст: танҳо/ба истиснои и қоидаҳо. мухтасар, only/except ба шумо имкон медиҳад, ки филтрҳоро аз рӯи триггерҳо танзим кунед (merge_request, масалан - супоришеро, ки ҳар дафъа эҷод кардани дархости кашидан ва ҳар дафъа фиристодани супоришҳо ба филиал, ки манбаи дархости якҷоякунӣ мебошад) ва номи филиалҳо (аз ҷумла бо истифода аз ибораҳои муқаррарӣ) иҷро мешавад, муқаррар мекунад; rules ба шумо имкон медиҳад, ки маҷмӯи шартҳоро танзим кунед ва ба таври ихтиёрӣ ҳолати иҷрои вазифаро вобаста ба муваффақияти вазифаҳои қаблӣ тағир диҳед (when дар GitLab CI/CD).

Биёед маҷмӯи талаботро ба ёд орем - ҷамъоварӣ ва санҷиш танҳо барои дархости якҷоякунӣ, бастабандӣ ва ирсол ба Azure DevOps - барои дархости якҷоякунӣ ва тела ба устод, тавлиди ҳуҷҷатҳо - барои тела ба усто.

Аввалан, биёед вазифаи сохтани кодро бо илова кардани қоидае, ки танҳо бо дархости якҷоякунӣ оғоз мешавад, насб кунем:

build job:
  # snip
  only:
    - merge_request

Акнун биёед вазифаи бастабандиро насб кунем, то дар дархости якҷоякунӣ оташ занем ва ба устод ӯҳдадориҳоро илова кунем:

pack and deploy job:
  # snip
  only:
    - merge_request
    - master

Тавре ки шумо мебинед, ҳама чиз оддӣ ва оддӣ аст.

Шумо инчунин метавонед вазифаро барои оташ задан танҳо дар сурате таъин кунед, ки дархости якҷоякунӣ бо шохаи мушаххас ё шохаи сарчашма эҷод карда шавад:

  rules:
    - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"

Дар шароити, шумо метавонед истифода баред тағирёбандаҳое, ки дар ин ҷо номбар шудаанд; қоидаҳо rules ба қоидаҳо мувофиқат намекунад only/except.

Танзими сарфаи артефакт

Дар давоми як вазифа build job мо артефактҳо месозем, ки онҳоро дар вазифаҳои минбаъда дубора истифода бурдан мумкин аст. Барои ин, шумо бояд роҳҳоро ба конфигуратсияи вазифа илова кунед, файлҳоеро, ки дар он шумо бояд дар вазифаҳои зерин захира кунед ва аз нав истифода баред, ба калид artifacts:

build job:
  # snip
  artifacts:
    paths:
      - path/to/build/artifacts
      - another/path
      - MyCoolLib.*/bin/Release/*

Роҳҳо аломатҳои ҷонишинро дастгирӣ мекунанд, ки ин бешубҳа танзими онҳоро осон мекунад.

Агар супориш артефактҳоро эҷод кунад, пас ҳар як вазифаи минбаъда метавонад ба онҳо дастрасӣ пайдо кунад - онҳо дар ҳамон роҳҳо нисбат ба решаи репозиторий, ки аз вазифаи аслӣ ҷамъоварӣ шудаанд, ҷойгир мешаванд. Артефактҳо инчунин барои зеркашӣ дар сайт дастрасанд.

Акнун, ки мо чаҳорчӯбаи конфигуратсияро омода (ва озмуда) дорем, мо метавонем ба навиштани скриптҳо барои вазифаҳо идома диҳем.

Мо скриптҳо менависем

Эҳтимол, замоне дар галактикаи дуру дур, сохтани лоиҳаҳо (аз ҷумла онҳое, ки дар .net) аз сатри фармон дардовар буданд. Акнун шумо метавонед лоиҳаро дар 3 даста созед, озмоиш кунед ва нашр кунед:

dotnet build
dotnet test
dotnet pack

Табиист, ки баъзе нозукиҳо вуҷуд доранд, ки аз рӯи онҳо мо фармонҳоро то андозае душвор мегардонем.

  1. Мо мехоҳем сохтани релиз, на сохтани дебаг, аз ин рӯ мо ба ҳар як фармон илова мекунем -c Release
  2. Ҳангоми санҷиш, мо мехоҳем маълумоти фарогирии кодро ҷамъоварӣ кунем, аз ин рӯ мо бояд дар китобхонаҳои санҷишӣ таҳлилгари фарогириро дохил кунем:
    1. Бастаро ба ҳамаи китобхонаҳои санҷишӣ илова кунед coverlet.msbuild: dotnet add package coverlet.msbuild аз папкаи лоиҳа
    2. Ба фармони санҷиши санҷиш илова кунед /p:CollectCoverage=true
    3. Барои ба даст овардани натиҷаҳои фарогирӣ калидро ба конфигуратсияи супориши санҷишӣ илова кунед (ба поён нигаред)
  3. Ҳангоми бастабандии код ба бастаҳои nuget, директорияи баромадро барои бастаҳо таъин кунед: -o .

Ҷамъоварии маълумоти фарогирии код

Пас аз анҷом додани санҷишҳо, чопи Coverlet омори консолро иҷро мекунад:

Calculating coverage result...
  Generating report 'C:Usersxxxsourcereposmy-projectmyProject.testscoverage.json'

+-------------+--------+--------+--------+
| Module      | Line   | Branch | Method |
+-------------+--------+--------+--------+
| project 1   | 83,24% | 66,66% | 92,1%  |
+-------------+--------+--------+--------+
| project 2   | 87,5%  | 50%    | 100%   |
+-------------+--------+--------+--------+
| project 3   | 100%   | 83,33% | 100%   |
+-------------+--------+--------+--------+

+---------+--------+--------+--------+
|         | Line   | Branch | Method |
+---------+--------+--------+--------+
| Total   | 84,27% | 65,76% | 92,94% |
+---------+--------+--------+--------+
| Average | 90,24% | 66,66% | 97,36% |
+---------+--------+--------+--------+

GitLab ба шумо имкон медиҳад, ки ифодаи муқаррариро барои гирифтани омор муайян кунед, ки баъдан онро дар шакли лавҳа ба даст овардан мумкин аст. Ифодаи муқаррарӣ дар танзимоти вазифа бо калид муайян карда мешавад coverage; ифода бояд гурӯҳи забткунӣ дошта бошад, ки арзиши он ба нишони сарисинагӣ интиқол дода мешавад:

test and cover job:
  # snip
  coverage: /|s*Totals*|s*(d+[,.]d+%)/

Дар ин ҷо мо оморро аз як сатр бо фарогирии умумии сатр мегирем.

Бастаҳо ва ҳуҷҷатҳоро нашр кунед

Ҳарду амалиёт дар марҳилаи охирини лӯла ба нақша гирифта шудаанд - азбаски монтаж ва озмоишҳо гузаштанд, мо метавонем пешрафтҳои худро бо ҷаҳон мубодила кунем.

Аввалан, дар бораи интишори манбаи баста фикр кунед:

  1. Агар лоиҳа файли конфигуратсияи nuget надошта бошад (nuget.config), нав эҷод кунед: dotnet new nugetconfig

    Барои чӣ: тасвир метавонад дастрасии навиштан ба конфигуратсияҳои глобалӣ (корбар ва мошин) надошта бошад. Барои он ки ба хатогиҳо дучор нашавем, мо танҳо як конфигуратсияи нави маҳаллӣ эҷод мекунем ва бо он кор мекунем.

  2. Биёед манбаи нави бастаро ба конфигуратсияи маҳаллӣ илова кунем: nuget sources add -name <name> -source <url> -username <organization> -password <gitlab variable> -configfile nuget.config -StorePasswordInClearText
    1. name - номи манбаи маҳаллӣ, муҳим нест
    2. url - URL-и манбаъ аз марҳилаи "Тайёр кардани ҳисобҳо", саҳ. 6
    3. organization - номи ташкилот дар Azure DevOps
    4. gitlab variable - номи тағирёбанда бо аломати дастрасӣ ба GitLab ("Тайёр кардани ҳисобҳо", саҳ. 11). Табиист, ки дар формат $variableName
    5. -StorePasswordInClearText - ҳак барои гузаштан аз хатои радшудаи дастрасӣ (Ман аввалин касе нестам, ки ба ин раке қадам мегузорад)
    6. Дар сурати хатогиҳо, он метавонад муфид бошад, ки илова кунед -verbosity detailed
  3. Ирсоли баста ба манбаъ: nuget push -source <name> -skipduplicate -apikey <key> *.nupkg
    1. Мо ҳама бастаҳоро аз феҳристи ҷорӣ мефиристем, то *.nupkg.
    2. name - аз қадами боло.
    3. key - ягон хат. Дар Azure DevOps, дар равзанаи пайвастшавӣ ба ғизо, мисол ҳамеша сатр аст az.
    4. -skipduplicate - ҳангоми кӯшиши фиристодани бастаи аллакай мавҷудбуда бе ин калид, манбаъ хатогиро бармегардонад 409 Conflict; бо калид, фиристодан гузаронида мешавад.

Акнун биёед эҷоди ҳуҷҷатҳоро танзим кунем:

  1. Аввалан, дар анбор, дар филиали асосӣ, мо лоиҳаи docfx-ро оғоз мекунем. Барои ин, фармонро аз реша иҷро кунед docfx init ва ба таври интерактивӣ параметрҳои асосии ҳуҷҷатҳои сохтмонро муқаррар кунед. Тавсифи муфассали танзими ҳадди ақали лоиҳа дар ин ҷо.
    1. Ҳангоми конфигуратсия, муайян кардани директорияи баромад муҳим аст ..public - GitLab ба таври нобаёнӣ мундариҷаи ҷузвдони ҷамъиятиро дар решаи анбор ҳамчун манбаи Саҳифаҳо мегирад. Зеро лоиҳа дар папкае, ки дар анбор ҷойгир шудааст, ҷойгир хоҳад шуд - натиҷаро ба сатҳи боло дар роҳ илова кунед.
  2. Биёед тағиротро ба GitLab тела диҳем.
  3. Ба конфигуратсияи қубур супориш илова кунед pages (калимаи барои вазифаҳои нашри сайт дар GitLab Pages ҳифзшуда):
    1. Скрипт:
      1. nuget install docfx.console -version 2.51.0 - docfx насб кунед; версия барои дуруст будани роҳҳои насби баста муайян карда шудааст.
      2. .docfx.console.2.51.0toolsdocfx.exe .docfx_projectdocfx.json - ҷамъоварии ҳуҷҷатҳо
    2. Артефактҳои гиреҳ:

pages:
  # snip
  artifacts:
    paths:
      - public

Дигресси лирикӣ дар бораи docfx

Пештар, ҳангоми таъсиси лоиҳа, ман манбаи коди ҳуҷҷатҳоро ҳамчун файли ҳалли масъала нишон додам. Камбудии асосӣ дар он аст, ки ҳуҷҷатҳо барои лоиҳаҳои санҷишӣ низ таҳия карда мешаванд. Агар ин зарур набошад, шумо метавонед ин арзишро ба гиреҳ таъин кунед metadata.src:

{
  "metadata": [
    {
      "src": [
        {
          "src": "../",
          "files": [
            "**/*.csproj"
          ],
          "exclude":[
            "*.tests*/**"
          ]
        }
      ],
      // --- snip ---
    },
    // --- snip ---
  ],
  // --- snip ---
}

  1. metadata.src.src: "../" - мо нисбат ба макон як зина боло меравем docfx.json, зеро дар намунаҳо, ҷустуҷӯи дарахти директория кор намекунад.
  2. metadata.src.files: ["**/*.csproj"] - намунаи глобалӣ, мо ҳама лоиҳаҳои C # аз ҳама директорияҳо ҷамъ мекунем.
  3. metadata.src.exclude: ["*.tests*/**"] - намунаи глобалӣ, ҳама чизро аз ҷузвдонҳо бо .tests Дар сарлавҳа

Ҷамъбасти

Чунин конфигуратсияи оддиро танҳо дар ним соат ва якчанд пиёла қаҳва сохтан мумкин аст, ки ба шумо имкон медиҳад тафтиш кунед, ки код сохта шудааст ва санҷишҳо мегузаранд, бастаи нав созед, ҳуҷҷатҳоро навсозӣ кунед ва чашмро бо зебоӣ шод кунед. нишонаҳо дар README-и лоиҳа бо ҳар як дархости якҷоякунӣ ва фиристодан ба устод.

Ниҳоии .gitlab-ci.yml

image: mcr.microsoft.com/dotnet/core/sdk:3.1

before_script:
  - $PSVersionTable.PSVersion
  - dotnet --version
  - nuget help | select-string Version

stages:
  - build
  - test
  - deploy

build job:
  stage: build
  script:
    - dotnet build -c Release
  tags:
    - windows
  only:
    - merge_requests
    - master
  artifacts:
    paths:
      - your/path/to/binaries

test and cover job:
  stage: test
  tags:
    - windows
  script:
    - dotnet test -c Release /p:CollectCoverage=true
  coverage: /|s*Totals*|s*(d+[,.]d+%)/
  only:
    - merge_requests
    - master

pack and deploy job:
  stage: deploy
  tags:
    - windows
  script:
    - dotnet pack -c Release -o .
    - dotnet new nugetconfig
    - nuget sources add -name feedName -source https://pkgs.dev.azure.com/your-organization/_packaging/your-feed/nuget/v3/index.json -username your-organization -password $nugetFeedToken -configfile nuget.config -StorePasswordInClearText
    - nuget push -source feedName -skipduplicate -apikey az *.nupkg
  only:
    - master

pages:
  tags:
    - windows
  stage: deploy
  script:
    - nuget install docfx.console -version 2.51.0
    - $env:path = "$env:path;$($(get-location).Path)"
    - .docfx.console.2.51.0toolsdocfx.exe .docfxdocfx.json
  artifacts:
    paths:
      - public
  only:
    - master

Сухан дар бораи нишонаҳо

Ба туфайли онҳо ҳама чиз оғоз шуд!

Нишонҳо бо ҳолати қубур ва фарогирии код дар GitLab дар танзимоти CI/CD дар блоки қубурҳои Gtntral дастрасанд:

Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

Ман лавҳаеро бо истинод ба ҳуҷҷатҳо дар платформа сохтам shields.io - дар он ҷо ҳама чиз хеле оддӣ аст, шумо метавонед нишони шахсии худро эҷод кунед ва онро бо дархост қабул кунед.

![Пример с Shields.io](https://img.shields.io/badge/custom-badge-blue)

Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

Azure DevOps Artifacts инчунин ба шумо имкон медиҳад, ки барои бастаҳо бо версияи охирин нишонаҳо эҷод кунед. Барои ин, дар сарчашмаи сайти Azure DevOps, шумо бояд тугмаи Эҷоди нишони бастаи интихобшударо клик кунед ва аломати қайдро нусхабардорӣ кунед:

Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

Дастур ба CI/CD дар GitLab барои шурӯъкунандагон (қариб) мутлақ

Илова кардани зебоӣ

Таъкид кардани фрагментҳои конфигуратсияи умумӣ

Ҳангоми навиштани конфигуратсия ва ҷустуҷӯи ҳуҷҷатҳо ман як хусусияти ҷолиби YAML - истифодаи дубораи порчаҳоро пайдо кардам.

Тавре ки шумо аз танзимоти вазифа мебинед, ҳамаи онҳо тегро талаб мекунанд windows дар даванда, ва ҳангоми фиристодани дархости якҷоякунӣ ба усто/эҷод (ба истиснои ҳуҷҷатҳо) оғоз мешаванд. Биёед инро ба порчае, ки аз нав истифода хоҳем кард, илова кунем:

.common_tags: &common_tags
  tags:
    - windows
.common_only: &common_only
  only:
    - merge_requests
    - master

Ва ҳоло мо метавонем фрагментеро, ки қаблан дар тавсифи вазифа эълон шуда буд, ворид кунем:

build job:
  <<: *common_tags
  <<: *common_only

Номҳои порчаҳо бояд бо нуқта оғоз шаванд, то ҳамчун вазифа тафсир нашаванд.

Версияи бастабандӣ

Ҳангоми сохтани баста компилятор коммутаторҳои сатри фармонро ва дар сурати набудани онҳо файлҳои лоиҳаро тафтиш мекунад; вақте ки он гиреҳи Версияро меёбад, он арзиши худро ҳамчун версияи бастаи сохташаванда мегирад. Маълум мешавад, ки барои сохтани баста бо версияи нав, шумо бояд онро дар файли лоиҳа навсозӣ кунед ё ҳамчун далели сатри фармон интиқол диҳед.

Биёед боз як Рӯйхати хоҳишҳоро илова кунем - бигзор ду рақами хурд дар версия сол ва санаи сохтани баста бошад ва версияҳои пешазинтихоботиро илова кунед. Албатта, шумо метавонед ин маълумотро ба файли лоиҳа илова кунед ва пеш аз ҳар як пешниҳод тафтиш кунед - аммо шумо инчунин метавонед онро дар қубур иҷро кунед, версияи бастаро аз контекст ҷамъоварӣ кунед ва онро тавассути аргументи сатри фармон гузаронед.

Биёед розӣ шавем, ки агар паёми ӯҳдадорӣ дорои сатри монанди release (v./ver./version) <version number> (rev./revision <revision>)?, пас мо версияи бастаро аз ин сатр гирифта, онро бо санаи ҷорӣ пурра мекунем ва онро ҳамчун аргумент ба фармон медиҳем. dotnet pack. Дар сурати набудани хат, мо танҳо бастаро ҷамъ намекунем.

Скрипти зерин ин мушкилотро ҳал мекунад:

# регулярное выражение для поиска строки с версией
$rx = "releases+(v.?|ver.?|version)s*(?<maj>d+)(?<min>.d+)?(?<rel>.d+)?s*((rev.?|revision)?s+(?<rev>[a-zA-Z0-9-_]+))?"
# ищем строку в сообщении коммита, передаваемом в одной из предопределяемых GitLab'ом переменных
$found = $env:CI_COMMIT_MESSAGE -match $rx
# совпадений нет - выходим
if (!$found) { Write-Output "no release info found, aborting"; exit }
# извлекаем мажорную и минорную версии
$maj = $matches['maj']
$min = $matches['min']
# если строка содержит номер релиза - используем его, иначе - текущий год
if ($matches.ContainsKey('rel')) { $rel = $matches['rel'] } else { $rel = ".$(get-date -format "yyyy")" }
# в качестве номера сборки - текущие месяц и день
$bld = $(get-date -format "MMdd")
# если есть данные по пререлизной версии - включаем их в версию
if ($matches.ContainsKey('rev')) { $rev = "-$($matches['rev'])" } else { $rev = '' }
# собираем единую строку версии
$version = "$maj$min$rel.$bld$rev"
# собираем пакеты
dotnet pack -c Release -o . /p:Version=$version

Илова кардани скрипт ба вазифа pack and deploy job ва ҷамъбасти бастаҳоро дар сурати мавҷуд будани сатри додашуда дар паёми commit риоя кунед.

Ҳамагӣ

Пас аз сарфи тақрибан ним соат ё як соат барои навиштани конфигуратсия, ислоҳи ислоҳ дар powershell маҳаллӣ ва эҳтимолан, якчанд оғози бемуваффақият, мо конфигуратсияи оддии автоматикунонии вазифаҳои муқаррариро гирифтем.

Албатта, GitLab CI / CD назар ба он ки пас аз хондани ин дастур ба назар мерасад, хеле васеътар ва гуногунҷабҳа аст - ки ин тамоман дуруст нест. Дар он ҷо ҳатто Auto DevOps астимкон медиҳад

барномаҳои худро ба таври худкор ошкор, сохта, озмоиш, ҷойгир ва назорат кунед

Ҳоло нақшаҳо конфигуратсияи қубурро барои ҷойгиркунии барномаҳо дар Azure бо истифода аз Pulumi ва ба таври худкор муайян кардани муҳити мақсаднок, ки дар мақолаи оянда баррасӣ хоҳанд кард, иборат аст.

Манбаъ: will.com

Илова Эзоҳ