如何在管線中安全地使用變數和參數
Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020
本文討論如何使用變數和參數,從管線使用者收集輸入。 如果您想要深入瞭解如何使用變數和參數,請參閱:
請謹慎使用秘密變數。 設定祕密變數的建議方式是在 UI、變數群組和 Azure Key Vault 的變數群組中。 如需詳細資訊,請參閱 設定秘密變數。
變數
變數可以是從用戶預先收集資訊的便利方式。 您也可以使用變數,將數據從步驟傳遞至管線內的步驟。
但請小心使用變數。 新建立的變數,無論是在 YAML 中定義,還是由腳本撰寫,預設為讀寫。 下游步驟可以透過您不預期的方式變更變數的值。
例如,您的文稿會讀取:
msbuild.exe myproj.proj -property:Configuration=$(MyConfig)
此步驟可以設定 MyConfig
為 Debug & deltree /y c:
。
雖然此範例只會刪除組建代理程序的內容,但您可以想像此設定如何輕鬆變得更危險。
您可以將變數設為唯讀。
、工作輸出變數和佇列時間變數等 Build.SourcesDirectory
系統變數一律為唯讀。
在 YAML 中建立或由腳本在運行時間建立的變數可以指定為唯讀。
當腳本或工作建立新的變數時,它可以在其記錄命令中傳遞 isReadonly=true
旗標,讓變數成為只讀的。
在 YAML 中,您可以使用特定索引鍵來指定唯讀變數:
variables:
- name: myReadOnlyVar
value: myValue
readonly: true
佇列時間變數
在 Pipelines UI 編輯器中定義變數時,您可以選擇讓使用者在執行管線時覆寫其值。 我們將這類變數稱為佇列時間變數。 佇列時間變數一律定義於 Pipelines UI 編輯器中。
佇列時間變數會在使用者手動執行管線時公開給終端使用者,而且可以變更其值。
使用者需要在 管線上編輯佇列組建組態 許可權,以指定佇列時間設定的變數。
限制可在佇列時間設定的變數
用來執行管線的UI和REST API提供方法,讓使用者在佇列時定義新的變數。
在 Azure Pipelines 的初期,這項功能有一些問題:
- 它可讓使用者定義定義中管線作者未明確定義的新變數。
- 其允許使用者覆寫系統變數。
為了更正這些問題,我們定義了一個設定來限制可以在佇列時間設定的變數。 啟用此設定後,只能設定明確標示為「在佇列時間設定」的變數。 換句話說,除非啟用了此設定,否則您可以在佇列時間設定任何變數。
此設定的設計目的是在組織層級和專案層級工作。
- 組織層級。 當設定開啟時,它會強制針對組織內所有專案中的所有管線,只能設定明確標示為「在佇列時間設定」的變數。 當設定關閉時,每個專案都可以選擇是否要限制在佇列時間設定的變數。 此設定是 [組織 設定 -> 管線 -> 設定 下的切換。 只有專案集合系統管理員可以啟用或停用此設定。
- 專案層級。 當設定開啟時,它會強制針對專案中的所有管線,只能設定明確標示為「在佇列時設定可設定」的變數。 如果設定位於組織層級,則所有專案都開啟,且無法關閉。 此設定是 [專案 設定 -> 管線 -> 設定 下的切換。 只有專案系統管理員可以啟用或停用此設定。
讓我們看看範例。 假設設定開啟,而您的管線會定義在佇列時間無法設定的變數 my_variable
。
接下來,假設您想要執行管線。 [ 變數 ] 面板不會顯示任何變數,而且遺漏 [ 新增變數] 按鈕。
使用組建 - 佇列和執行 - 執行管線 REST API 呼叫來將管線執行排入佇列,並設定 或 新變數的值my_variable
將會失敗,並出現類似下列的錯誤。
{
"$id": "1",
"innerException": null,
"message": "You can't set the following variables (my_variable). If you want to be able to set these variables, then edit the pipeline and select Settable at queue time on the variables tab of the pipeline editor.",
"typeName": "Microsoft.Azure.Pipelines.WebApi.PipelineValidationException, Microsoft.Azure.Pipelines.WebApi",
"typeKey": "PipelineValidationException",
"errorCode": 0,
"eventId": 3000
}
參數
不同於變數,管線參數在執行時無法由管線變更。
參數具有 number
和 string
等資料類型,而且可以限制為值的子集。
當使用者可設定的管線部分只應該從限制清單中取得值時,限制參數會很有用。 安裝程式可確保管線不會採用任意資料。
啟用殼層工作自變數參數驗證
管線可以參考管線中執行的工作。 Azure DevOps 中包含的數個工作具有自變數參數,可讓您為工作指定更多選項。
啟用 [啟用殼層工作] 自變數參數驗證設定時,會針對殼層可能未正確執行的任何字元,檢閱自變數參數。 範例字元包括分號、引號和括弧。
類似於可以在佇列時間設定的 [限制變數] 選項,[啟用殼層工作] 自變數參數驗證可以在組織層級設定為 設定 Pipelines 設定 或專案層級的 設定>> Pipelines>> 設定。
啟用時,發生偵測到的驗證問題,會記錄如下的錯誤訊息: Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).
若要解決此問題,請逸出錯誤訊息中所述的特殊字元來調整自變數。
啟用殼層工作自變數參數驗證時,會將驗證套用至下列工作中的arguments參數。
- PowerShell
- BatchScript
- Bash
- Ssh
- AzureFileCopy
- WindowsMachineFileCopy
下一步
保護輸入之後,您也需要保護您的 共用基礎結構。