如何在管線中安全地使用變數和參數

Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020

本文討論如何使用變數和參數,從管線使用者收集輸入。 如果您想要深入瞭解如何使用變數和參數,請參閱:

請謹慎使用秘密變數。 設定祕密變數的建議方式是在 UI、變數群組和 Azure Key Vault 的變數群組中。 如需詳細資訊,請參閱 設定秘密變數

變數

變數可以是從用戶預先收集資訊的便利方式。 您也可以使用變數,將數據從步驟傳遞至管線內的步驟。

但請小心使用變數。 新建立的變數,無論是在 YAML 中定義,還是由腳本撰寫,預設為讀寫。 下游步驟可以透過您不預期的方式變更變數的值。

例如,您的文稿會讀取:

msbuild.exe myproj.proj -property:Configuration=$(MyConfig)

此步驟可以設定 MyConfigDebug & 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 的初期,這項功能有一些問題:

  • 它可讓使用者定義定義中管線作者未明確定義的新變數。
  • 其允許使用者覆寫系統變數。

為了更正這些問題,我們定義了一個設定來限制可以在佇列時間設定的變數。 啟用此設定後,只能設定明確標示為「在佇列時間設定」的變數。 換句話說,除非啟用了此設定,否則您可以在佇列時間設定任何變數。

此設定的設計目的是在組織層級和專案層級工作。

  1. 組織層級。 當設定開啟時,它會強制針對組織內所有專案中的所有管線,只能設定明確標示為「在佇列時間設定」的變數。 當設定關閉時,每個專案都可以選擇是否要限制在佇列時間設定的變數。 此設定是 [組織 設定 -> 管線 -> 設定 下的切換。 只有專案集合系統管理員可以啟用或停用此設定。 螢幕擷取畫面:於組織層級限制可在佇列時間設定的變數。
  2. 專案層級。 當設定開啟時,它會強制針對專案中的所有管線,只能設定明確標示為「在佇列時設定可設定」的變數。 如果設定位於組織層級,則所有專案都開啟,且無法關閉。 此設定是 [專案 設定 -> 管線 -> 設定 下的切換。 只有專案系統管理員可以啟用或停用此設定。 限制可在專案層級佇列時間設定之變數的螢幕快照。

讓我們看看範例。 假設設定開啟,而您的管線會定義在佇列時間無法設定的變數 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
}

參數

不同於變數,管線參數在執行時無法由管線變更。 參數具有 numberstring 等資料類型,而且可以限制為值的子集。 當使用者可設定的管線部分只應該從限制清單中取得值時,限制參數會很有用。 安裝程式可確保管線不會採用任意資料。

啟用殼層工作自變數參數驗證

管線可以參考管線中執行的工作。 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

下一步

保護輸入之後,您也需要保護您的 共用基礎結構