创建和目标环境
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
本文介绍如何创建和定位 Azure Pipelines 环境。 环境是一个资源集合,可以通过管道中的部署来定位这些资源。
环境表示管道部署软件的逻辑目标。 典型的环境名称是开发、测试、QA、过渡和生产。
注意
经典管道中不提供 Azure DevOps 环境。 对于经典管道, 部署组 提供类似的功能。
环境具有以下优势:
部署历史记录。 将记录管道名称和运行详细信息,以便部署到环境及其资源。 在面向同一环境或资源的多个管道的上下文中,可以使用 环境的部署历史记录 来标识更改源。
提交和工作项的可跟踪性。 可以在面向环境的管道运行中查看作业。 还可以查看新部署到环境的提交和工作项。 通过可跟踪性,还可以跟踪代码更改提交或功能/bug 修复工作项是否已到达环境。
诊断资源运行状况。 可以验证应用程序是否在所需状态下运行。
安全性。 可以通过指定允许哪些用户和管道以环境为目标来保护环境。
环境是一组资源,其中资源本身表示实际部署目标。 Azure Pipelines 环境目前支持 Kubernetes 和 虚拟机 资源类型。
如果 YAML 管道引用了不存在的环境:
当执行该操作的用户已知且可以分配权限时,Azure Pipelines 会自动创建环境。
当 Azure Pipelines 没有有关用户执行操作的信息(例如,在从外部代码编辑器进行 YAML 更新中)时,管道将失败。
先决条件
若要添加环境,需要满足以下先决条件:
- Azure DevOps 组织和项目。
- 项目中环境的创建者角色。
创建环境
创建第一个环境:
在 Azure DevOps 组织中
https://dev.azure.com/{yourorganization}
登录并打开项目。选择“管道”>“环境”>“创建环境”。
输入环境信息,然后选择“创建”。 稍后可将资源添加到现有环境。
提示
可以创建一个空环境并从部署作业中引用它,以便可以记录针对环境的部署历史记录。
可以使用 Azure Pipelines 部署到环境。 有关详细信息,请参阅使用 Azure Pipelines 生成并部署到Azure Kubernetes 服务。
从部署作业中,将某个环境作为目标
部署作业是按顺序运行的步骤的集合。 可以使用部署作业以整个环境组的资源为目标,如以下示例 YAML 代码片段所示。 管道在计算机上 myVM
运行,因为指定了该资源名称。
- stage: deploy
jobs:
- deployment: DeployWeb
displayName: deploy Web App
pool:
vmImage: 'Ubuntu-latest'
# creates an environment if it doesn't exist
environment:
name: 'smarthotel-dev'
resourceName: myVM
resourceType: virtualMachine
strategy:
runOnce:
deploy:
steps:
- script: echo Hello world
针对部署作业中的特定环境资源
可以将部署目标限定为环境中的特定资源,以便可以在特定资源上记录部署历史记录。 部署作业的步骤会自动从部署作业目标的资源继承服务连接详细信息。
在以下示例中,自动从environment.resource
输入向下传递到任务的值kubernetesServiceConnection
。
environment:
name: 'smarthotel-dev.bookings'
strategy:
runOnce:
deploy:
steps:
- task: KubernetesManifest@0
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
namespace: $(k8sNamespace)
manifests: $(System.ArtifactsDirectory)/manifests/*
imagePullSecrets: $(imagePullSecret)
containers: $(containerRegistry)/$(imageRepository):$(tag)
使用手动审批检查
若要控制部署到生产环境的部署,Azure Pipelines 支持对环境进行手动审批检查。 资源所有者可以使用审批检查来控制管道中的某个阶段何时消耗资源。 资源所有者可以定义审批和检查,在消耗该资源的阶段开始之前,必须满足这些审批和检查。
环境 创建者、 管理员和 用户 角色(而不是 读者 角色)可以管理审批和检查。 作为环境所有者,可以使用审批检查手动控制阶段何时应运行。 有关详细信息,请参阅定义审批和检查。
查看运行详细信息中的环境
在管道运行详细信息的“环境”选项卡下,可以看到管道运行部署作业针对的所有环境。
注意
如果使用Azure Kubernetes 服务(AKS)专用群集,则“环境”选项卡不可用。
查看部署历史记录
可以在“Azure Pipelines 环境”部分选择“部署”选项卡以查看部署历史记录。
从面向特定环境的所有管道中查看作业。 例如,每个微服务都有自己的管道可以部署到同一环境。 部署历史记录有助于识别影响环境的所有管道,还有助于可视化每个管道的部署顺序。
若要向下钻取作业详细信息,请选择部署页上的 “更改 和 工作项 ”选项卡。 选项卡显示部署到环境的提交和工作项的列表。 每个列表项表示该部署中的新项。
在“更改”选项卡上,第一个列表包含指向该点的所有提交,以下列表仅包含该作业的更改。 如果多个提交绑定到同一作业,则“ 更改 ”选项卡上有多个结果。
如果多个工作项绑定到同一个作业,则“工作项”选项卡上有多个结果。
安全性
可以通过设置用户权限和管道权限来保护环境。
用户权限
可以控制谁可以使用用户权限创建、查看、使用和管理环境。 有四个角色:创建者具有所有环境、读取者、用户和管理员的范围。
若要使用环境的 “用户权限 ”面板添加用户,请转到要授权的特定 环境 ,选择“ 更多操作 ”图标,然后选择“ 安全性”。
在“安全”页的“用户权限”面板中,选择“添加”,然后选择“用户或组”和“合适的角色”。
在 “用户权限 ”面板中,还可以设置继承的权限,并替代环境的角色。
角色 | 说明 |
---|---|
创建者 | 全局角色,可从环境中心安全选项获取。 此角色的成员可以在项目中创建环境。 默认情况下,参与者会被添加为成员。 在不存在环境的情况下触发 YAML 管道所必需。 |
读者 | 此角色的成员可以查看环境。 |
用户 | 此角色的成员可以在创建或编辑 YAML 管道时使用环境。 |
管理员 | 此角色的成员可以管理权限、创建、管理、查看和使用环境。 在特定环境下会默认将创建者添加为管理员。 管理员还可以向所有管道开放环境的访问权限。 |
重要
创建环境时,只有创建者具有管理员角色。
角色 | 说明 |
---|---|
创建者 | 全局角色,可从环境中心安全选项获取。 此角色的成员可以在项目中创建环境。 默认情况下,参与者会被添加为成员。 在不存在环境的情况下触发 YAML 管道所必需。 |
读者 | 此角色的成员可以查看环境。 |
用户 | 此角色的成员可以在创建或编辑 YAML 管道时使用环境。 |
管理员 | 除了使用环境之外,此角色的成员还可以管理环境的所有其他角色的成员身份。 默认情况下,创建者会被添加为成员。 |
管道权限
使用“安全”页的“管道权限”面板来授权所有或选定的管道部署到环境。
若要删除对环境或资源的开放访问权限,请在管道权限中选择“限制”权限。
当权限受到限制时,可以允许特定管道部署到环境或特定资源。 从 + 要允许的管道列表中选择和选择。
常见问题解答
尝试创建环境时,为何会收到错误消息?
如果看到“访问被拒绝”消息:{User} 需要“创建”权限才能执行该操作,请转到“组织设置用户”>以检查你是否具有利益干系人角色。 利益干系人角色无法创建环境,因为利益干系人无权访问存储库。
更改访问级别,然后检查以查看是否可以创建环境。 有关详细信息,请参阅用户和权限管理常见问题解答。
为什么遇到无法找到环境的错误?
如果看到消息 “作业 XXXX:找不到环境 XXXX”。环境不存在或尚未获得使用授权。失败的原因有多种。
创建环境时运行时参数 不起作用,因为参数仅在运行时扩展。 可以使用 变量 创建环境或使用 templateContext 将属性传递给模板。
Azure Pipelines 可能没有有关创建环境的用户的信息。
引用 YAML 管道文件中不存在的环境时,Azure Pipelines 会在以下情况下自动创建环境:
- 在 Azure Pipelines Web 体验中使用 YAML 管道创建向导,并引用尚未创建的环境。
- 使用 Azure Pipelines Web 编辑器更新 YAML 文件,并在添加对环境的引用后保存管道。
在以下情况下,Azure Pipelines 没有有关用户创建环境的信息,因此管道会失败。
- 使用另一个外部代码编辑器更新 YAML 文件。
- 添加对不存在的环境的引用,然后触发手动或持续集成管道。
以前,Azure Pipelines 通过将所有项目参与者添加到环境的管理员角色来处理这些情况。 然后,项目的任何成员都可以更改这些权限,并阻止其他人访问环境。 为了防止此结果,Azure Pipelines 现在会失败这些作业。