Pituduh ka CI / CD di GitLab pikeun (ampir) pamula mutlak
Atanapi kumaha kéngingkeun lencana anu saé pikeun proyék anjeun dina hiji wengi coding anu gampang
Panginten, unggal pamekar anu ngagaduhan sahenteuna hiji proyék piaraan dina sababaraha waktos gaduh gatal-gatal ngeunaan lencana anu éndah kalayan status, sinyalna kode, versi pakét dina nuget ... Sareng gatal ieu nyababkeun kuring nyerat tulisan ieu. Dina préparasi nyeratna, kuring ngagaduhan kaéndahan ieu dina salah sahiji proyék kuring:
Artikel ieu bakal leumpang anjeun ngaliwatan setelan dasar integrasi kontinyu sarta pangiriman pikeun proyék perpustakaan kelas .Net Core di GitLab, dokuméntasi medarkeun ka GitLab Kaca, sarta ngadorong bungkusan diwangun kana feed swasta di Azure DevOps.
VS Code dianggo salaku lingkungan pangembangan kalayan ekstensi Alur Kerja GitLab (pikeun validasi file setelan langsung ti lingkungan ngembangkeun).
Bubuka singget
CD - éta mun anjeun ngan kadorong, sarta sagalana geus fallen on klien nu?
Naon CI / CD sareng kunaon anjeun peryogina - anjeun tiasa gampang google. Manggihan dokuméntasi lengkep dina ngonpigurasikeun pipelines di GitLab ogé gampang. Di dieu kuring bakal sakeudeung sareng, upami mungkin, tanpa cacad ngajelaskeun prosés sistem tina pandangan panon manuk:
pamekar ngirim komitmen ka Repository, nyiptakeun pamundut ngahiji ngaliwatan loka, atanapi ku cara anu sanés, sacara eksplisit atanapi implisit ngamimitian pipa,
sadaya tugas dipilih tina konfigurasi, kaayaan anu ngamungkinkeun aranjeunna diluncurkeun dina kontéks anu dipasihkeun,
tugas disusun dumasar kana tahap-tahapna,
tahapan anu dieksekusi dina gilirannana - i.e. sajajar Sadaya pancén dina tahap ieu parantos réngsé,
lamun panggung gagal (ie, sahenteuna salah sahiji tugas panggung gagal), pipa eureun (ampir salawasna),
lamun sagala tahapan geus réngsé junun, pipa dianggap suksés.
Ku kituna, urang boga:
pipeline - sakumpulan tugas anu dikelompokeun kana tahapan dimana anjeun tiasa ngawangun, nguji, kode pakét, nyebarkeun gedong anu réngsé kana jasa awan, jsb.,
panggung (panggung) - unit organisasi pipa, ngandung 1+ tugas,
tugas (tugas) nyaéta unit gawé dina pipa. Éta diwangun ku naskah (wajib), kaayaan peluncuran, setélan pikeun nyebarkeun/caching artefak, sareng seueur deui.
Sasuai, tugas nalika nyetél CI / CD turun pikeun nyiptakeun sakumpulan tugas anu ngalaksanakeun sagala tindakan anu dipikabutuh pikeun ngawangun, nguji sareng nyebarkeun kode sareng artefak.
Sateuacan ngamimitian: naha?
Naha Gitlab?
Kusabab nalika janten perlu nyieun repositories swasta pikeun proyék-proyék piaraan, maranéhanana dibayar dina GitHub, sarta kuring rakus. Repositories parantos bébas, tapi sajauh ieu sanés alesan anu cekap pikeun kuring ngalih ka GitHub.
Naha henteu Azure DevOps Pipelines?
Kusabab aya setelan dasar - pangaweruh ngeunaan garis paréntah malah teu diperlukeun. Integrasi sareng panyadia git éksternal - dina sababaraha klik, impor konci SSH pikeun ngirim komitmen ka gudang - ogé, pipa gampang dikonpigurasi sanajan henteu tina citakan.
Posisi awal: naon anu anjeun gaduh sareng naon anu anjeun pikahoyong
Kami gaduh:
gudang di GitLab.
Kami hoyong:
assembly otomatis tur nguji pikeun tiap pamundut ngagabung,
ngawangun bungkusan pikeun tiap ngahijikeun pamundut sareng ngadorong ka master, upami aya garis anu tangtu dina pesen komitmen,
ngirim bungkusan diwangun ka feed pribadi di Azure DevOps,
Majelis dokuméntasi sareng publikasi dina GitLab Pages,
lencana!11
Sarat anu dijelaskeun sacara organik digolongkeun kana modél pipa ieu:
Tahap 1 - assembly
Kami ngumpulkeun kodeu, nyebarkeun file kaluaran salaku artefak
Tahap 2 - nguji
Urang meunang artefak tina tahap ngawangun, ngajalankeun tés, ngumpulkeun data sinyalna kode
Tahap 3 - Nepikeun
Tugas 1 - ngawangun pakét nuget sareng kirimkeun ka Azure DevOps
Tugas 2 - urang ngumpulkeun situs ti xmldoc dina kode sumber sarta nyebarkeun eta dina GitLab Pages
Nalika anjeun ngaklik tombol Jieun, proyék bakal didamel sareng anjeun bakal dialihkeun ka halamanna. Dina halaman ieu, anjeun tiasa nganonaktipkeun fitur anu teu dipikabutuh ku jalan ka setélan proyék (link handap dina daptar di kénca -> Tinjauan -> Blok Azure DevOps Services)
Pindah ka Atrifacts, klik Jieun feed
Lebetkeun nami sumberna
Pilih visibilitas
Pupus centang Ngawengku bungkusan tina sumber umum umum, supaya sumberna teu robah jadi dump nuget clone
Klik Connect pikeun feed, pilih Visual Studio, nyalin Sumber tina blok Mesin Setup
Pindah ka setélan akun, pilih Token Aksés Pribadi
Jieun token aksés anyar
Ngaran - wenang
Organisasi - Ayeuna
Sah pikeun maksimal 1 taun
Lingkup - Bungkusan / Baca & Tulis
Salin token anu diciptakeun - sanggeus jandela modal ditutup, nilai bakal sadia
Pindah ka setélan gudang di GitLab, pilih setélan CI / CD
Kembangkeun blok Variabel, tambahkeun anu énggal
Ngaran - sagala tanpa spasi (bakal sadia dina cangkang paréntah)
Nilai - token aksés ti paragraf 9
Pilih variabel Topeng
Ieu ngalengkepan pra-konfigurasi.
Nyiapkeun kerangka konfigurasi
Sacara standar, konfigurasi CI/CD dina GitLab nganggo file .gitlab-ci.yml tina akar gudang. Anjeun tiasa nyetél jalur sawenang ka file ieu dina setélan Repository, tapi dina hal ieu teu perlu.
Sakumaha anjeun tiasa tingali tina extension, file ngandung konfigurasi dina format YAML. Rincian dokuméntasi mana konci anu tiasa dikandung dina tingkat luhur konfigurasi, sareng dina unggal tingkat anu disarangkeun.
Mimiti, hayu urang tambahkeun tautan kana gambar docker dina file konfigurasi, dimana tugasna bakal dilaksanakeun. Pikeun ieu kami manggihan Kaca gambar .Net Core on Docker Hub. The GitHub Aya pituduh anu lengkep ngeunaan gambar anu kedah dipilih pikeun tugas anu béda. Hiji gambar kalawan .Net Core 3.1 cocog pikeun urang ngawangun, jadi ngarasa Luncat pikeun nambahkeun baris kahiji kana konfigurasi.
image: mcr.microsoft.com/dotnet/core/sdk:3.1
Ayeuna, nalika jalur pipa diluncurkeun tina gudang gambar Microsoft, gambar anu ditangtukeun bakal diunduh, dimana sadaya pancén tina konfigurasi bakal dieksekusi.
Lengkah saterusna nyaéta nambahkeun panggungurang. Sacara standar, GitLab netepkeun 5 tahap:
.pre - dilaksanakeun nepi ka sadaya tahapan,
.post - dipigawé sanggeus sagala tahapan,
build - kahiji sanggeus .pre panggung,
test - fase kadua,
deploy - tahap katilu.
Henteu aya anu ngahalangan anjeun pikeun nyatakeun aranjeunna sacara eksplisit. Urutan léngkah-léngkah anu didaptarkeun mangaruhan kana urutan anu dilaksanakeun. Pikeun ngalengkepan, hayu urang tambahkeun kana konfigurasi:
stages:
- build
- test
- deploy
Pikeun debugging, masuk akal pikeun kéngingkeun inpormasi ngeunaan lingkungan dimana tugasna dilaksanakeun. Hayu urang tambahkeun hiji set global paréntah anu bakal dieksekusi saméméh unggal tugas kalawan before_script:
before_script:
- $PSVersionTable.PSVersion
- dotnet --version
- nuget help | select-string Version
Tetep nambihan sahenteuna hiji tugas supados nalika komitna dikirim, jalur pipa bakal ngamimitian. Pikeun ayeuna, hayu urang tambahkeun tugas kosong pikeun nunjukkeun:
dummy job:
script:
- echo ok
Kami ngamimitian validasi, kami nampi pesen yén sadayana henteu kunanaon, kami komitmen, kami nyorong, kami ningali hasil dina situs ... Sareng kami nampi kasalahan naskah - bash: .PSVersion: command not found. wtf?
Sagalana logis - sacara standar, runners (tanggung jawab pikeun ngalaksanakeun skrip tugas sareng disayogikeun ku GitLab) nganggo bash pikeun ngalaksanakeun paréntah. Anjeun tiasa ngalereskeun ieu ku netepkeun sacara eksplisit dina katerangan tugas naon tag anu kedah dipiboga ku runner pipeline:
dummy job on windows:
script:
- echo ok
tags:
- windows
Hebat! Pipa ayeuna jalan.
Pamaca anu ati-ati, saatos ngulang léngkah-léngkah anu dituduhkeun, bakal perhatikeun yén tugasna parantos réngsé di panggung test, sanajan urang teu nangtukeun panggung. Salaku bisa Anjeun nebak test nyaéta léngkah standar.
Hayu urang teraskeun nyiptakeun kerangka konfigurasi ku cara nambihan sadaya tugas anu dijelaskeun di luhur:
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
Kami ngagaduhan pipa anu henteu fungsional, tapi leres.
Nyetél pemicu
Kusabab kanyataan yén teu aya saringan pemicu anu dieusian pikeun salah sahiji tugas, saluran pipa bakal pinuh dieksekusi unggal waktos commit didorong ka Repository. Kusabab ieu sanés kabiasaan anu dipikahoyong sacara umum, kami bakal nyetél saringan pemicu pikeun tugas.
Saringan tiasa dikonpigurasi dina dua format: ngan / iwal и aturan. singket, only/except ngidinan Anjeun pikeun ngonpigurasikeun saringan ku pemicu (merge_request, Contona - susunan tugas bisa dieksekusi unggal waktu pamundut tarikan dijieun tur unggal waktos commits dikirim ka cabang nu sumber dina pamundut ngahiji) jeung ngaran cabang (kaasup ngagunakeun ungkapan biasa); rules ngidinan Anjeun pikeun ngaluyukeun sakumpulan kaayaan jeung, optionally, ngarobah kaayaan palaksanaan tugas gumantung kana kasuksésan tugas saméméhna (when di GitLab CI/CD).
Hayu urang ngelingan sakumpulan sarat - assembly sarta nguji ukur pikeun pamundut ngagabung, bungkusan na ngirim ka Azure DevOps - pikeun pamundut ngagabung jeung ngadorong ka master, generasi dokuméntasi - pikeun push ka master.
Kahiji, hayu urang nyetél tugas ngawangun kode ku nambahkeun aturan nu seuneu ngan dina pamundut ngahiji:
build job:
# snip
only:
- merge_request
Ayeuna hayu urang nyetél tugas bungkusan pikeun api kana pamundut gabungan sareng tambahkeun komitmen ka master:
Dina hiji tugas build job urang bakal ngawangun artefak anu tiasa dianggo deui dina tugas-tugas salajengna. Jang ngalampahkeun ieu, anjeun kedah nambihan jalur kana konfigurasi tugas, file anu anjeun kedah simpen sareng dianggo deui dina tugas di handap ieu, kana konci artifacts:
Jalur ngadukung wildcards, anu pasti ngajantenkeun aranjeunna langkung gampang diatur.
Upami tugas nyiptakeun artefak, maka unggal tugas anu salajengna tiasa ngaksésana - aranjeunna bakal ayana sapanjang jalur anu sami sareng akar gudang anu dikumpulkeun tina tugas aslina. Artefak oge sadia pikeun diundeur dina loka.
Ayeuna urang boga kerangka konfigurasi siap (jeung diuji), urang bisa neruskeun sabenerna nulis Aksara keur tugas.
Urang nulis naskah
Panginten, sakali waktos, dina galaksi anu jauh, jauh, ngawangun proyék (kaasup anu aya dina .net) tina garis paréntah éta nyeri. Ayeuna anjeun tiasa ngawangun, nguji sareng nyebarkeun proyék dina 3 tim:
dotnet build
dotnet test
dotnet pack
Alami, aya sababaraha nuansa alatan nu urang bakal ngahesekeun paréntah rada.
Kami hoyong ngawangun pelepasan, sanés ngawangun debug, janten urang tambahkeun kana unggal paréntah -c Release
Nalika nguji, urang hoyong ngumpulkeun data sinyalna kode, janten urang kedah ngalebetkeun analisa sinyalna dina perpustakaan tés:
Tambahkeun pakét ka sadaya perpustakaan tés coverlet.msbuild: dotnet add package coverlet.msbuild ti folder proyék
Tambahkeun ka paréntah ngajalankeun test /p:CollectCoverage=true
Tambihkeun konci kana konfigurasi tugas tés pikeun kéngingkeun hasil sinyalna (tingali di handap)
Nalika ngabungkus kodeu kana bungkusan nuget, setel diréktori kaluaran pikeun bungkusan: -o .
Ngumpulkeun data sinyalna kode
Saatos ngajalankeun tés, Coverlet prints ngajalankeun statistik ka konsol:
GitLab ngidinan Anjeun pikeun nangtukeun ekspresi biasa pikeun meunangkeun statistik, nu lajeng bisa diala dina bentuk badge a. Ekspresi biasa ditunjuk dina setélan tugas sareng konci coverage; éksprési kudu ngandung grup newak, nilai nu bakal dibikeun ka badge nu:
test and cover job:
# snip
coverage: /|s*Totals*|s*(d+[,.]d+%)/
Di dieu urang meunang statistik tina garis kalawan total sinyalna garis.
Nyebarkeun bungkusan sareng dokuméntasi
Kadua tindakan dijadwalkeun pikeun tahap terakhir tina pipa - ti saprak majelis sareng tés parantos lulus, urang tiasa ngabagi kamajuan urang ka dunya.
Mimiti, pertimbangkeun nyebarkeun ka sumber pakét:
Upami proyék éta henteu gaduh file konfigurasi nuget (nuget.config), jieun nu anyar: dotnet new nugetconfig
Kanggo naon: gambar bisa jadi teu boga aksés nulis kana global (pamaké jeung mesin) konfigurasi. Dina raraga teu nyekel kasalahan, urang ngan nyieun hiji konfigurasi lokal anyar jeung digawekeun ku eta.
Hayu urang tambahkeun sumber pakét anyar kana konfigurasi lokal: nuget sources add -name <name> -source <url> -username <organization> -password <gitlab variable> -configfile nuget.config -StorePasswordInClearText
name - ngaran sumber lokal, teu kritis
url - URL sumber tina panggung "Nyiapkeun akun", p. 6
organization - ngaran organisasi di Azure DevOps
gitlab variable - nami variabel jeung token aksés ditambahkeun kana GitLab ("Nyiapkeun rekening", p. 11). Alami, dina format $variableName
Urang ngirim sakabeh bungkusan tina diréktori ayeuna, jadi *.nupkg.
name - ti hambalan luhur.
key - garis mana wae. Dina Azure DevOps, dina Connect to feed jandela, conto sok garis az.
-skipduplicate - nalika nyobian ngirim hiji pakét geus aya tanpa konci ieu, sumber bakal balik kasalahan 409 Conflict; kalawan konci, ngirim bakal skipped.
Ayeuna hayu urang nyetél kreasi dokuméntasi:
Mimiti, dina gudang, dina cabang master, urang ngamimitian proyék docfx. Jang ngalampahkeun ieu, ngajalankeun paréntah ti root docfx init sareng sacara interaktif nyetél parameter konci pikeun dokuméntasi wangunan. Katerangan lengkep ngeunaan pangaturan proyék minimum di dieu.
Nalika ngonpigurasikeun, hal anu penting pikeun nangtukeun diréktori kaluaran ..public - GitLab sacara standar nyandak eusi folder publik dina akar gudang salaku sumber pikeun Pages. Sabab proyék bakal lokasina dina folder nested di Repository nu - nambahkeun kaluaran ka tingkat nepi di jalur.
Hayu urang nyorong perobahan ka GitLab.
Tambahkeun tugas kana konfigurasi pipa pages (kecap ditangtayungan pikeun tugas penerbitan situs di GitLab Pages):
Naskah:
nuget install docfx.console -version 2.51.0 - masang docfx; versi dieusian pikeun mastikeun yén jalur instalasi pakét anu bener.
Saméméhna, nalika netepkeun up proyek, abdi nangtukeun sumber kode pikeun dokuméntasi salaku file solusi. Karugian utama nyaéta dokuméntasi ogé didamel pikeun proyék uji. Bisi ieu teu perlu, Anjeun tiasa nyetel nilai ieu titik metadata.src:
metadata.src.src: "../" - urang balik hiji tingkat nepi relatif ka lokasi docfx.json, sabab dina pola, milarian tangkal diréktori henteu jalan.
metadata.src.files: ["**/*.csproj"] - pola global, urang ngumpulkeun sakabeh C # proyék ti sakabéh directories.
metadata.src.exclude: ["*.tests*/**"] - pola global, ngaluarkeun sagalana ti folder kalawan .tests Dina judulna
Subtotal
Konfigurasi saderhana sapertos kitu tiasa didamel ngan ukur satengah jam sareng sababaraha cangkir kopi, anu bakal ngamungkinkeun anjeun mariksa kodeu diwangun sareng tés lulus, ngawangun pakét énggal, ngapdet dokuméntasi sareng mangga panon kalayan éndah. badges dina README proyék kalawan unggal pamundut ngagabung jeung ngirim ka master.
Panungtungan .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
Diomongkeun badges
Kusabab aranjeunna, barina ogé, sadayana dimimitian!
Badges sareng status pipa sareng sinyalna kode sayogi di GitLab dina setélan CI/CD dina blok pipa Gtntral:
Kuring dijieun badge kalawan tumbu ka dokuméntasi dina platform nu shields.io - sagalana geus rada lugas aya, anjeun bisa nyieun badge sorangan sarta nampa eta ngagunakeun pamundut a.
![Пример с Shields.io](https://img.shields.io/badge/custom-badge-blue)
Azure DevOps Artefak ogé ngamungkinkeun anjeun nyiptakeun lencana pikeun pakét sareng versi panganyarna. Jang ngalampahkeun ieu, dina sumber dina situs Azure DevOps, anjeun kedah klik Jieun badge pikeun pakét anu dipilih sareng salin markup markup:
Nambihan kageulisan
Nyorot Fragmen Konfigurasi umum
Nalika nyerat konfigurasi sareng milarian dokuméntasi, kuring mendakan fitur anu pikaresepeun tina YAML - reusing fragments.
Sakumaha anjeun tiasa tingali tina setélan tugas, aranjeunna sadayana peryogi tag windows di runner, sarta dipicu nalika pamundut ngahiji dikirim ka master / dijieun (iwal dokuméntasi). Hayu urang tambahkeun ieu kana sempalan anu bakal kami nganggo deui:
Sareng ayeuna urang tiasa nyelapkeun sempalan anu dinyatakeun sateuacana dina pedaran tugas:
build job:
<<: *common_tags
<<: *common_only
Ngaran fragmen kudu dimimitian ku titik, ku kituna teu bisa diinterpretasi salaku tugas.
Vérsi pakét
Nalika nyieun pakét, kompiler mariksa saklar garis paréntah, sareng upami henteuna, file proyék; lamun manggihan titik Vérsi, nyokot nilaina salaku versi pakét keur diwangun. Tétéla yén pikeun ngawangun pakét sareng vérsi énggal, anjeun kedah ngapdet dina file proyék atanapi lulus salaku argumen baris paréntah.
Hayu urang tambahkeun hiji deui Wishlist - hayu nu minor dua angka dina versi jadi taun sarta tanggal ngawangun pakét, sarta tambahkeun versi prerelease. Tangtosna, anjeun tiasa nambihan data ieu kana file proyék sareng pariksa sateuacan unggal kiriman - tapi anjeun ogé tiasa ngalakukeun éta dina pipa, ngumpulkeun versi pakét tina kontéks sareng ngalangkungan argumen baris paréntah.
Hayu urang satuju yén lamun pesen commit ngandung garis kawas release (v./ver./version) <version number> (rev./revision <revision>)?, teras urang bakal nyandak versi pakét tina garis ieu, nambihanana sareng tanggal ayeuna sareng lulus salaku argumen pikeun paréntah dotnet pack. Dina henteuna garis, urang ngan saukur moal ngumpulkeun pakét.
Skrip di handap ieu ngarengsekeun masalah ieu:
# регулярное выражение для поиска строки с версией
$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
Nambahkeun naskah kana tugas pack and deploy job sarta nitenan rakitan bungkusan mastikeun ayana string dibikeun dina pesen commit.
dina total
Saatos nyéépkeun kira-kira satengah jam atanapi sajam kanggo nyerat konfigurasi, debugging dina powershell lokal sareng, sigana, sababaraha peluncuran anu gagal, kami ngagaduhan konfigurasi anu saderhana pikeun ngotomatisasi tugas rutin.
Tangtosna, GitLab CI / CD langkung luas sareng multifaceted tibatan anu sigana saatos maca pituduh ieu - éta henteu leres pisan. Malah aya Auto DevOps nyaétanyanggakeun
otomatis ngadeteksi, ngawangun, nguji, nyebarkeun, sareng ngawas aplikasi anjeun
Ayeuna rencanana nyaéta ngonpigurasikeun pipa pikeun nyebarkeun aplikasi ka Azure, nganggo Pulumi sareng otomatis nangtukeun lingkungan target, anu bakal dibahas dina tulisan salajengna.