如何在管道中安全地使用变量和参数

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

本文介绍如何安全地使用变量和参数从管道用户收集输入。 若要详细了解如何使用变量和参数,请参阅:

变量

变量可以是从用户预先收集信息的便捷方法。 还可以使用变量将数据从步骤传递到管道中的步骤。

但请谨慎使用变量。 新创建的变量(无论是在 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 编辑器中定义变量时, (YAML 或经典生成管道) ,可以选择让用户在运行管道时替代其值。 我们将此类变量称为队列时间变量。

定义队列时间变量的屏幕截图。

手动运行管道时,队列时间变量会公开给最终用户,并且可以更改其值。 更新队列时间变量值的屏幕截图。

限制可在队列时间设置的变量

用于运行管道的 UI 和 REST API 为用户提供在队列时定义新变量的方法。

在运行管道之前添加队列时间变量的屏幕截图。

在 Azure Pipelines 的早期,此功能有一些问题:

  • 它允许用户定义定义中管道作者未显式定义的新变量。
  • 它允许用户替代系统变量。

为了纠正这些问题,我们定义了一个设置来限制可以在队列时间设置的变量。 启用此设置后,只能设置显式标记为“队列时间设置”的变量。 换句话说,可以在队列时设置任何变量,除非启用此设置。

此设置旨在在组织级别和项目级别工作。

  1. 组织级别。 设置处于打开状态时,会强制实施该设置,对于组织中所有项目中的所有管道,只能设置显式标记为“队列时可设置的可设置的变量”。 设置关闭时,每个项目都可以选择是否限制在队列时间设置的变量。 此设置是“组织设置 -> 管道 - 设置”> 下的切换开关。 只有项目集合管理员可以启用或禁用它。 限制可在组织级别排队时设置的变量的屏幕截图。
  2. 项目级别。 设置处于打开状态时,它会强制实施,对于项目中的所有管道,只能设置显式标记为“队列时可设置的可设置的变量”。 如果设置位于组织级别,则它适用于所有项目且无法关闭。 该设置是项目设置 -> 管道 -> 设置下的切换。 只有项目管理员才能启用或禁用它。 限制可在项目级别排队时设置的变量的屏幕截图。

让我们看看一个示例。 假设该设置处于打开状态,并且管道定义了一个名为在队列时无法设置的变量 my_variable在经典管道中定义变量的屏幕截图。

接下来,假设有人希望运行管道,并在队列时定义相同的变量 my_variable

在队列时重新定义经典管道中的变量的屏幕截图。

尝试运行管道时,将收到错误。 在队列时重新定义经典管道中的变量后运行管道时出错的屏幕截图。

备注

目前, 可在队列时间设置中设置的限制变量 仅涵盖在经典生成管道中显式定义的变量。

我们正在扩展 可在队列时间设置中设置的限制变量的范围, 以涵盖 YAML 和经典生成管道。 我们正在逐步推出这种扩大的覆盖范围。

推出完成后,设置处于打开状态:

  • 没有人能够在队列时定义任何新变量。 只能设置那些在队列时间显式标记为可设置的变量。

  • 将从“运行管道”面板中删除“添加变量”按钮。 推出完成后的“变量”选项卡的屏幕截图。

  • 生成 - 队列运行 - 运行管道 REST API 调用将失败,出现类似于

{
    "$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
}

parameters

与变量不同,管道参数在运行时管道无法更改。 参数具有数据类型,numberstring并且这些数据类型可以限制为值的子集。 当管道的用户可配置部分应仅从受约束列表中获取值时,限制参数非常有用。 安装程序可确保管道不会采用任意数据。

后续步骤

保护输入后,还需要保护 共享基础结构