Apo si të fitoni disa badge të bukura për projektin tuaj në një mbrëmje të lehtë kodimi
Sigurisht, çdo zhvillues me të paktën një projekt pet kalon në një moment dëshirën për badge të bukura me statuset, mbulimin e kodit, versionet e paketave në nuget… Dhe kjo dëshirë më çoi në shkrimin e këtij artikulli. Gjatë përgatitjes për shkrimin e tij, kam fituar këtë bukuri në një nga projektet e mia:

Artikulli do të shqyrtojë konfigurimin bazik të integrimit dhe dorëzimit të vazhdueshëm për një bibliotekë klasash në .Net Core në GitLab, me publikimin e dokumentacionit në GitLab Pages dhe dërgimin e paketave të ndërtuara në një feed privat në Azure DevOps.
Si mjedis zhvillimi, u përdor VS Code me shtesën (për validimin e skedarit të konfigurimit direkt nga mjedisi i zhvillimit).
Hyrje e shkurtër
CD — është kur sapo e pashë kodin dhe klienti ka rënë?
Çfarë është CI/CD dhe përse është e nevojshme — mund të gjendet lehtësisht në Google. Dokumentacioni i plotë për konfigurimin e pipeline-ve në GitLab gjithashtu nuk është e vështirë për t'u gjetur zhvilluesi dërgon një commit në depo, krijon një kërkesë bashkimi përmes faqes,
- ose ndonjë mënyrë tjetër fillon qartë ose në mënyrë të paaftë pipeline-in nga konfigurimi përzgjidhen të gjitha detyrat, kushtet e së cilave lejojnë që ato të fillohen në këtë kontekst,,
- detyrat organizohen sipas fazave të tyre,
- fazat përkatësisht realizohen — dmth.
- përparësisht kryhen të gjitha detyrat e kësaj faze, nëse faza dështonte (dmth. shkon keq të paktën një nga detyrat e fazës) — pipeline-i ndalet (
- gati gjithmonënëse të gjitha fazat përfundojnë me sukses, pipeline-i konsiderohet se kaloi me sukses.),
- Kështu, kemi:
pipeline — një grup detyrash, të organizuara në faza, në të cilin mund të ndërtosh, testosh, paketosh kodin, shpërndash një ndërtim të gatshëm në një shërbim në cloud, etj.
- fase (
- stage) — një njësi organizimi e pipeline-it, përmban 1+ detyrë,detyrë (
- job) — një njësi pune në pipeline. Konsiston nga një skenar (të paktën), kushtet e ekzekutimit, cilësimet e publikimit/keshit të artefakteve dhe shumë të tjera.) — njësia e punës në pipeline. Konsiston në skript (të domosdoshëm), kushtet e nisjes, cilësimet e publikimit/keqiengjitjes së artefakteve dhe shumë të tjera.
Prandaj, detyra gjatë konfigurimit të CI/CD është të krijojë një grup detyrash që realizojnë gjithë veprimet e nevojshme për ndërtimin, testimin dhe publikimin e kodit dhe artefakteve.
Para fillimit: pse?
- Pse GitLab?
Sepse kur u shfaq nevoja për të krijuar depo private për projektet e mia, në GitHub ato ishin me pagesë, dhe unë isha i kursyer. Depo tani janë falas, por kjo ende nuk është një arsye e mjaftueshme për të kaluar në GitHub.
- Pse jo Azure DevOps Pipelines?
Sepse konfigurimi atje është elementar — nuk kërkohen asnjë njohuri të komandës. Integrimi me ofruesit e jashtëm git — me disa klikime, importimi i çelësave SSH për dërgimin e komiteteve në depo — gjithashtu, pipeline është lehtësisht i konfigurueshëm edhe jashtë një shablloni.
Pozita fillestare: çfarë kemi dhe çfarë duam
Kemi:
- depo në GitLab.
Duam:
- ndërtimin dhe testimin automatik për çdo merge request,
- ndërtimin e paketave për çdo merge request dhe dërgimin në master në kushtin e që ekziston një rresht i caktuar në mesazhin e komitetit,
- dërgimin e paketave të ndërtuara në një feed privat në Azure DevOps,
- ndërtimin e dokumentacionit dhe publikimin në GitLab Pages,
- badge!11
Kërkesat e përshkruara përshtaten organikisht me modelin e mëposhtëm të pipeline-it:
- Faza 1 — ndërtimi
- Ndërtojmë kodin, publikojmë skedarët e dalës si artefakte
- Faza 2 — testimi
- Marrim artefaktet nga faza e ndërtimit, ekzekutojmë testet, grumbullojmë të dhënat e mbulimit të kodit
- Faza 3 — dërgimi
- Detyra 1 — ndërtojmë një paketë nuget dhe dërgojmë në Azure DevOps
- Detyra 2 — ndërtojmë një site nga xmldoc në kodin burimor dhe publikojmë në GitLab Pages
Le të fillojmë!
Dërgojmë konfiguracionin
Përgatitim llogaritë
Krijojmë një llogari në
Kalojmë te
Krijojmë një projekt të ri
- Emri — çfarëdo
- Dukshmëria — çfarëdo

Kur të klikoni butonin Create projekti do të krijohet dhe do të kaloni në faqen e tij. Në këtë faqe mund të çaktivizoni mundësitë e panevojshme, duke shkuar në konfigurimet e projektit (lidhja e poshtme në listën e majtë -> Overview -> blloku i Shërbimeve Azure DevOps)

Shkojmë në Atrifacts, klikojmë Create feed
- Shkruajmë emrin e burimit
- Zgjidhim dukshmërinë
- Çaktivizojmë kutinë Përfshij paketat nga burime publike të zakonshme, në mënyrë që burimi të mos shndërrohet në një plehrash nën klonimin e nuget

Klikojmë Connect to feed, zgjidhim Visual Studio, nga blloku Machine Setup kopjojmë Source

Shkojmë në konfigurimet e llogarisë, zgjidhim Personal Access Token

Krijojmë një token të ri akses
- Emri — i rastësishëm
- Organizata — aktuale
- Afati i skadimit — maksimumi 1 vit
- Fusha e veprimit (scope) — Packaging/Read & Write

Kopjojmë tokenin e krijuar — pas mbylljes së dritares modale vlera nuk do të jetë e disponueshme
Hynë në konfigurimet e depozitës në GitLab, zgjidhni konfigurimet CI/CD

Zgjerojmë bllokun Variables, shtojmë një të re
- Emri — çfarëdo pa hapësira (do të jetë i disponueshëm në shell-in komandor)
- Vlera — tokeni i aksesit nga pika 9
- Zgjidhni Mask variable

Kjo është përfundimi i konfigurimit paraprak.
Përgatitim skeletin e konfigurimit
Sipas parazgjedhjes, për konfigurimin CI/CD në GitLab përdoret skedari .gitlab-ci.yml nga rrënja e depozitës. Mund të konfiguroni një rrugë të rastësishme deri në këtë skedar në konfigurimet e depozitës, por në këtë rast nuk është e nevojshme.
Siç duket nga shtesat, skedari përmban konfigurimin në formatin YAML. Dokumentacioni përshkruan hollësisht se cilat çelësa mund të jenë të pranishëm në nivelin e lartë të konfigurimit dhe në secilin nga nivelet e brendshme.
Fillohet duke shtuar në skedarin e konfigurimit një lidhje me imazhin docker, në të cilin do të realizohen detyrat. Për këtë, gjejmë . Në ka një udhëzues të hollësishëm se cili imazh të zgjidhet për detyra të ndryshme. Për ndërtimin, na përshtatet imazhi me .Net Core 3.1, prandaj e shtojmë guximshëm si rreshtin e parë në konfigurim
image: mcr.microsoft.com/dotnet/core/sdk:3.1Tani, kur startohet pipeline nga depoja e imazheve Microsoft, do të shkarkohet imazhi i caktuar, në të cilin do të realizohen të gjitha detyrat nga konfigurimi.
Hapi tjetër — shtoni ) — një njësi organizimi e pipeline-it, përmban 1+ detyrë,‘ë. Sipas parazgjedhjes, GitLab përcakton 5 etapa:
.pre— kryhet para të gjitha etapave,.post— kryhet pas të gjitha etapave,build— e para pas.preetapës,test— etapa e dytë,deploy— etapa e tretë.
Nuk ka asgjë që ndalon shprehjen e tyre qartësisht, megjithatë. Renditja në të cilën përmenden etapet ndikon në renditjen e ekzekutimit të tyre. Për plotësinë e përshkrimit, do të shtojmë në konfigurim:
stages:
- build
- test
- deployPër debug, ka kuptim të merren informacion mbi mjedisin ku realizohen detyrat. Shtojmë një grup global komandash, që do të kryhen përpara çdo detyre, me anë të before_script:
before_script:
- $PSVersionTable.PSVersion
- dotnet --version
- nuget help | select-string VersionKa mbetur të shtojmë të paktën një detyrë, që kur dërgohen komitetet, pipeline të startohet. Deri tani, do të shtojmë një detyrë të zbrazët për demonstrim:
dummy job:
script:
- echo okNisimë validimin, marrim një mesazh që gjithçka është mirë, komitojmë, e dërgojmë, shohim rezultatet në faqe... Dhe marrim një gabim në skriptë — bash: .PSVersion: komanda nuk u gjet. Çfarë ndodhi?
E gjitha ka kuptim — për default, runner'ët (të cilët janë përgjegjës për ekzekutimin e skripteve të detyrave dhe ofrohen nga GitLab) përdorin bash për ekzekutimin e komandave. Mund ta rregullojmë këtë duke specifikuar qartë në përshkrimin e detyrës, cilat etiketa duhet të ketë runner’i që ekzekuton pipeline-in:
detyrë dummy në windows:
skript:
- echo ok
etiketa:
- windowsSuper! Tani pipeline-i po ekzekutohet.
Lexuesi i kujdesshëm, duke përsëritur hapat e përmendur, do të vërejë se detyra u ekzekutua në fazën test, megjithëse ne nuk e caktuam ndonjë fazë. Siç mund të merret me mend, test është faza e default.
Të vazhdojmë me krijimin e skeletit të konfiguracionit, duke shtuar të gjitha detyrat e përshkruara më lart:
detyrë ndërtimi:
skript:
- echo "ndërto..."
etiketa:
- windows
faza: ndërtim
testim dhe mbulim:
skript:
- echo "duke ekzekutuar testet dhe analizën e mbulimit..."
etiketa:
- windows
faza: testim
paketim dhe dërgim:
skript:
- echo "duke paketa dhe dërguar në nuget..."
etiketa:
- windows
faza: dërgim
faqet:
skript:
- echo "duke krijuar dokumente..."
etiketa:
- windows
faza: dërgimMora një pipeline që nuk është shumë funksional, por megjithatë korrekt.
Konfigurimi i triggereve
Për shkak se për asnjë nga detyrat nuk janë specifikuar filtrat e aktivizimit, pipeline do të plotësisht ekzekutohet me çdo dërgesë komit në republikë. Duke qenë se kjo nuk është një sjellje e dëshiruar në përgjithësi, ne do të konfigurim filtrat e aktivizimit për detyrat.
Filtrat mund të konfiguroren në dy formate: dhe . Në përmbledhje, vetëm/pa lejon konfigurimin e filtrave sipas triggereve (merge_request, për shembull — konfigurimi i detyrës për t'u ekzekutuar për çdo krijim të një kërkese për bashkim dhe për çdo dërgesë komitesh në degën që është burimi në kërkesën për bashkim) dhe emrat e degëve (përfshirë përdorimin e shprehjeve regula); rregullat lejon konfigurimin e një grupi kushtesh dhe, opsionalisht, ndryshimin e kushtit të ekzekutimit të detyrës sipas suksesit të detyrave të mëparshme ().
Le të rikujtojmë setin e kërkesave — ndërtimi dhe testimi vetëm për merge request, paketimi dhe dërgimi në Azure DevOps — për merge request dhe dërgimet në master, gjenerimi i dokumentacionit — për dërgimet në master.
Për të filluar, do të konfiguroni detyrën e ndërtimit të kodit, duke shtuar një rregull aktivizimi vetëm për merge request:
detyrë ndërtimi:
# snip
vetëm:
- merge_requestTani do të konfigurojmë detyrën e paketimit për t'u aktivizuar në merge request dhe shtimin e komiteteve në master:
pakuar dhe instalo punën:
# snip
vetëm:
- kërkesë bashkimi
- masterSiç duket, gjithçka është e thjeshtë dhe e drejtpërdrejtë.
gjithashtu mund të konfigurohet detyra për të u aktivizuar vetëm nëse është krijuar një kërkesë bashkimi me një degë të caktuar target ose fillestare:
rregulla:
- nëse: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"Në kushtet mund të përdoren ; rregullat rregullat nuk janë të përputhshme me rregullat vetëm/pa.
Konfigurimi i ruajtjes së artefakteve
Gjatë ekzekutimit të detyrës punë ndërtimi do të krijojmë artefakte ndërtimi, të cilat mund të ripërdoren në detyra të ardhshme. Për këtë, ne duhet të shtojmë në konfigurimin e detyrës rrugët, skedarët që duhen ruajtur dhe ripërdorur në detyrat e ardhshme, në çelësin :
punë ndërtimi:
# snip
artefakte:
rrugë:
- path/to/build/artifacts
- another/path
- MyCoolLib.*/bin/Release/*Rrugët mbështesin wildcards, që me siguri e thjeshton përcaktimin e tyre.
Nëse detyra krijon artefakte, atëherë çdo detyrë e ardhshme do të mund ti qasje — ato do të vendosen në të njëjtat rrugë në raport me rrënjën e depozitës, siç u krijuan nga detyra fillestare. Gjithashtu, artefaktet janë të disponueshme për shkarkim në sit.
Tani, kur kemi përgatitur (dhe verifikuar) skeletin e konfiguracionit, mund të kalojmë në faktin e shkruar të skriptet për detyrat.
Shkruajmë skriptet
Mund të ketë qenë dikur, në një galaksi të largët, ndërtimi i projekteve (përfshirë edhe në .net) nga linja e komandës ishte një dhimbje. Tani, mund ta ndërtojmë, testojmë dhe publikojmë projektin me 3 komanda:
dotnet build
dotnet test
dotnet packNatyrisht, ka disa nuanca që na bëjnë t'i komplikojmë disi komandat.
- Ne duam një ndërtim për lëshim, e jo ndërtim për debugging, prandaj në çdo komandë shtojmë
-c Release - Gjatë testimit, ne duam të grumbullojmë të dhëna për mbulimin e kodit, prandaj do të duhet të lidhim analizuesin e mbulimit në bibliotekat testuese:
- Çdo bibliotekë testuese duhet të shtojë paketën
coverlet.msbuild:dotnet add package coverlet.msbuildnga folderi i projektit - Në komandën e ekzekutimit të testeve do të shtojmë
/p:CollectCoverage=true - Në konfigurimin e detyrës së testimit do të shtojmë një çelës për të marrë rezultatet e mbulimit (shih më poshtë)
- Çdo bibliotekë testuese duhet të shtojë paketën
- Kur paketojmë kodin në paketa nuget, do të përcaktojmë drejtorinë e daljes për paketat:
-o .
Grumbullimi i të dhënave për mbulimin e kodit
Coverlet pas ekzekutimit të testeve nxjerr në konsolë statistikat mbi ekzekutimin:
Duke rezultatet e mbulimit...
Duke gjeneruar raportin 'C:Usersxxxsourcereposmy-projectmyProject.testscoverage.json'
+-------------+--------+--------+--------+
| Moduli | Linja | Degë | Metoda |
+-------------+--------+--------+--------+
| projekti 1 | 83,24% | 66,66% | 92,1% |
+-------------+--------+--------+--------+
| projekti 2 | 87,5% | 50% | 100% |
+-------------+--------+--------+--------+
| projekti 3 | 100% | 83,33% | 100% |
+-------------+--------+--------+--------+
+---------+--------+--------+--------+
| | Linja | Degë | Metoda |
+---------+--------+--------+--------+
| Totali | 84,27% | 65,76% | 92,94% |
+---------+--------+--------+--------+
| Mesatarja | 90,24% | 66,66% | 97,36% |
+---------+--------+--------+--------+GitLab lejon të specifikoni një shprehje të rregullt për të marrë statistika, të cilat mund të merren pastaj në formën e një badge. Shprehja e rregullt jepet në cilësimet e detyrës me çelësin coverage; në shprehje duhet të jetë e pranishme një grup kaptejnë, vlera e të cilit do të kalojë në badge:
test and cover job:
# snip
coverage: \/|s*Totals*|s*(d+[,.]d+%)\/Këtu ne marrim statistika nga rreshti me mbulimin total për linjat.
Publikojmë paketat dhe dokumentacionin
Të dyja veprimet janë caktuar në etapën e fundit të pipeline-it — për sa kohë që ndërtimi dhe testet kaluan, mund të ndajmë edhe punimet me botën.
Së pari, le të shqyrtojmë publikimin në burimin e paketave:
Nëse projekti nuk ka një skedar konfigurimi nuget (
nuget.config), le të krijojmë një të ri:dotnet new nugetconfigPse: në imazh mund të jetë e ndaluar qasja në përgjithësi në konfigurimet globale (të përdoruesit dhe të makinës). Për të mos kapur gabime, le të krijojmë një konfigurim lokal të ri dhe të punojmë me të.
- Le të shtojmë në konfigurimin lokal një burim të ri paketash:
nuget sources add -name <name> -source <url> -username <organization> -password <gitlab variable> -configfile nuget.config -StorePasswordInClearTextemri— emri lokal i burimit, nuk ka rëndësiurl— URL e burimit nga etapa "Përgatitja e llogarive", p. 6organization— emri i organizatës në Azure DevOpsgitlab variable— emri i variablës me tokenin e qasjes, e shtuar në GitLab ("Përgatitja e llogarive", p. 11). Natyrisht, në formatin$variableName-StorePasswordInClearText— hack për të anashkaluar gabimin e refuzimit të qasjes ()- Në rast të gabimeve, mund të jetë e dobishme të shtoni
-verbosity detailed
- Dërgo paketën në burimin:
nuget push -source <name> -skipduplicate -apikey <key> *.nupkg- Dërgojmë të gjitha paketat nga direktoria aktuale, kështu që
*.nupkg. emri— nga hapi më sipër.key— çdo varg. Në Azure DevOps në dritaren Connect to feed gjithmonë japin si shembull vargunaz.-skipduplicate— kur përpjekjen për të dërguar një paketë ekzistuese pa këtë çelës, burimi do të kthejë një gabim409 Konflikt; me çelësin dërgimi do të përjashtohet.
- Dërgojmë të gjitha paketat nga direktoria aktuale, kështu që
Tani do të konfigurojmë krijimin e dokumentacionit:
- Së pari, në depo, në degën master, inicializojmë projektin docfx. Për këtë, nga rrënja duhet të ekzekutojmë komandën
docfx initdhe në mënyrë interaktive të vendosim parametrat kyç për ndërtimin e dokumentacionit. Një përshkrim i detajuar i konfigurimit minimal të projektit .- Kur bëni konfigurimin, është e rëndësishme të tregoni direktorine e daljes
..public— GitLab për default merr përmbajtjen e dosjes public në rrënjën e depozitës si burim për Pages. Për shkak se projekti do të jetë në një dosje të brendshme të depozites — shtojmë në rrugë të daljes një nivel lart.
- Kur bëni konfigurimin, është e rëndësishme të tregoni direktorine e daljes
- Do të dërgojmë ndryshimet në GitLab.
- Në konfigurimin e pipeline-it do të shtojmë një detyrë
pages(fjalë e rezervuar për detyrat e publikimit të faqeve në GitLab Pages):- Skema:
nuget install docfx.console -version 2.51.0— do të instalojë docfx; versioni është i caktuar për garancinë e saktësisë së rrugëve të instalimit të paketës..docfx.console.2.51.0toolsdocfx.exe .docfx_projectdocfx.json— mbledhim dokumentacionin
- Nod arti:
- Skema:
pages:
# snip
artifacts:
paths:
- publicNjë shpjegim letrar për docfx
Më herët, kur konfiguroja projektin, unë caktova burimin e kodit për dokumentacionin si një skedar zgjidhje. Disavantazhi kryesor — dokumentacioni krijohet edhe për projektet testuese. Nëse kjo nuk është e nevojshme, mund të caktosh një vlerë të tillë nodit metadata.src:
{
"metadata": [
{
"src": [
{
"src": "..\/",
"files": [
"**\/*.csproj"
],
"exclude":[
"*.tests*\/**"
]
}
],
// --- snip ---
},
// --- snip ---
],
// --- snip ---
}metadata.src.src: "..\/"— dalim një nivel lart në raport me vendndodhjendocfx.json, për shkak se në modele nuk punon kërkimi lart në pemën e direktorive.metadata.src.files: ["**\/*.csproj"]— model global, mbledhim të gjitha projektet C# nga të gjitha direktorive.metadata.src.exclude: ["*.tests*\/**"]— model global, përjashtojmë gjithçka nga dosjet me.testsnë emër
Përfundimi mesatar
Një konfigurim kaq të thjeshtë mund ta hartosh dosido brenda gjysmë ore dhe një apo dy filxhanë kafe, i cili do të lejojë që për çdo kërkesë të bashkimit dhe dërgimi në master të kontrollohet se kodi ndërtohet dhe testet kalojnë, të mbledhim një paketë të re, të përditësojmë dokumentacionin dhe të kënaqim syrin me simbolika të bukura në README të projektit.
Përfundimi .gitlab-ci.yml
imazhi: mcr.microsoft.com/dotnet/core/sdk:3.1
para_script:
- $PSVersionTable.PSVersion
- dotnet --version
- nuget help | select-string Version
stadet:
- ndërtim
- test
- deploy
punët e ndërtimit:
stad: ndërtim
skript:
- dotnet build -c Release
etiketat:
- windows
vetëm:
- merge_requests
- master
artefakte:
rrugët:
- your/path/to/binaries
testimi dhe puna e mbulimit:
stad: test
etiketat:
- windows
skript:
- dotnet test -c Release /p:CollectCoverage=true
mbulimi: /|s*Totals*|s*(d+[,.]d+%) /
vetëm:
- merge_requests
- master
paketa dhe punët e dërgimit:
stad: deploy
etiketat:
- windows
skript:
- 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
vetëm:
- master
faqet:
etiketat:
- windows
stad: deploy
skript:
- nuget install docfx.console -version 2.51.0
- $env:path = "$env:path;$($(get-location).Path)"
- .docfx.console.2.51.0toolsdocfx.exe .docfxdocfx.json
artefakte:
rrugët:
- public
vetëm:
- masterPërveç atyre badges
Pikërisht për këtë gjithçka është planifikuar!
Badges me statuset e pipeline dhe mbulimin e kodit janë të disponueshme në GitLab në cilësimet CI/CD në bllokun e Pipeline-ve:

Badges me lidhjen në dokumentacion e kam krijuar në platformën — atje është mjaft e drejtpërdrejtë, mund të krijosh një badge tënden dhe ta marrësh atë përmes një kërkese.

Azure DevOps Artifacts gjithashtu lejon krijimin e badges për paketat me specifikimin e versionit aktual. Për këtë, në burimin e faqes Azure DevOps duhet të klikosh në Create badge për paketën e zgjedhur dhe të kopjosh markdown-in:


Shtojmë bukuri
Dallohemi fragmente të zakonshme të konfigurimit
Gjatë shkruarjes së konfigurimit dhe kërkimeve në dokumentacion, kam hasur një mundësi interesante YAML — rishfrytëzimin e fragmenteve.
Siç shihet nga cilësimet e detyrave, të gjitha kërkojnë një tag windows në runner dhe funksionojnë kur dërgohet në master/krijohet një kërkesë për bashkim (përveç dokumentacionit). Ta shtojmë këtë në fragmentin që do të rishfrytëzojmë:
.common_tags: &common_tags
tags:
- windows
.common_only: &common_only
vetëm:
- merge_requests
- masterDhe tani në përshkrimin e detyrës mund të inserojmë fragmentin e shpallur më parë:
punët e ndërtimit:
<<: *common_tags
<<: *common_onlyEmrat e fragmenteve duhet të fillojnë me pikë, në mënyrë që të mos interpretohen si detyra.
Versionimi i paketave
Kur krijohet një paketë, kompajleri kontrollon çelësat e komandës dhe, në mungesë të tyre, skedarët e projekteve; duke gjetur nyjën Version, ai e merr vlerën e saj si versionin e paketës që po krijohet. Pra, për të ndërtuar një paketë me një version të ri, duhet ose ta përditësojmë atë në skedarin e projektit, ose ta kalojmë si një argument të komandës.
Të shtojmë një dëshirë tjetër — le të jenë dy numrat më të ulët në version vitin dhe datën e ndërtimit të paketës, dhe të shtojmë versionet para-lançimit. Sigurisht që mund t'i shtojmë këto të dhëna në skedarin e projektit dhe t'i kontrollojmë para secilës dorëzim — por mund ta bëjmë edhe në pipeline, duke e ndërtuar versionin e paketës nga konteksti dhe duke e kaluar përmes një argumenti të komandës.
Le të dakordohemi se, nëse në mesazhin e commit-it ka një varg si release (v. /ver./version) <version number> (rev./revision <revision>)?, atëherë ne do ta marrim versionin e paketës nga ky varg, do ta plotësojmë me datën aktuale dhe do ta kalojmë si një argument për komandën dotnet pack. Në mungesë të vargut — thjesht nuk do ta ndërtoshim paketën.
Ky problem zgjidhet nga skripti i mëposhtëm:
# регулярное выражение для поиска строки с версией
$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=$versionShtojmë skriptin në detyrën pack and deploy job dhe vëzhgojmë ndërtimin e pakove vetëm nëse ka një varg të caktuar në mesazhin e commit-it.
Përveç kësaj
Pas rreth gjysmë ore deri në një orë kohë të kaluar në shkruarjen e konfiguracionit, debagimin në powershell lokal dhe, ndoshta, disa ekzekutimeve pa sukses, morëm një konfiguracion të thjeshtë për automatizimin e detyrave rutinë.
Sigurisht, GitLab CI/CD është shumë më i gjerë dhe më kompleks se sa mund të duket pas leximit të këtij udhëzuesi — . Aty madje , që lejon
automatically detect, build, test, deploy, and monitor your applications
Tani në planet — të konfigurojmë pipeline për shpërndarjen e aplikacioneve në Azure, duke përdorur Pulumi dhe automatikisht duke e përcaktuar ambientin e synuar, që do të përshkruhet në artikullin e ardhshëm.
Burimi: habr.com








