安全地在管道中使用变量和参数
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
了解如何安全地利用变量和参数从管道用户收集输入。 有关详细信息,请参阅以下文章:
请谨慎使用机密变量。 用于设置机密变量的建议方法包括使用 UI、创建变量组或利用源自 Azure 密钥库的变量组。 有关详细信息,请参阅设置密码变量。
变量
变量是一种方便的方法,用于提前收集用户输入,并有助于在管道步骤之间传输数据。 但是,在使用变量时请谨慎行事。 默认情况下,新创建的变量(无论是在 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 的早期,此功能具有以下问题:
- 它允许用户定义定义中尚未由管道作者定义的新变量。
- 此 API 允许用户重写系统变量。
为了解决这些问题,我们定义了一个设置来 限制可以在队列时设置的变量。 启用此设置后,只能设置显式标记为“队列时 Settable”的变量。 换句话说,可以在队列时设置任何变量,除非此设置处于打开状态。
此设置设计为在组织和项目级别工作。
- 组织级别:
- 当设置处于打开状态时,它强制仅针对组织内所有项目的所有管道修改显式标记为“Settable at queue time”的变量。
- 项目集合管理员可以启用或禁用此设置。
- 在“组织设置>管道>设置”下访问此设置。
- 项目级别:
- 与组织级别类似,启用此设置可确保只有标记为“队列时设置”的变量才能针对特定项目中的所有管道进行修改。
- 如果启用了组织级别设置,则它适用于所有项目,并且无法关闭。
- 项目管理员可以启用或禁用此设置。
- 在“项目设置管道>设置”>下访问此设置。
下面的示例演示了该设置,管道定义了一个名为 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
并且可以限制为特定的值子集。 当管道的用户可配置方面只接受预定义列表中的值时,此限制非常有用,确保管道不接受任意数据。
启用 shell 任务实参验证
管道可以引用管道中执行的任务。 某些任务包括一个 arguments
参数,可用于为任务指定更多选项。
启用“启用 shell 任务”参数验证设置时,参数参数将进行评审,以确保 shell 正确执行分号、引号和括号等字符。 与可在队列时间选项设置的“限制”变量类似,可以在“设置管道>设置”>下,在组织或项目级别配置 Enable shell 任务参数验证。
启用此功能后,与参数相关的 arguments
任何验证问题都触发错误消息,如下所示:
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