In una pipeline di rilascio di Azure DevOps come distribuire in più macchine virtuali un gruppo di distribuzione con cartelle di destinazione diverse

Aug 24 2020

Ho iniziato con una configurazione della pipeline di rilascio in Azure DevOps per distribuire un servizio Windows a un gruppo di distribuzione che aveva solo una singola VM con un agente configurato. Ho una variabile impostata nella pipeline per la cartella di distribuzione.

Ora sto cercando di espandere questo per distribuire a 2 server. Ho aggiunto il secondo server al gruppo di distribuzione e la registrazione ha funzionato. Su questo server, la distribuzione deve passare a un'unità diversa.

Non sembra esserci un modo per specificare un valore diverso per la variabile da parte di un agente.

Ho provato a cercare su Google ea strascico nell'interfaccia utente e finora non ho trovato nulla. Mi chiedo se le variabili siano anche la cosa giusta?

Risposte

2 Twisted Aug 25 2020 at 19:13

Risponderò alla mia domanda in quanto la soluzione è in realtà una combinazione delle risposte gentilmente fornite da @Martin A @Tomasz Kaniewski e @Vito Liu-MSFT con una discreta quantità di tentativi ed errori. Spero che questo possa aiutare gli altri.

Le variabili di ambiente sono la chiave per identificare la cartella di distribuzione, quindi ho impostato una variabile di ambiente di sistema chiamata AutomationDeploymentRoot su ciascuna delle mie VM

È necessario riavviare il servizio Windows dell'agente Azure Pipelines su ogni macchina virtuale prima che le modifiche alle variabili di ambiente vengano prese !!

Ho scoperto che il supporto per le variabili di ambiente è piuttosto incoerente tra le diverse attività: sembrano funzionare bene nelle attività di script ma non così bene in altre come CopyFiles.

L'approccio più affidabile era copiare la variabile di ambiente in una variabile della pipeline (deployment.root) che ho impostato nella scheda della variabile in questo modo

Quindi imposta la variabile dallo script come suggerito da Thomasz e Vito

steps:
- script: |
   @echo ##vso[task.setvariable variable=deployment.root]%AutomationDeploymentRoot%
   
  displayName: 'Set Deployment Folder'

quando viene eseguito, c: \ temp \ deploy viene sostituito dalla cartella corretta per la macchina di destinazione e tutto diventa verde!

1 TomaszKaniewski Aug 25 2020 at 04:23

Puoi impostare una variabile dallo script: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=classic%2Cpowershell#set-variables-in-scripts

Scrivere uno script che sarà in grado di determinare su quale macchina è in esecuzione e assegnare un valore appropriato a una variabile.

1 VitoLiu-MSFT Aug 25 2020 at 14:30

D'accordo con Tomasz.

Possiamo impostare la variabile tramite il power script Write-Host " ##vso[task.setvariable variable={variable name}]{variable value}", quindi possiamo chiamare la variabile in un altro task.

Si prega di fare riferimento a questa risposta per maggiori dettagli

Inoltre, possiamo aggiornare la variabile pipeline di rilascio tramite questa API Aggiornare una definizione di rilascio .

a . Apri la pipeline di rilascio e aggiungi un nuovo test variabile e concedi test Build Service (xxx)all'account l'autorizzazione Modifica pipeline di rilascio. (apri la pipeline di rilascio -> ... -> Sicurezza -> Modifica pipeline di rilascio impostata su Consenti).

b . Apri pipeline, abilita la funzione Consenti agli script di accedere al token OAuth (fai clic su Agent Job Name => Opzioni aggiuntive) aggiungi task powershell e inserisci lo script seguente per aggiornare il valore di test della variabile di rilascio.

$url = "https://vsrm.dev.azure.com/{org name}/{project name}/_apis/release/definitions/{release definition ID}?api-version=6.0-preview.4" Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" } Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)" # Update an existing variable named test to its new value $pipeline.variables.test.value= {new variable value}

####****************** update the modified object **************************
$json = @($pipeline) | ConvertTo-Json -Depth 99


$updatedef = Invoke-RestMethod -Uri $url -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}

write-host "==========================================================" 
Write-host "The value of Varialbe 'test' is updated to" $updatedef.variables.test.value
write-host "=========================================================="