Jak wdrożyć Azure Pipelines agenta? (How to deploy Azure Pipelines agent?)
Azure DevOps pozwala na wdrażanie rozwiązań za pośrednictwem agentów tzw. "Microsoft-hosted" przez 1800 minut (30 godzin) miesięcznie. Po przekroczeniu tego czasu nie możemy wykonywać deploymentów. Można jednak dokupić nielimitowany dostęp do agenta za $40 miesięcznie lub korzystać ze swojego serwera, np. laptopa, instalując agenta — ta opcja wdrażania jest znana w dokumentacji jako "Self-Hosted". Dodam tylko, że wykorzystywanie własnego laptopa do wdrażania nie jest rozwiązaniem produkcyjnym 🙃.
Strona z cenami Azure DevOps: (https://azure.microsoft.com/pricing/details/devops/azure-devops-services/?WT.mc_id=AZ-MVP-5002690)
Bardzo często słyszę pytanie: po co mi własny serwer do wdrażania?
Klasyczna odpowiedź: to zależy... Przy pracy nad pracą dyplomową lub projektem PoC dla znajomego można postawić agenta na swoim laptopie. Jeśli pracujecie w grupie kilku osób, najlepiej byłoby skorzystać z własnego serwera. Jeśli jesteście firmą dostarczającą rozwiązania, zdecydowanie warto rozważyć własny serwer lub zakup agentów "Microsoft-hosted" za $40, jeśli czas wdrażania przekracza 1800 minut miesięcznie. Jest jeszcze jedna sytuacja, kiedy warto wybrać własny serwer z agentami: wiele firm korzysta z prywatnych, kontrolowanych wewnętrznych sieci z ograniczonym dostępem z zewnątrz. Wdrożenie własnego serwera w takiej sieci pozwoli na łatwą komunikację z wdrożonymi rozwiązaniami na platformie Microsoft Azure oraz zwiększy bezpieczeństwo procesowanych danych. Pamiętajmy, że agent "Microsoft-hosted" to agent "publiczny", odizolowany od waszej sieci. "Self-Hosted" może zostać wdrożony jako agent odizolowany, ale można go również zintegrować z własną siecią.
Poniżej odsyłam was do dokumentacji, w której można dowiedzieć się więcej o możliwościach oferowanych przez Microsoft w zakresie agentów Azure Pipelines.
MS Docs - Azure Pipelines agents
Przechodzimy zatem do wdrożenia własnego serwera z agentem.
Przygotowałem ilustracje związane z całym projektem dla wdrożenia Azure Pipelines agent w oparciu o ten post oraz potrzebne materiały do jego wdrożenia.
- Linki - za pomocą tych linków macie dostęp do mojego przykładowego wdrożenia
- Azure Repos: (https://dev.azure.com/justcloudpublic/_git/How%20to%20deploy%20ADO%20agent?path=/vm-azure-devops-self-hosted-agents)
- Azure Pipeline: (https://dev.azure.com/justcloudpublic/How%20to%20deploy%20ADO%20agent/_build?definitionId=2)
- Skrypty
- Parametry
-
azuredeploy.param.json - te parametry możesz przerobić lub zmienić tak, aby odpowiadały potrzebom wdrożenia. Ważne: te dane testowe są nadpisywane podczas deploymentu — sprawdź to w pliku: vm-azure-devops-self-hosted-agents-ci.yml "overrideParameters".
-
Opis zmiennych
- adminUsername [nazwa użytkownika]
- adminPassword [hasło użytkownika]
- dnsLabelPrefix (domyślnie ustawiany: generowany na podstawie ResourceGroup.Id) [publiczny DNS do połączenia RDP]
- vmName [nazwa maszyny wirtualnej]
- AccessIPNSG [IP, które zostanie dodane do reguły NSG dla dostępu RDP]
- tag [domyślnie ustawiony: "Project: AzureDevOpsAgent"]
- DiskForVM [StorageAccount lub Managed - wybór dysku dla wdrożenia maszyny wirtualnej]
"parameters": {
"adminUsername": {
"value": "test-user"
},
"adminPassword": {
"value": "test-P@ssw0rd12345"
},
"vmName": {
"value": "ado-agents"
},
"AccessIPNSG": {
"value": "192.168.1.1"
},
"tag": {
"value": "AzureDevOpsAgent"
},
"DiskForVM": {
"value": "StorageAccount"
}
}
-
-
createresourcegroup-adoagent.param.json - parametry definiujące grupę zasobów.
"parameters": {
"ResourceGroupLocation": {
"value": "westeurope"
},
"ResourceGroupName": {
"value": "vm-azure-devops-self-hosted-agents"
},
"tag": {
"value": {
"key1": "Project",
"value1": "AzureDevOpsAgent"
}
}
} -
script-post-configuration.ps1 - skrypt odpowiada za instalację agenta oraz przygotowanie potrzebnych paczek. Jeśli potrzebujesz doinstalować dodatkowe paczki, dodaj je w sekcji: # Install Packages - najprościej jest skorzystać z paczek choco: (https://docs.chocolatey.org/en-us/choco/commands/list)
-
Opis zmiennych
- urlProjectADO [URL do projektu ADO]
- auth (domyślnie ustawione: PAT) [metoda uwierzytelniania dla projektu ADO]
- token [token bezpieczeństwa dla projektu ADO]
- pool (domyślnie ustawione: default) [nazwa puli dla agenta w ADO]
- agentname [domyślnie taka sama jak nazwa maszyny wirtualnej]
- numberagents [domyślnie 1 - można wdrożyć od 1 do 20 agentów na jednym serwerze]
- instalAddtionalPackages [domyślnie $true; instaluje wszystko, co potrzebne do prostego wdrożenia w Azure; jeśli potrzeba .NET itp., należy dodać ręcznie]
param(
[Parameter(Mandatory = $true)][string] $urlProjectADO,
[Parameter(Mandatory = $false)][string] $auth = "pat",
[Parameter(Mandatory = $true)][string] $token,
[Parameter(Mandatory = $false)][string] $pool,
[Parameter(Mandatory = $false)][string] $agentname,
[Parameter(Mandatory = $false)][ValidateRange(1, 20)][int] $numberagents = 1,
[Parameter(Mandatory = $false)][bool] $instalAddtionalPackages = $true
)
begin {
}
process {
try {
if (!(Test-Path "c:\temp")) { $null = mkdir "c:\temp" }
$log | % {
# Install Additional Packages
if ($instalAddtionalPackages) {
try {
# Install Packages
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Install-PackageProvider -Name "Nuget" -Force
# FIX: WARNING: Not setting tab completion: Profile file does not exist at 'C:\Users\USER\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1'.
if (!(Test-Path -Path $PROFILE)) {
New-Item -ItemType File -Path $PROFILE -Force
}
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
choco feature enable -n allowGlobalConfirmation
choco install -y powershell-core
Start-Sleep 3
choco install -y azure-cli
Start-Sleep 3
choco install -y az.powershell
Start-Sleep 3
choco install -y azcopy
Start-Sleep 3
choco install -y iiscrypto
Start-Sleep 3
#Install AzureRM in Powershell 5.1
C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -Command "Install-Module -Name AzureRM -AllowClobber -Force -Confirm:`$false"
# END Install Packages
}
catch {
throw $_
break
}
}
# Get latest version install agent
$getLatestVersion = Invoke-WebRequest https://api.github.com/repos/Microsoft/azure-pipelines-agent/releases/latest -UseBasicParsing
$tag = ($getLatestVersion | ConvertFrom-Json)[0].tag_name
$tag = $tag.Substring(1)
$downloadInstallURL = "https://vstsagentpackage.azureedge.net/agent/$tag/vsts-agent-win-x64-$tag.zip"
# Creating Pool in Azure DevOps
$encodedPat = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes( ":$token"))
$body = "{name:`"$pool`", autoProvision: `"true`"}"
if (!($pool -match "default" -or $pool -match "Azure Pipelines" -or $((Invoke-WebRequest -Method GET -Uri "$urlProjectADO/_apis/distributedtask/pools?api-version=5.1" -UseBasicParsing -Headers @{Authorization = "Basic $encodedPat" }).content | ? { $_ -like "*$pool*" }))) {
$tmp = $(Invoke-WebRequest -Method POST -Uri "$urlProjectADO/_apis/distributedtask/pools?api-version=5.0-preview.1" -UseBasicParsing -Headers @{Authorization = "Basic $encodedPat" } -Body $body -ContentType "application/json") 2>$null
}
# Install agents
$filename = $urlProjectADO.Split('/')[-1]
if (!(Test-Path "c:\temp\$filename")) { Invoke-WebRequest -Uri $downloadInstallURL -OutFile "c:\temp\$filename" }
for ($i = 1; $i -le $numberagents; $i++) {
if (!(Test-Path "c:\agent-$i")) { mkdir "c:\agent-$i" }else { rm c:\agent-$i -recurse -force; mkdir "c:\agent-$i" }
Add-Type -AssemblyName System.IO.Compression.FileSystem ; [System.IO.Compression.ZipFile]::ExtractToDirectory("c:\temp\$filename", "c:\agent-$i")
."c:\agent-$i\config.cmd" --unattended --url $urlProjectADO --auth $auth --token $token --pool $pool --agent "$agentname-$i" --runAsService
}
} | Out-File "c:\temp\ADOagent-$((Get-Date).ToString("s").Replace(":","-")).log"
Remove-Item -Recurse -Force c:\temp -Exclude *.log
}
catch {
throw $_
break
}
Write-Verbose "Successfully installed Azure DevOps Job Agents"
}
-
-
- Pipelines
-
vm-azure-devops-self-hosted-agents-ci.yml - w tym pliku zdefiniuj dokładnie dane potrzebne do instalacji agentów — adres Twojego projektu ADO, nazwę puli oraz liczbę agentów. Grupa oznacza grupę Library w Azure DevOps, w której bezpiecznie przekazujemy poufne dane.
variables:
- name: SPNName
value: 'Subscription-JustCloudPublic'
* name: location
value: 'westeurope'
* name: urlProjectADO
value: 'https://justcloudpublic.visualstudio.com'
* name: pool
value: 'Default'
* name: numberagents
value: 3
* group: 'justcloudpublickeyvault'
-
- Parametry
- Wymagania - co potrzebujesz wiedzieć, zanim zaczniesz wdrażać:
- Subskrypcja Azure
- PAT — Personal Access Token — (https://docs.microsoft.com/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows&WT.mc_id=AZ-MVP-5002690#create-a-pat)
- Key Vault — (https://docs.microsoft.com/azure/devops/pipelines/release/azure-key-vault?view=azure-devops&WT.mc_id=AZ-MVP-5002690)
Po wdrożeniu:
- Azure DevOps agents
- Azure Portal
Instruktarz video:
Jeśli masz jakieś pytania, zapraszam do komentowania 🙂.
Artykuł dostępny również na Medium i LinkedIn: