在 Azure Pipelines 中,如果想將某個 Task 執行過程中產生的資訊傳遞到下一個 Task 使用,原來只要在 STDOUT 輸出一段特殊的語法就可以辦到,非常的簡單好上手。本篇文章將分享 Auzre Pipelines 變數的相關資訊。
命名限制
變數名稱只能包含以下字元:
- 英文字母 (
A-Za-z
)
- 小數點 (
.
)
- 數字 (
0-9
)
- 底線 (
_
)
另外,在 Azure Pipelines 有些內建的變數前置詞(Prefix)你一定不能使用,否則會被自動忽略:
endpoint
input
secret
securefile
變數語法
Azure Pipelines 支援三種變數類型:
- 巨集變數 (macro)
$(var)
- 執行時期才會展開變數
- 如果找不到變數時,會直接輸出
$(var)
,不會替換成空字串喔!
- 範本變數表達式 (template expression)
${{ variables.var }}
- 編譯時期就會展開變數
- 如果找不到變數時,會直接輸出空字串!
- 執行變數表達式 (runtime expression)
$[variables.var]
- 執行時期才會展開變數
- 如果找不到變數時,會直接輸出空字串!
所有變數宣告的同時,也會自動注入到執行時期的「環境變數」中,但是變數名稱會全部轉大寫,所有小數點也會轉成底線(_
)。例如:變數 foo.bar
可以從 FOO_BAR
環境變數中取值,但不同的 Shell 環境語法都不同:
- PowerShell:
$env:FOO_BAR
- 批次檔命令:
%FOO_BAR%
- Bash 命令:
$FOO_BAR
在不同 Task 之間傳遞變數
在 Azure Pipelines 中所有的 Tasks 一定是由上到下依序執行,如果想在不同的 Task 傳遞變數,一定是上面的 Task 先設定好變數,然後才能往下傳。而 Azure Pipelines 有兩種方式可以傳遞參數:
-
透過特定 Task 內建的傳遞變數
Azure Pipelines 大部分 Tasks 其實都是沒有變數的,下圖我以內建的 Shell Exec 工作來說明,這個 Task 並沒有內建變數,所以就算你設定了 Reference name
欄位也沒用,之後的 Task 一樣沒辦法取得任何資訊。
我以 Azure App Service deploy (v4
) 工作為例,如果有變數的話,你只要在 Output Variables
裡面設定 Reference name
起來,下方就會提示你之後的 Task 可以用哪些變數。以下圖為例,之後的 Task 就可以利用 $(Azure.AppServiceApplicationUrl)
取得這個工作產生的變數值。
-
透過 Task 的輸出結果設定變數
如果你想在 Shell script / PowerShell / 批次檔 執行中將某些值傳到之後的 Task 中,可以很簡單的透過 echo
輸出一些特殊字串,就可以告訴 Azure Pipelines 設定一些變數給之後的 Task 使用。
我們以 Shell 命令為例,底下語法可以自動設定一個新變數 myname
並將其值設定為 Will
,接下來的 Task 就可以利用 $(myname)
來取得變數值(Will
),真的非常簡單易用!👍
echo ##vso[task.setvariable variable=myname]Will
如果你想設定一個「安全變數」的話,以下我改用批次檔來示範,語法幾乎一樣,多加上 issecret=true
即可:
@echo ##vso[task.setvariable variable=secret.pw;issecret=true]12345678
設定好之後,就可以利用 $(secret.pw)
來取得字串(12345678
),如果這段字串會輸出到 Azure Pipelines 的紀錄中的話,就會自動替換成 ********
隱碼處理。
相關連結