Azure DevOpsリリースパイプラインで、異なるターゲットフォルダーを持つデプロイメントグループを複数のVMにどのようにデプロイしますか
まず、azure DevOpsでリリースパイプラインをセットアップして、エージェントがセットアップされたVMが1つしかないデプロイメントグループにWindowsサービスをデプロイしました。デプロイメントフォルダーのパイプラインに変数を設定しています。
現在、これを拡張して2台のサーバーに展開しようとしています。2番目のサーバーを展開グループに追加しましたが、登録は機能しました。このサーバーでは、展開を別のドライブに移動する必要があります。
エージェントが変数に別の値を指定する方法はないようです。
UIでグーグルとトロールを試しましたが、今のところ何も見つかりませんでした。変数が正しいのかどうか疑問に思っていますか?
回答
解決策は、実際には@Martin A @TomaszKaniewskiと@ VitoLiu-MSFTから提供された回答をかなりの試行錯誤で組み合わせたものであるため、私自身の質問に答えるつもりです。これが他の人の役に立つことを願っています。
環境変数は展開フォルダーを識別するための鍵であるため、各VMにAutomationDeploymentRootというシステム環境変数を設定しました。
環境変数への変更を取得する前に、各VMでAzure PipelinesAgentのWindowsサービスを再起動する必要があります。
環境変数のサポートは、異なるタスク間でかなり一貫性がないことがわかりました。スクリプトタスクではうまく機能しているように見えますが、CopyFilesなどの他のタスクではうまく機能していないようです。
最も信頼できるアプローチは、環境変数をパイプライン変数(deployment.root)にコピーすることでした。これは、次のように変数タブで設定しました。
そして、ThomaszとVitoによって提案されたように、スクリプトから変数を設定します
steps:
- script: |
@echo ##vso[task.setvariable variable=deployment.root]%AutomationDeploymentRoot%
displayName: 'Set Deployment Folder'
これが実行されると、c:\ temp \ deployがターゲットマシンの正しいフォルダーに置き換えられ、すべてが緑色になります。
スクリプトから変数を設定できます。 https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=classic%2Cpowershell#set-variables-in-scripts
実行中のマシンを判別し、変数に適切な値を割り当てることができるスクリプトを作成します。
Tomaszに同意します。
パワースクリプトWrite-Host " ##vso[task.setvariable variable={variable name}]{variable value}"を介して変数を設定してから、別のタスクで変数を呼び出すことができます。
詳細については、この回答を参照してください
さらに、このAPIを介してリリースパイプライン変数を更新できます。リリース定義を更新します。
A。リリースパイプラインを開き、新しい変数テストを追加して、test Build Service (xxx)アカウントにリリースパイプラインの編集権限を付与します。(リリースパイプラインを開きます-> ...->セキュリティ-> [許可]に設定されたリリースパイプラインを編集します)。
b。パイプラインを開き、スクリプトがOAuthトークンにアクセスできるようにする機能を有効にし([エージェントジョブ名] => [追加オプション]をクリック)、タスクpowershellを追加し、以下のスクリプトを入力してリリース変数のテスト値を更新します。
$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 "=========================================================="