管理变量组
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
本文介绍如何在 Azure Pipelines 中创建和使用变量组。 变量组存储您可以传递到 YAML 管道或在项目中的多个管道中提供的值和机密。
变量组中的机密变量是受保护的资源。 可以添加审批、检查和管道权限的组合,以限制对变量组中机密变量的访问。 对非机密变量的访问不受审批、检查和管道权限的限制。
变量组遵循库安全模型的角色和权限。
创建变量组
可以为项目中的管道运行创建变量组。
注意
要创建一个机密变量组以将 Azure 密钥保管库中的机密链接为变量,请按照链接 Azure 密钥保管库中的机密中的说明进行操作。
可以在 Azure Pipelines 用户界面中创建变量组。
先决条件
拥有创建管道和变量权限的 Azure DevOps 组织和项目。
创建变量组
在 Azure DevOps 项目中,从左侧菜单中选择管道>库。
在“库”页上,选择“+ 变量组”。
在新变量组页面的“属性”下,输入变量组的名称和可选描述。
在“变量”下,选择“+ 添加”,然后输入要包含在组中的变量名称和值。 如果想要加密并安全地存储该值,请选择变量旁边的锁定图标。
选择“+ 添加”以添加每个新变量。 添加完变量后,选择“保存”。
现在就可以在项目管道中使用此变量组。
链接 Azure Key Vault 中的机密
可以创建一个链接到现有 Azure 密钥库的变量组,并将选定的密钥库机密映射到变量组。 只有机密名称会被映射到变量组中,而机密值不会被映射到变量组中。 链接到变量组的管道运行会从存储库中获取最新的机密值。
对密钥保管库中现有机密所做的任何更改,都会自动提供给使用该变量组的所有管道。 但是,如果在保管库中添加或删除机密,则相关的变量组不会自动更新。 必须显式更新要包含在变量组中的机密。
虽然密钥保管库支持在 Azure 中存储和管理加密密钥和证书,但 Azure Pipelines 变量组集成仅支持映射密钥保管库机密。 不支持加密密钥和证书。
注意
不支持使用 Azure 基于角色的访问控制l (Azure RBAC) 的 Azure 保管库。
先决条件
创建变量组
- 在 Azure DevOps 项目中,选择管道>库>+ 变量组。
- 在“变量组”页面中,输入变量组的名称和可选描述。
- 启用链接 Azure Key Vault 中的机密作为变量切换。
- 选择 Azure 订阅终结点和密钥保管库名称。
- 通过选择保管库名称旁边的“授权”,使 Azure DevOps 能够访问密钥保管库。
- 在“选择机密”屏幕上,从保管库中选择特定机密以映射到此变量组,然后选择“确定”。
- 选择“保存”以保存机密变量组。
注意
Azure 服务连接必须在密钥保管库上至少拥有 Get 和 List 权限,可以在前面的步骤中进行授权。 也可以通过以下步骤从 Azure 门户提供这些权限:
- 打开密钥保管库的“设置”,然后选择访问配置>转到访问策略。
- 在“访问策略”页上,如果 Azure Pipelines 项目未在“应用程序”下至少具有 Get 和 List 权限,请选择“创建”。
- 在“机密权限”下,选择 Get 和 List,然后选择“下一步”。
- 选择“服务主体”,然后“下一步”。
- 再次选择“下一步”,查看设置,然后选择“创建”。
有关详细信息,请参阅使用 Azure 密钥保管库机密。
更新变量组
可以使用 Azure Pipelines 用户界面更新变量组。
- 在 Azure DevOps 项目中,从左侧菜单中选择管道>库。
- 在“库”页面上,选择要更新的变量组。 也可以将鼠标悬停在变量组列表上,选择“更多选项”图标,然后从菜单中选择“编辑”。
- 在变量组页面中,更改任何属性,然后选择“保存”。
删除变量组
可以在 Azure Pipelines 用户界面中删除变量组。
- 在 Azure DevOps 项目中,从左侧菜单中选择管道>库。
- 在“库”页面上,将鼠标悬停在要删除的变量组上,然后选择“更多选项”图标。
- 从菜单中选择“删除”,然后在确认屏幕上选择“删除”。
管理变量组中的变量
可以使用 Azure Pipelines 用户界面更改、添加或删除变量组中的变量。
- 在 Azure DevOps 项目中,从左侧菜单中选择管道>库。
- 在“库”页面上,选择要更新的变量组。 也可以将鼠标悬停在变量组列表上,选择“更多选项”图标,然后从菜单中选择“编辑”。
- 在变量组页面上可以:
- 更改任何变量名或变量值。
- 选择变量名旁边的垃圾桶图标,删除任何变量。
- 选择变量值旁边的锁定图标,将变量更改为机密或非机密变量。
- 通过选择“+ 添加”以添加新的变量。
- 进行更改后,请选择“保存”。
在管道中使用变量组
可以在 YAML 或经典管道中使用变量组。 对变量组所做的更改会自动提供给该变量组所链接的所有定义或阶段。
在 YAML 管道中使用变量组
一旦授权 YAML 管道使用变量组,就可以在管道中使用变量组或其中的变量。
授权 YAML 管道使用变量组
如果仅在 YAML 管道中指定变量组,任何可以将代码推送到存储库的人都可以提取变量组中机密的内容。 因此,要在 YAML 管道中使用变量组,必须授权管道使用该组。 经典管道可以使用变量组,无需单独授权。
可以使用 Azure Pipelines 用户界面授权管道使用变量组。
- 在 Azure DevOps 项目中,从左侧菜单中选择管道>库。
- 在“库”页面上,选择要授权的变量组。
- 在变量组页面上,选择“管道权限”选项卡。
- 在“管道权限”屏幕上选择 +,然后选择要授权的管道。 或者,选择“更多操作”图标,选择“打开访问权限”,然后再次选择“打开访问权限”以进行确认。
选择管道后,该管道就有权使用变量组。 要授权另一个管道,请再次选择 + 图标。 选择“开放访问”可授权所有项目管道使用变量组。 如果组中没有任何机密,开放访问可能是不错的选择。
另一种授权变量组的方法是选择管道,选择“编辑”,然后手动将生成排队。 此时会出现一个资源授权错误,然后可以显式地将管道添加为变量组的授权用户。
在 YAML 管道中使用变量组
要使用变量组中的变量,请在 YAML 管道文件中添加对变量组名称的引用。 然后就可以在文件中使用变量组中的变量了。
variables:
- group: my-variable-group
可以在同一管道中引用多个变量组。 如果多个变量组包含同一个变量,文件中使用该变量的最后一个变量组将设置该变量的值。 有关变量优先级的详细信息,请参阅变量的扩展。
还可以在模板中引用变量组。 以下 variables.yml 模板文件引用了变量组 my-variable-group
。 变量组包括名为 myhello
的变量。
variables:
- group: my-variable-group
YAML 管道会引用 variables.yml 模板,并使用变量组 my-variable-group
中的变量 $(myhello)
。
stages:
- stage: MyStage
variables:
- template: variables.yml
jobs:
- job: Test
steps:
- script: echo $(myhello)
在 YAML 管道中使用变量组变量
访问链接变量组中变量值的方式与访问管道中定义的变量相同。 例如,要访问链接到管道的变量组中名为 customer
的变量的值,可以在任务参数或脚本中使用 $(customer)
。
如果在管道文件中同时使用独立变量和变量组,请对独立变量使用 name
-value
语法。
variables:
- group: my-variable-group
- name: my-standalone-variable
value: 'my-standalone-variable-value'
要引用变量组中的变量,可以使用宏语法或运行时表达式。 在下面的示例中,组 my-variable-group
具有名为 myhello
的变量。
要使用运行时表达式:
variables:
- group: my-variable-group
- name: my-passed-variable
value: $[variables.myhello]
- script: echo $(my-passed-variable)
要使用宏语法:
variables:
- group: my-variable-group
steps:
- script: echo $(myhello)
无法直接在脚本中访问秘密变量,包括加密变量和密钥保管库变量。 必须将这些变量作为参数传递给任务。 有关详细信息,请参阅机密变量。
在经典管道中使用变量组
经典管道可以使用变量组,无需单独授权。 要使用变量组:
打开经典管道。
选择变量>变量组,然后选择“链接变量组”。
在生成管道中,可以看到可用组的列表。 将变量组链接到管道。 组中的所有变量都可在管道中使用。
在发布管道中,还会看到管道中阶段的下拉列表。 将变量组链接到管道本身,或者链接到发布管道的一个或多个特定阶段。 如果链接到一个或多个阶段,则变量组中的变量仅限于这些阶段,并且在发布的其他阶段无法访问。
当在多个作用域中设置同名变量时,将使用以下优先级(最高优先级排在首位):
- 在排队时设置的变量
- 管道中设置的变量
- 变量组中设置的变量
有关变量优先级的详细信息,请参阅变量的扩展。
注意
链接到同一作用域(例如作业或阶段)中的管道的不同组中的变量将出现冲突,结果可能不可预知。 确保对所有变量组的变量使用不同的名称。