Nyligen stötte jag pÄ ett Ànnu inte sÄ populÀrt verktyg i DevOps-vÀrlden, Azure DevOps-pipelines. Jag kÀnde omedelbart bristen pÄ tydliga instruktioner eller artiklar om detta. Jag vet inte varför, men Microsoft har uppenbarligen nÄgot att arbeta med nÀr det kommer till att popularisera verktyget. Idag kommer vi att bygga en pipeline för automatiserad testning inom Azure-molnet.
SÄ, uppgiften Àr:
Det finns en mjukvara som byggs med hjÀlp av Azure DevOps, som samlas frÄn ett WIX-projekt. Om det finns intresse kan jag ocksÄ skriva om detta verktyg. Faktum Àr att det Àr ett mer optimerat sÀtt att automatisera byggandet av Windows-installationsprogram, som ersÀtter den traditionella InstallShield. SÄ, vÄr mjukvara byggs framgÄngsrikt och genererar en artefakt, ett setup.exe, som installerar applikationen i Windows-systemet. Det Àr nödvÀndigt att installera denna applikation pÄ en virtuell maskin liknande den produktionsmiljö vi har, kopiera dit automatiserade tester som förberetts av testteamet, köra dem och samla in resultaten för att avgöra om grenen Àr bra eller dÄlig innan vi slÄr ihop den. Allt som i GitLab, men lite mer komplicerat.
Som virtualiseringsmiljö dÀr vi ska köra vÄra tester anvÀnder vi uppenbarligen Azure DevTest Labs, en slags enhet inom Azure-prenumerationerna, som Àr skapad för att köra olika testrelaterade aktiviteter till rimliga kostnader.
1. Integration pÄ cloud-sidan
Först behöver vi integrera vÄrt DevTest Labs med Azure DevOps, vilket krÀver en viss Service Principal, i huvudsak ett tjÀnstekonto som gör det möjligt för vÄra pipelines att interagera med molnet och skapa/ta bort resurser dÀr.
GÄ till prenumerationen och hitta tjÀnsten Azure Active Directory

Hitta App Registrations och klicka pÄ New Registration, sÄ skapar vi vÄr service principal. Jag gÄr inte in pÄ detaljer om vilka instÀllningar som ska vÀljas vid skapandet, det kan variera mellan olika prenumerationer.

Nu mÄste vi ge rÀttigheter till vÄr service principal. GÄ till prenumerationerna, klicka pÄ nyckelsymbolen. VÀlj vÄr prenumeration.

I Access Control klickar vi pÄ Role Assignment och söker efter det nyss skapade kontot. Ge rollen Contributor, det rÀcker.

GÄ tillbaka till vÄr Service Principal i Azure AD och öppna dess egenskaper. Senare kommer vi att behöva alla ID:n som finns dÀr, sÄ vi sparar dem.
HÀr avslutar vi vÄra portalinstÀllningar och gÄr vidare till Azure DevOps.
2. Integration pÄ Azure DevOps-sidan
Först gÄr vi in i projektinstÀllningarna och vÀljer Service Connections. Vi skapar ett nytt element av typen Azure Resource Manager.

Nu behöver vi alla ID:n som vi har skrivit ner. Klicka pÄ 'use the full version of the service connection dialog'. Och ange all information som vi fÄtt frÄn Service Principal. Tryck pÄ verify och om allt ser bra ut, spara uppkopplingen. Nu kan vÄra pipelines anvÀnda det för att ansluta till molnet.

3. Skapa pipeline
Nu gĂ„r vi till det mest intressanta, nĂ€mligen att bygga sjĂ€lva pipelinen. Ăppna menyn Pipelines-Builds.

Vi möts av menyn för att skapa en ny build, som som standard kommer att försöka skapa en YAML-fil med lÀmplig konfiguration. Vi avböjer artigt detta och vÀljer det klassiska alternativet. Det Àr förstÄeligt att Microsoft vill göra allt som vanligt och ge möjlighet att maximera anpassningen av pipelines via YAML, men den skrala dokumentationen och helt enkelt den praktiska oÄterkalleligheten hos mÄnga moduler sÀger oss att det Àr för tidigt att anvÀnda denna funktionalitet.

Av alla mallar behöver vi en enkel Empty Pipeline. Efter att den har skapats möts vi av ett tomt redigeringsfönster, dÀr vi kommer att spendera ganska mycket tid.

SÄ, tryck pÄ + och komma till en slags modulbutik, dÀr vi behöver följande komponenter enligt listan.

Innan vi börjar konfigurera pipeline-tasks behöver vi skapa och lÀgga in nÄgra filer i projektet. Detta kommer att vara ARM Template för vÄr virtuella maskin, som vi kommer att generera i Azure DevTest Labs, ett skript för att hÀmta IP-adress för maskinen efter att den har skapats, samt, om sÄ önskas, skripten för vÄra tester eller det som vi vill köra pÄ vÀrden.
4. Generera ARM Template
För att skapa en virtuell maskin behöver vi först generera en template, en JSON-fil, som vi kommer att lÀgga i projektets kod sÄ att pipelinen kan lÀsa den dÀrifrÄn.
GÄ till vÄrt labb och hitta menyn Formulas (ÄteranvÀndbara baser), klicka för att skapa en ny.

Vi möts av en lÄng lista av bilder som bas, val av maskinstorlek, allt samma som nÀr man skapar en virtuell maskin. Vi kommer inte att stanna vid detta steg, utan gÄ direkt till den sista punkten i maskinens egenskaper, nÀmligen artefakterna. Du kan anvÀnda valfria konfigurationer som behövs för din miljö. Till exempel, jag lÀgger till en maskin i domÀnen och lÀgger till ett tjÀnstekonto som administratör, sÄ att pipelinen senare kan komma Ät denna maskin under det kontot. Detta kan variera, men för att framgÄngsrikt testa koden behöver vi en artefakt som vi kommer att fokusera mer pÄ. För att vÄr maskin ska fÄ den senaste versionen av programvaran som vi testar kommer vi att anvÀnda artefakten "Download Azure Pipelines Artifact and Run Script". Kommer ni ihÄg att jag i början sa att en byggnad med installationsprogrammet sammanstÀlls nÄgonstans? Nu behöver vi sÀga till den virtuella maskinen, mer specifikt till mallen, att den ska gÄ och hÀmta denna artefakt. Och inte bara hÀmta den, utan ocksÄ installera den, för vilket vi fyller i speciella fÀlt med angivande av projektet, byggnamnet och den hemliga nyckeln. Den hemliga nyckeln, precis som i alla system av detta slag, genereras i kontot, i det hÀr fallet i Azure DevOps och sparas i Secrets i ditt labb. HÀr finns en liten förbehÄll, i Secrets kommer vi att spara den, men det hjÀlper inte mallen, den kommer att köras av en annan anvÀndare inom ramen för pipelinen, dÀrför mÄste vi manuellt ange den hemliga nyckeln i mallen en gÄng till.
En annan artefakt som mÄste inkluderas Àr "Configure WinRM", vi kommer att behöva den för efterföljande Ätkomst till maskinen. Det finns bara en parameter, hostname. Eftersom vi inte vet den i förvÀg kommer vi att anvÀnda variabeln %COMPUTERNAME%.

SÄ vi har lagt till alla nödvÀndiga artefakter, nu gÄr vi vidare till varför vi faktiskt Àr hÀr. Vi tar fram den genererade ARM-mallen under fliken Avancerat i samma fönster för att skapa formeln.

Vi kopierar innehÄllet pÄ sidan till filen VMtemplate.json och placerar den i rotkatalogen för projektet. Vi behöver inte mer frÄn molnet, utan ÄtervÀnder till pipelinen.
5. Konfiguration av pipelinen
LÄt oss börja med det viktigaste och mest intressanta, att skapa en virtuell maskin. Det Àr dÀrför vi har gjort alla dessa integrationer och mallar. I avsnittet Azure RM Subscription vÀljer vi vÄr serviceanslutning som vi konfigurerade i avsnitt 2. DÀrefter bör vÄr tillgÀngliga laboratoriemiljö visas. Sedan vÀljer vi json som vi genererade och definierar nÄgra obligatoriska variabler. Inloggning och lösenord för maskinen kan anges direkt eller som variabler, men jag Àr inte sÀker pÄ att det fungerar. Oavsett vad jag skriver lyckades jag inte logga in pÄ maskinen med dessa referenser, sÄ det Àr viktigt att ge maskinen ett namn som förhoppningsvis alltid Àr unikt. För detta anvÀnder jag en byggmiljövariabel.

DÀrefter konfigurerar vi en annan viktig punkt. NÀr maskinen startar behöver vi veta dess parametrar, eller snarare, det Àr pipeline som behöver detta. För detta skapar vi ett skript, till exempel GetLabVMParams.ps1, och placerar det i projektet. Texten i skriptet tog jag frÄn Microsofts webbplats men justerade det nÄgot för min miljö, eftersom det hÀmtade PublicIP och FQDN för maskinen. Jag har varken det ena eller det andra, men jag har PrivateIP som Àr ganska svÄrt att fÄ tag pÄ, sÄ jag lade till en bit.
Param( [string] $labVmId)
$labVmComputeId = (Get-AzureRmResource -Id $labVmId).Properties.ComputeId
# HĂ€mta labor VM-resursgruppens namn
$labVmRgName = (Get-AzureRmResource -Id $labVmComputeId).ResourceGroupName
# HĂ€mta labor VM-namnet
$labVmName = (Get-AzureRmResource -Id $labVmId).Name
# HĂ€mta labor VM:s offentliga IP-adress
# $labVMIpAddress = (Get-AzureRmPublicIpAddress -ResourceGroupName $labVmRgName -Name $labVmName).IpAddress
# HĂ€mta labor VM:s FQDN
# $labVMFqdn = (Get-AzureRmPublicIpAddress -ResourceGroupName $labVmRgName -Name $labVmName).DnsSettings.Fqdn
# HĂ€mta labor VM:s privata IP-adress
$VmNetworkdetails= (((Get-AzureRmVM -ResourceGroupName $labVmRgName -Name $labVmName).NetworkProfile).NetworkInterfaces).Id
$nicname = $VmNetworkdetails.substring($VmNetworkdetails.LastIndexOf("/")) + 1)
$labVMnetwork = (Get-AzureRmNetworkInterface -Name $nicname -ResourceGroupName $labVmRgName) | Select-Object -ExpandProperty IPConfigurations
$labVMIpAddress = $labVMnetwork.PrivateIpAddress
# SÀtt en variabel labVmRgName för att lagra labor VM-resursgruppens namn
Write-Host "##vso[task.setvariable variable=labVmRgName;]$labVmRgName"
# SÀtt en variabel labVMIpAddress för att lagra labor VM:s IP-adress
Write-Host "##vso[task.setvariable variable=labVMIpAddress;]$labVMIpAddress"
# SÀtt en variabel labVMFqdn för att lagra labor VM:s FQDN-namn
Write-Host "##vso[task.setvariable variable=labVMFqdn;]$labVMFqdn"
Write-Output $labVMIpAddress
Set-Item wsman:localhostclienttrustedhosts * -ForceAv allt som skriptet lÀser behöver vi bara variabeln labVMIpAddress. Detta Àr vad jag behöver, kanske ni behöver nÄgot mer, sÄ jag har inte raderat nÄgot utan bara kommenterat ut det överflödiga.
Jag förklarar ocksÄ den sista raden i skriptet; den tillÄter vÄr byggmaskin att fÄ Ätkomst till vilken vÀrd som helst via WinRM.
I nÀsta steg kör vi vÄrt fantastiska skript. Det behöver samma anslutning till molnet, en inparameter med maskinens ID, som dÄ redan kommer att vara kÀnt frÄn föregÄende steg. Hur? HÀr behöver vi nÀmna en fantastisk sak som kallas Output Variabler. Varje steg kan ha en lista med variabler som skickas vidare till de efterföljande stegen i pipelinen. SÄ för vÄrt super skript kommer variabeln att vara labVMIpAddress, glöm inte att ange detta.

Vidare gör jag ganska enkla saker som dessutom kan variera frÄn fall till fall. Jag kör ett fjÀrrskript som skapar en delad mapp dÀr jag sedan ska ladda upp mina skript.
New-Item âC:test" âtype directory
New-SMBShare âName âtestâ âPath âC:testâ âFullAccess everyoneAv namnen pĂ„ uppgifterna framgĂ„r att vi nĂ€sta kopierar ett exempel skript till maskinen och kör det i ett senare steg. Adressen till den fjĂ€rranslutna maskinen kommer att vara vĂ„r variabel $(labVMIpAddress). Sedan anvĂ€nder vi uppgiften "hĂ€mta artefakt frĂ„n dell" och kopierar resultaten av skriptets körning till vĂ„r byggmiljö, dĂ€refter sparar vi dessa filer i byggartefakten med en standarduppgift. NĂ€r vi inte lĂ€ngre behöver maskinen, dödar vi den som sista steg. Den största svĂ„righeten, som framgĂ„r av artikelns omfattning, Ă€r att integrera med molnet och upprĂ€tta kontakt med den virtuella maskin du har skapat, sedan kan du underhĂ„lla dig hur mycket du vill.
Det hÀr Àr min första artikel, sÄ döm mig inte för hÄrt, kommentarer vÀlkomnas.
KĂ€lla: habr.com
