Pandhuan CI / CD ing GitLab kanggo (Meh) Newbie Absolute
Utawa carane entuk lencana sing apik kanggo proyek sampeyan ing sawijining sore coding santai
Mbokmenawa, saben pangembang sing duwe paling ora siji proyek pet ing sawetara titik duwe gatel kanggo lencana ayu karo status, jangkoan kode, versi paket ing nuget ... Lan gatel iki mimpin kula kanggo nulis artikel iki. Ing proses nyiapake kanggo nulis, aku entuk kaendahan iki ing salah sawijining proyekku:
Artikel iki bakal nutupi persiyapan dhasar integrasi terus-terusan lan pangiriman kanggo proyek perpustakaan kelas .Net Core ing GitLab, nerbitake dokumentasi menyang GitLab Pages lan ngirim paket sing diklumpukake menyang feed pribadi ing Azure DevOps.
Kode VS kanthi ekstensi digunakake minangka lingkungan pangembangan Alur Kerja GitLab (kanggo validasi file setelan langsung saka lingkungan pangembangan).
Pambuka Ringkes
CD nalika sampeyan mung push, nanging klien wis ilang kabeh?
pangembang ngirim komitmen menyang repositori, nggawe panjalukan gabungan liwat situs web, utawa kanthi cara liya kanthi eksplisit utawa implisit ngluncurake pipa kasebut,
saka konfigurasi, kabeh tugas dipilih sing kondisine ngidini diluncurake ing konteks tartamtu,
tugas diatur miturut tahapan,
tataran kaleksanan ing siji - i.e. podo karo kabeh tugas ing tahap iki wis rampung,
yen tataran gagal (yaiku paling ora salah sawijining tugas panggung gagal) - saluran pipa mandheg (meh tansah),
yen kabeh tahapan rampung kanthi sukses, pipa kasebut dianggep sukses.
Mangkono kita duwe:
pipeline minangka seperangkat tugas sing diatur dadi tahapan sing sampeyan bisa ngumpul, nyoba, kode paket, masang perakitan sing wis rampung menyang layanan awan, lsp.
panggung (panggung) - unit organisasi pipa, ngemot 1+ tugas,
tugas (proyek) minangka unit kerja ing pipa. Kasedhiya saka skrip (dibutuhake), kahanan peluncuran, setelan kanggo nerbitake / artefak cache lan liya-liyane.
Amarga nalika perlu nggawe repositori pribadi kanggo proyek pet, dheweke dibayar ing GitHub, lan aku rakus. Repositori wis dadi gratis, nanging saiki iki dudu alesan sing cukup kanggo aku pindhah menyang GitHub.
Napa ora Azure DevOps Pipelines?
Amarga persiyapan iku prasaja - sampeyan malah ora perlu kawruh baris printah. Integrasi karo panyedhiya git eksternal - ing sawetara klik, ngimpor kunci SSH kanggo ngirim komitmen menyang repositori - uga, pipa gampang dikonfigurasi sanajan tanpa cithakan.
Posisi wiwitan: apa sing sampeyan duwe lan apa sing dikarepake
Kita duwe:
repositori ing GitLab.
Kita pengin:
perakitan lan tes otomatis kanggo saben panyuwunan gabungan,
mbangun paket kanggo saben panjalukan gabungan lan push menyang master, yen ana baris tartamtu ing pesen komit,
ngirim paket sing diklumpukake menyang feed pribadi ing Azure DevOps,
perakitan dokumentasi lan publikasi ing GitLab Pages,
lencana!11
Keperluan sing diterangake pas karo model pipa ing ngisor iki:
Tahap 1 - perakitan
Kita ngumpulake kode kasebut, nerbitake file output minangka artefak
Tahap 2 - testing
Kita nampa artefak saka tataran mbangun, mbukak tes, ngumpulake data jangkoan kode
Tahap 3 - ngirim
Tugas 1 - ngumpulake paket nuget lan ngirim menyang Azure DevOps
Tugas 2 - kita ngumpulake situs saka xmldoc ing kode sumber lan nerbitake ing GitLab Pages
Nalika sampeyan ngeklik tombol Gawe, proyek bakal digawe lan sampeyan bakal digawa menyang kaca. Ing kaca iki, sampeyan bisa mateni fitur sing ora perlu kanthi pindhah menyang setelan proyek (link ngisor ing dhaptar ing sisih kiwa -> Ringkesan -> Blok Layanan Azure DevOps)
Pindhah menyang Atrifacts, klik Gawe feed
Ketik jeneng sumber
Pilih visibilitas
Busak centhang ing kothak Kalebu paket saka sumber umum umumsupaya sumbere ora dadi tong sampah klon nuget
Klik Connect to feed, pilih Visual Studio, copy Source from the Machine Setup block
Pindhah menyang setelan akun, pilih Token Akses Pribadi
Nggawe token akses anyar
Jeneng - sewenang-wenang
Organisasi - saiki
Periode validitas: maksimal 1 taun
Lingkup - Packaging / Waca & Nulis
Salin token sing digawe - sawise nutup jendhela modal Nilai ora bakal kasedhiya
Pindhah menyang setelan repositori ing GitLab, pilih setelan CI/CD
Nggedhekake blok Variabel lan tambahake sing anyar
Jeneng - sembarang tanpa spasi (bakal kasedhiya ing cangkang printah)
Nilai minangka token akses saka langkah 9
Pilih variabel Mask
Iki ngrampungake persiyapan awal.
Nyiapake kerangka konfigurasi
Secara default, file sing digunakake kanggo ngatur CI/CD ing GitLab yaiku .gitlab-ci.yml saka oyod gudang. Sampeyan bisa ngatur path khusus kanggo file iki ing setelan gudang, nanging ing kasus iki ora perlu.
Pisanan, ayo nambah link menyang file konfigurasi menyang gambar docker ing ngendi tugas bakal dieksekusi. Kanggo nindakake iki kita temokake Kaca gambar .Net Core ing Docker Hub. ing GitHub Ana pandhuan rinci babagan gambar sing kudu dipilih kanggo macem-macem tugas. Gambar karo .Net Core 3.1 cocok kanggo kita mbangun, mula aja ragu-ragu nambahake minangka baris pisanan ing konfigurasi.
image: mcr.microsoft.com/dotnet/core/sdk:3.1
Saiki, nalika sampeyan miwiti pipeline, gambar sing ditemtokake bakal diundhuh saka repositori gambar Microsoft, ing ngendi kabeh tugas saka konfigurasi bakal dieksekusi.
Langkah sabanjure kanggo nambah panggung's. Kanthi gawan, GitLab nemtokake 5 tahapan:
.pre - ditindakake ing kabeh tahapan,
.post - ditindakake sawise kabeh tahapan,
build - pisanan sawise .pre panggung,
test - fase kapindho,
deploy - tataran katelu.
Nanging, ora ana sing ngalangi sampeyan nyatakake kanthi jelas. Urutan langkah-langkah sing kadhaptar mengaruhi urutan sing wis rampung. Kanggo jangkep, ayo ditambahake menyang konfigurasi:
stages:
- build
- test
- deploy
Kanggo debugging, entuk informasi babagan lingkungan sing ditindakake tugas. Ayo dadi nambah pesawat global printah sing bakal kaleksanan sadurunge saben tugas nggunakake before_script:
before_script:
- $PSVersionTable.PSVersion
- dotnet --version
- nuget help | select-string Version
Sampeyan kudu nambah paling ora siji tugas supaya nalika komit dikirim, pipa bakal diwiwiti. Saiki, ayo nambah tugas kosong kanggo demonstrasi:
dummy job:
script:
- echo ok
Kita miwiti validasi, entuk pesen yen kabeh apik, tundhuk, push, deleng asil ing situs ... Lan kita entuk kesalahan skrip - bash: .PSVersion: command not found. WTF?
dummy job on windows:
script:
- echo ok
tags:
- windows
apik tenan! Pipa saiki mlaku.
Sing maca enten, mbaleni langkah-langkah iki, bakal weruh yen tugas wis rampung ing tataran test, sanajan kita ora nemtokake panggung. Kaya sing sampeyan duga, test iku langkah gawan.
Ayo terus nggawe kerangka konfigurasi kanthi nambahake kabeh tugas sing diterangake ing ndhuwur:
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
Kita entuk pipa sing ora fungsional, nanging bener.
Nyetel pemicu
Amarga kasunyatan manawa ora ana saringan pemicu sing ditemtokake kanggo tugas apa wae, saluran pipa bakal kanthi dieksekusi saben wektu commit dikirim menyang repositori. Amarga iki dudu prilaku sing dikarepake ing umum, kita bakal ngatur saringan pemicu kanggo tugas.
Filter bisa diatur ing rong format: mung / kajaba ΠΈ aturan. Cekakipun, only/except ngidini sampeyan ngatur saringan kanthi pemicu (merge_request, contone - ngatur tugas sing bakal dileksanakake saben-saben panjalukan gabungan digawe lan saben-saben komit dikirim menyang cabang sing dadi sumber ing panyuwunan gabung) lan jeneng cabang (kalebu nggunakake ekspresi biasa); rules ngidini sampeyan ngatur sakumpulan kahanan lan, kanthi opsional, ngganti kahanan eksekusi tugas gumantung saka sukses tugas sadurunge (when ing GitLab CI/CD).
Ayo dadi elinga pesawat saka syarat - perakitan lan testing mung kanggo gabung panjalukan, packaging lan ngirim kanggo Azure DevOps - kanggo gabung panjalukan lan push kanggo master, generasi dokumentasi - kanggo push kanggo master.
Pisanan, ayo nyiyapake tugas perakitan kode kanthi nambahake aturan pemicu sing mung nyebabake panyuwunan gabungan:
build job:
# snip
only:
- merge_request
Saiki ayo ngatur tugas kemasan kanggo micu panyuwunan gabungan lan nambah komitmen menyang master:
Nalika tugas lagi mlaku build job kita bakal nggawe artefak digawe sing bisa digunakake maneh ing tugas sakteruse. Kanggo nindakake iki, sampeyan kudu nambah dalan menyang konfigurasi tugas, file sing kudu disimpen lan digunakake maneh ing tugas sabanjure, menyang tombol. artifacts:
Paths ndhukung wildcards, kang temtunipun nggampangake kanggo nyetel.
Yen tugas nggawe artefak, banjur saben tugas sakteruse bakal bisa ngakses - padha bakal dumunung ing sadawane dalan padha relatif kanggo ROOT gudang kang padha diklumpukake saka tugas asli. Artefak uga kasedhiya kanggo diundhuh ing situs web.
Saiki kita duwe kerangka konfigurasi sing siap (lan diverifikasi), kita bisa nerusake nulis skrip kanggo tugas.
Kita nulis skrip
Mbok menawa, biyen, ing galaksi sing adoh, adoh banget, mbangun proyek (kalebu .net) saka baris printah iku rasa sakit. Saiki sampeyan bisa ngumpul, nguji lan nerbitake proyek kasebut ing 3 tim:
dotnet build
dotnet test
dotnet pack
Alami, ana sawetara nuansa amarga kita bakal nggawe rumit perintah kasebut.
Kita pengin release, ora debug, mbangun, supaya kita nambah kanggo saben printah -c Release
Nalika nyoba, kita pengin ngumpulake data babagan jangkoan kode, mula kita kudu nyambungake penganalisa jangkoan menyang perpustakaan tes:
Paket kasebut kudu ditambahake menyang kabeh perpustakaan tes coverlet.msbuild: dotnet add package coverlet.msbuild saka folder proyek
Tambah menyang printah peluncuran test /p:CollectCoverage=true
Ayo nambahake kunci konfigurasi tugas testing kanggo entuk asil jangkoan (ndeleng ngisor)
Nalika ngemas kode menyang paket nuget, kita bakal nyetel direktori output kanggo paket kasebut: -o .
Nglumpukake data jangkoan kode
Sawise nglakokake tes, Coverlet nampilake statistik peluncuran menyang konsol:
GitLab ngidini sampeyan nemtokake ekspresi reguler kanggo entuk statistik, sing banjur bisa dipikolehi ing bentuk lencana. Ekspresi reguler ditemtokake ing setelan tugas kanthi tombol coverage; ekspresi kasebut kudu ngemot klompok panangkepan, nilai sing bakal ditransfer menyang lencana:
test and cover job:
# snip
coverage: /|s*Totals*|s*(d+[,.]d+%)/
Ing kene kita entuk statistik saka garis kanthi jangkoan total kanthi garis.
Kita nerbitake paket lan dokumentasi
Kita duwe loro tumindak sing ditugasake ing tahap pungkasan pipa - amarga perakitan lan tes wis liwati, kita bisa nuduhake pangembangan kita karo jagad iki.
Pisanan, ayo goleki nerbitake menyang sumber paket:
Yen proyek ora duwe file konfigurasi nuget (nuget.config), gawe anyar: dotnet new nugetconfig
Kanggo apa: Gambar kasebut bisa uga ora duwe akses nulis menyang konfigurasi global (pangguna lan mesin). Supaya ora nyekel kesalahan, kita mung bakal nggawe konfigurasi lokal anyar lan nggarap.
Ayo nambah sumber paket anyar menyang konfigurasi lokal: nuget sources add -name <name> -source <url> -username <organization> -password <gitlab variable> -configfile nuget.config -StorePasswordInClearText
name - jeneng sumber lokal, ora penting
url - URL sumber saka tahap "Nyiyapake akun", langkah 6
organization - jeneng organisasi ing Azure DevOps
gitlab variable - jeneng variabel kanthi token akses sing ditambahake menyang GitLab ("Nyiyapake akun", p. 11). Alamiah, ing format $variableName
Yen ana kesalahan, bisa uga migunani kanggo nambah -verbosity detailed
Kita ngirim paket menyang sumber: nuget push -source <name> -skipduplicate -apikey <key> *.nupkg
Kita ngirim kabeh paket saka direktori saiki, supaya *.nupkg.
name - saka langkah ing ndhuwur.
key - sembarang baris. Ing Azure DevOps, ing Connect to feed jendhela, baris conto tansah az.
-skipduplicate - yen sampeyan nyoba ngirim paket sing wis ana tanpa tombol iki, sumber bakal ngasilake kesalahan 409 Conflict; karo tombol, ngirim bakal dilewati.
Saiki ayo nyiyapake nggawe dokumentasi:
Kanggo miwiti, ing repositori, ing cabang master, kita miwiti proyek docfx. Kanggo nindakake iki, sampeyan kudu mbukak printah saka ROOT docfx init lan interaktif nyetel paramèter tombol kanggo ngrakit dokumentasi. Katrangan rinci babagan persiyapan proyek minimal kene.
Sadurunge, nalika nyiyapake proyek, aku nemtokake sumber kode kanggo dokumentasi minangka file solusi. Kerugian utama yaiku dokumentasi uga digawe kanggo proyek uji coba. Yen iki ora perlu, sampeyan bisa nyetel nilai iki kanggo simpul metadata.src:
metadata.src.src: "../" - pindhah siji tingkat munggah relatif kanggo lokasi docfx.json, amarga Nggoleki wit direktori ora bisa digunakake ing pola.
metadata.src.files: ["**/*.csproj"] - pola global, kita ngumpulake kabeh proyek C # saka kabeh direktori.
metadata.src.exclude: ["*.tests*/**"] - pola global, ngilangi kabeh saka folder karo .tests Ing judhul
Subtotal
Konfigurasi prasaja iki bisa digawe kanthi harfiah setengah jam lan sawetara cangkir kopi, sing bakal ngidini sampeyan mriksa saben panyuwunan gabungan lan ngirim menyang master yen kode kasebut dibangun lan tes wis rampung, ngumpulake anyar. paket, nganyari dokumentasi lan nyenengake mripat karo lencana ayu ing README project.
Final .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
Ngomong babagan lencana
Iku kanggo wong-wong mau kabeh diwiwiti!
Lencana kanthi status pipa lan jangkoan kode kasedhiya ing GitLab ing setelan CI/CD ing blok pipa Gtntral:
Aku nggawe badge karo link menyang dokumentasi ing platform Shields.io - kabeh iku cukup suta ana, sampeyan bisa nggawe badge dhewe lan nampa nggunakake panjalukan.
Azure DevOps Artefak uga ngidini sampeyan nggawe lencana kanggo paket sing nuduhake versi paling anyar. Kanggo nindakake iki, ing sumber ing situs web Azure DevOps, sampeyan kudu ngeklik Gawe badge kanggo paket sing dipilih lan nyalin markup markup:
Nambah kaendahan
Kita nyorot fragmen konfigurasi umum
Nalika nulis konfigurasi lan nelusuri dokumentasi, aku nemokake fitur YAML sing menarik - nggunakake pecahan maneh.
Nalika sampeyan bisa ndeleng saka setelan tugas, kabeh padha mbutuhake tag windows saka runner, lan micu nalika ngirim panjalukan gabungan kanggo master / nggawe request gabungan (kajaba dokumentasi). Ayo ditambahake menyang fragmen sing bakal digunakake maneh:
Lan saiki kita bisa nglebokake fragmen sing diumumake sadurunge menyang deskripsi tugas:
build job:
<<: *common_tags
<<: *common_only
Jeneng fragmen kudu diwiwiti kanthi titik supaya ora diinterpretasikake minangka tugas.
Versi paket
Nalika nggawe paket, kompiler mriksa saklar baris perintah, lan yen ora ana, file proyek; Sawise nemokake simpul Versi, njupuk regane minangka versi paket sing dibangun. Pranyata supaya bisa mbangun paket karo versi anyar, sampeyan kudu salah siji nganyari ing file project utawa pass minangka argumen baris printah.
Ayo nambah siji pesenan maneh - supaya rong nomer paling murah ing versi dadi taun lan tanggal paket digawe, lan nambah versi prerelease. Mesthi wae, sampeyan bisa nambah data iki menyang file proyek lan mriksa sadurunge saben kiriman - nanging sampeyan uga bisa nindakake iki ing pipa, ngumpulake versi paket saka konteks lan ngliwati argumen baris perintah.
Ayo padha setuju yen pesen commit ngemot baris kaya release (v./ver./version) <version number> (rev./revision <revision>)?, banjur kita bakal njupuk versi paket saka baris iki, nambah karo tanggal saiki lan pass minangka argumen kanggo printah dotnet pack. Yen ora ana garis, kita mung ora bakal ngumpulake paket kasebut.
Sawise mbuwang kira-kira setengah jam nganti jam nulis konfigurasi, debugging ing powershell lokal lan, bisa uga, sawetara peluncuran sing ora sukses, kita nampa konfigurasi sing gampang kanggo ngotomatisasi tugas rutin.
Mesthine, GitLab CI/CD luwih akeh lan macem-macem tinimbang sing katon sawise maca pandhuan iki - iku ora bener. Malah ana Auto DevOps ya, ngidini
ndeteksi, mbangun, nyoba, nyebarake, lan ngawasi aplikasi sampeyan kanthi otomatis
Saiki rencana kanggo ngatur pipa kanggo nyebarake aplikasi ing Azure, nggunakake Pulumi lan kanthi otomatis ndeteksi lingkungan target, sing bakal dibahas ing artikel sabanjure.