在 Azure DevOps 管道中使用變數

我們繼續審查用於 Windows 及更多應用程式的出色開發工具 Azure DevOps。這次受了環境變數的苦,決定把所有的經驗都寫在一篇文章裡。

首先,它們針對每個執行環境具有不同的語法,最後缺乏將變數從管道的一個階段傳輸到另一階段的標準能力。

我將保留主要範例將在發布管道上,因為 YAML 尚未到達那裡,並且我需要許多階段和許多工件的功能。這似乎已經在常規管道中可用,這實際上與它們的功能相同。在 Pipelines YAML 中,我們為文字表示添加了一個小的圖形工具提示,其中包含可設定的參數。這非常方便;您不必查看每個模組的文件。但我將在下一篇文章中對此進行描述,但現在這裡是創新本身的圖片。

在 Azure DevOps 管道中使用變數

儲存和使用

讓我們從系統中有預設變數的事實開始。根據其來源,它們以“發布”、“系統”等詞開頭。完整清單(事實證明並非如此)可在 文件。所有具有語法的精神分裂症均透過以下文件中的範例進行說明。同一個變數有三種表示形式,取決於我們在哪裡呼叫它。

steps:
 - bash: echo This script could use $SYSTEM_ACCESSTOKEN
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)
  - powershell: Write-Host "This is a script that could use $env:SYSTEM_ACCESSTOKEN"
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)

如果您在執行任務的代理程式上設定變量,則該變數為 $(System.AccessToken)。如果您想在同一代理程式上的 powershell 腳本內使用它,則它已經是 $env:SYSTEM_ACCESSTOKEN。如果您(上帝禁止)想要使用目標電腦上的 PowerShell 任務在某些遠端主機上使用此變量,則需要使用以下命令將其透過參數傳遞給腳本: 我的錢。使用 bash 就更簡單了,您可以簡單地使用參數和語法 $SYSTEM_ACCESSTOKEN 將其傳遞到內部。

同樣的法則不適用於您自己的變數;在這裡您已經對文法負責。可以在每個任務中本地設定變數。

在 Azure DevOps 管道中使用變數

或全域到變數存儲,然後從存儲連結它們。非常舒服。

在 Azure DevOps 管道中使用變數

作為獎勵,如果變數非常秘密,它們可以儲存在 Azure 雲端中名為 Azure Vault 的儲存空間中;您可以將 Vault 連結到庫中的項目。

在 Azure DevOps 管道中使用變數

一般來說,變數的一切都很清楚;在管道中,它們仍然可以為每次啟動手動設定;在發行版中沒有這樣的功能。您可以在代理初始化日誌中再次看到要傳輸到管道的內容,但請記住它們已經以轉換後的形式存在。

在 Azure DevOps 管道中使用變數

動態變數

當我們想要在一個階段接收一些值並將其傳遞到下一階段時,樂趣就開始了。

在 Azure DevOps 管道中使用變數

我們沒有提供這樣的功能。但我們的雙手並不無聊,在Google的幫助下找到了解決方案。感謝上帝,Azure DevOps 有一個 API,它允許我們做比介面中描述的更多的事情。

因此,我們需要呼叫來更新全域變量,我們將直接在管道內執行此操作。該位址取自環境變量,與前面提到的文件中沒有提及的環境變量相同。您可以自己設定它們,或者更重要的是,如果他們關閉商店,則對它們進行硬編碼。

$releaseurl = ('{0}{1}/_apis/release/releases/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID)  )

我們將要傳輸的變數設為空值,設定 Scope - Release

在 Azure DevOps 管道中使用變數

例如,我們製作一些隨機值產生器。請注意此階段內聲明變數的語法;引入了此功能。

在 Azure DevOps 管道中使用變數

下一步,我們將變數傳遞給腳本,是的,是的,直接不可能,必須通過參數。

在 Azure DevOps 管道中使用變數

劇本有劇透

PowerShell的

#Script requires stageVar variable in release variables set to Release scope

param ( [string] $expVar )
#region variables
$ReleaseVariableName = 'StageVar'
$releaseurl = ('{0}{1}/_apis/release/releases/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID)  )
#endregion


#region Get Release Definition
Write-Host "URL: $releaseurl"
$Release = Invoke-RestMethod -Uri $releaseurl -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
#endregion

#region Output current Release Pipeline
Write-Output ('Release Pipeline variables output: {0}' -f $($Release.variables | ConvertTo-Json -Depth 10))
#endregion


#region Update StageVar with new value
$release.variables.($ReleaseVariableName).value = "$expVar"
#endregion

#region update release pipeline
Write-Output ('Updating Release Definition')
$json = @($release) | ConvertTo-Json -Depth 99
Invoke-RestMethod -Uri $releaseurl -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" }
#endregion

#region Get updated Release Definition
Write-Output ('Get updated Release Definition')
Write-Host "URL: $releaseurl"
$Release = Invoke-RestMethod -Uri $releaseurl -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
#endregion

#region Output Updated Release Pipeline
Write-Output ('Updated Release Pipeline variables output: {0}' -f $($Release.variables | ConvertTo-Json -Depth 10))
#endregion

巴什

INPUT_VAR=$1
RELEASE_VAR=$2

echo Test ID: ${INPUT_VAR}

RELEASE_URL="${SYSTEM_TEAMFOUNDATIONSERVERURI}${SYSTEM_TEAMPROJECTID}/_apis/release/releases/${RELEASE_RELEASEID}?api-version=5.0"

echo release url: $RELEASE_URL

RELEASE_JSON=$(curl -H "Authorization: Bearer $SYSTEM_ACCESSTOKEN" $RELEASE_URL)

OUTPUT=`jq ''.variables.${RELEASE_VAR}.value' = '"${INPUT_VAR}"'' <<< $RELEASE_JSON`

curl -H "Authorization: Bearer $SYSTEM_ACCESSTOKEN" -H "Content-Type: application/json" -X PUT -d "$OUTPUT" $RELEASE_URL

簡而言之,我們的腳本將變數 myVar 作為輸入,並使用 API 將該變數的值放入 stageVar。下一步,使用系統變數語法,我們可以看一下。

在 Azure DevOps 管道中使用變數

這個範例非常簡單,但除了我之前的功能之外,該功能還為我們提供了很好的機會 文章,當我們可以在測試的第一階段建立虛擬機器時,用它執行一些進一步的操作,並且幾個並行操作。最後階段是摧毀它。現在,我們每次都在新的虛擬機器上執行產品的自動測試。考慮到他們的生存時間大約是10分鐘,所以花費一分錢。

在下一篇文章中,如果有必要,我將討論 YAML 管道;最近那裡出現了許多有趣的創新。

來源: www.habr.com

添加評論