你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本教程介绍如何将 Azure 部署环境集成到 CI/CD 管道中。 可以使用支持 CI/CD 的任何 GitOps 提供程序,例如 GitHub Actions、Azure Arc、GitLab 或 Jenkins。
持续集成和持续交付 (CI/CD) 是一种软件开发方法,可帮助团队自动执行编译、测试和部署软件更改的过程。 CI/CD 使你能够更频繁、更自信地发布软件更改。
将使用具有以下三个分支的工作流:main、dev 和 test。
- main 分支始终被视为生产分支。
- 从 main 分支创建 feature 分支。
- 创建拉取请求以将 feature 分支合并到 main。
本教程中的工作流是一个简化的示例。 实际工作流可能更加复杂。
在开始本教程之前,可以通过查看 Azure 部署环境的关键概念来熟悉部署环境组件和概念。
本教程中,您将学习如何:
- 创建和配置开发人员中心
- 创建密钥保管库
- 创建和配置 GitHub 存储库
- 将目录添连接到开发人员中心
- 配置部署标识
- 配置 GitHub 环境
- 测试 CI/CD 管道
先决条件
| 产品 | 要求 |
|---|---|
| 蔚蓝 | - Azure 订阅。 - Azure 订阅的所有者权限。 - 已安装 Azure CLI。 |
| Git | 一个 GitHub 帐户。 - 已安装 Git。 |
1.创建和配置开发人员中心
在本部分,你将创建具有三种环境类型(Dev、Test 和 Prod)的 Azure 部署环境开发人员中心和项目。
- Prod 环境类型包含单个生产环境。
- 在 Dev 中为每个功能分支创建一个新环境。
- 在 Test 中为每个拉取请求创建一个新环境。
1.1 设置 Azure CLI
首先,登录到 Azure。 运行以下命令,然后按照提示完成身份验证过程:
az login
接下来,安装 Azure CLI 的开发人员中心扩展:
az extension add --name devcenter --upgrade
安装当前扩展后,注册 Microsoft.DevCenter 命名空间:
az provider register --namespace Microsoft.DevCenter
小提示
在本教程中,你需要将多个值保存为环境变量,供稍后使用。 建议将这些值记录在其他位置,以确保在需要时可以使用。
获取你的用户 ID 并将其设置为环境变量供稍后使用:
MY_AZURE_ID=$(az ad signed-in-user show --query id -o tsv)
检索当前订阅的订阅 ID:
AZURE_SUBSCRIPTION_ID=$(az account show --query id --output tsv)
检索当前租户的租户 ID:
AZURE_TENANT_ID=$(az account show --query tenantId --output tsv)
设置以下环境变量:
LOCATION="eastus"
AZURE_RESOURCE_GROUP=<resourceGroupName>
AZURE_DEVCENTER=<devcenterName>
AZURE_PROJECT=<projectName>
AZURE_KEYVAULT=<keyVaultName>
注释
必须使用全局唯一的密钥保管库名称。 否则,可能会收到以下错误:
Code: VaultAlreadyExists Message: The vault name 'mykeyvaultname' is already in use. Vault names are globally unique so it is possible that the name is already taken.
1.2 创建开发人员中心
开发人员中心汇集了具有类似设置的项目和环境。 开发人员中心提供对可用于创建环境的模板和工件目录的访问权限。 开发人员中心还提供管理对环境和项目的访问权限的方法。
创建资源组:
az group create \
--name $AZURE_RESOURCE_GROUP \
--location $LOCATION
创建开发人员中心:
az devcenter admin devcenter create \
--name $AZURE_DEVCENTER \
--identity-type SystemAssigned \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION
上一个命令输出 JSON。 将 id 和 identity.principalId 的值保存为环境变量,供稍后使用:
AZURE_DEVCENTER_ID=<id>
AZURE_DEVCENTER_PRINCIPAL_ID=<identity.principalId>
1.3 在订阅上分配开发人员中心标识所有者角色
开发人员中心需要权限才能在与环境类型关联的订阅上分配角色。
为了降低不必要的复杂性,在本教程中,开发人员中心和所有环境类型使用单个订阅。 实际上,开发人员中心和目标部署订阅可能是应用了不同策略的单独订阅。
az role assignment create \
--scope /subscriptions/$AZURE_SUBSCRIPTION_ID \
--role Owner \
--assignee-object-id $AZURE_DEVCENTER_PRINCIPAL_ID \
--assignee-principal-type ServicePrincipal
1.4 创建环境类型
在开发人员中心级别,环境类型定义开发团队可以创建的环境,例如开发、测试、沙盒、预生产和生产环境。
创建三个新环境类型:Dev、Test 和 Prod:
az devcenter admin environment-type create \
--name Dev \
--resource-group $AZURE_RESOURCE_GROUP \
--dev-center $AZURE_DEVCENTER
az devcenter admin environment-type create \
--name Test \
--resource-group $AZURE_RESOURCE_GROUP \
--dev-center $AZURE_DEVCENTER
az devcenter admin environment-type create \
--name Prod \
--resource-group $AZURE_RESOURCE_GROUP \
--dev-center $AZURE_DEVCENTER
1.5 创建项目
项目是开发团队的访问点。 每个项目都与一个开发中心相关联。
创建项目:
az devcenter admin project create \
--name $AZURE_PROJECT \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION \
--dev-center-id $AZURE_DEVCENTER_ID
上一个命令输出 JSON。 将 id 值保存为环境变量,供稍后使用:
AZURE_PROJECT_ID=<id>
为自己分配项目的“DevCenter 项目管理员角色”:
az role assignment create \
--scope "$AZURE_PROJECT_ID" \
--role "DevCenter Project Admin" \
--assignee-object-id $MY_AZURE_ID \
--assignee-principal-type User
1.6 创建项目环境类型
在项目级别,平台工程师指定适合开发团队的环境类型。
为在开发人员中心创建的每个环境类型创建新的项目环境类型:
az devcenter admin project-environment-type create \
--name Dev \
--roles "{\"b24988ac-6180-42a0-ab88-20f7382dd24c\":{}}" \
--deployment-target-id /subscriptions/$AZURE_SUBSCRIPTION_ID \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION \
--project $AZURE_PROJECT \
--identity-type SystemAssigned \
--status Enabled
az devcenter admin project-environment-type create \
--name Test \
--roles "{\"b24988ac-6180-42a0-ab88-20f7382dd24c\":{}}" \
--deployment-target-id /subscriptions/$AZURE_SUBSCRIPTION_ID \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION \
--project $AZURE_PROJECT \
--identity-type SystemAssigned \
--status Enabled
az devcenter admin project-environment-type create \
--name Prod \
--roles "{\"b24988ac-6180-42a0-ab88-20f7382dd24c\":{}}" \
--deployment-target-id /subscriptions/$AZURE_SUBSCRIPTION_ID \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION \
--project $AZURE_PROJECT \
--identity-type SystemAssigned \
--status Enabled
2.创建密钥保管库
在本部分,你将创建新的密钥保管库。 本教程稍后将使用此密钥保管库从 GitHub 保存个人访问令牌。
az keyvault create \
--name $AZURE_KEYVAULT \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION \
--enable-rbac-authorization true
同样,将上一命令的 JSON 输出中的 id 保存为环境变量:
AZURE_KEYVAULT_ID=<id>
为自己分配新密钥保管库的“密钥保管库管理员”角色:
az role assignment create \
--scope $AZURE_KEYVAULT_ID \
--role "Key Vault Administrator" \
--assignee-object-id $MY_AZURE_ID \
--assignee-principal-type User
为开发人员中心的标识分配“密钥保管库机密用户”角色:
az role assignment create \
--scope $AZURE_KEYVAULT_ID \
--role "Key Vault Secrets User" \
--assignee-object-id $AZURE_DEVCENTER_PRINCIPAL_ID \
--assignee-principal-type ServicePrincipal
3.创建和配置 GitHub 存储库
在本部分,你将创建新的 GitHub 存储库来存储目录。 Azure 部署环境同时支持 GitHub 和 Azure DevOps 存储库。 在本教程中,你将使用 GitHub。
3.1 创建 GitHub 存储库
在此步骤,你将在 GitHub 帐户中创建一个具有预定义目录结构、分支和文件的新存储库。 这些项是从示例模板存储库生成的。
基于示例模板生成新的 GitHub 存储库:
如果没有付费 GitHub 帐户,请将存储库设置为“公共”。
选择“创建存储库”。
3.2 保护存储库的 main 分支
可以通过设置分支保护规则来保护重要分支。 保护规则定义协作者是否可以删除分支或强制推送到分支。 这些规则还针对推送到分支的操作设置了要求,例如传递状态检查或强制实施线性提交历史记录。
注释
受保护的分支可以在 GitHub Free 和组织的 GitHub Free 公共存储库中使用,也可以在 GitHub Pro、GitHub Team、GitHub Enterprise Cloud 和 GitHub Enterprise Server 的公共和私有存储库中使用。 有关详细信息,请参阅 GitHub 计划。
如果尚未打开,请转到存储库的主页。
在窗口顶部的菜单中选择“设置”:
在左边栏的“代码和自动化”部分,选择“分支”:
在“分支保护规则”下,选择“添加分支规则集”:
在“新建分支规则集”页面的“规则集名称”中,输入“CI-CD-tutorial-ruleset”:
在“目标分支”下选择“添加目标”,然后选择“包括默认分支”或“包括所有分支”:
在“分支规则”下,选择“合并前需要拉取请求”:
(可选)可以启用更多保护规则。
选择 创建。
3.3 配置存储库变量
在边栏的“安全性”部分选择“机密和变量”,然后选择“操作”:
选择“变量”选项卡。
对于下表中的每个项:
- 选择“新建存储库变量”。
- 在“名称”字段中,输入变量名称。
- 在“值”字段中,输入表中描述的值。
- 选择“添加变量”。
变量名称 变量值 AZURE_DEVCENTER 你的开发人员中心名称 AZURE_PROJECT 你的项目名称 AZURE_CATALOG 设置为“环境” AZURE_CATALOG_ITEM 设置为“函数应用” AZURE_SUBSCRIPTION_ID Azure 订阅 ID AZURE_TENANT_ID 你的 Azure 租户 ID
3.4 创建 GitHub 个人访问令牌
接下来,创建细粒度个人访问令牌,使 Azure 部署环境开发人员中心能够连接到存储库并使用环境目录。
注释
可以在反馈论坛中留下有关精细个人访问令牌的反馈。
在 GitHub.com 上任意页面的右上角,选择你的个人资料照片,然后选择“设置”。
在左侧边栏中,选择“开发人员设置”。
在左侧边栏中的“个人访问令牌”下,选择“细粒度令牌”,然后选择“生成新令牌”:
在“新建精细个人访问令牌”页面上的“令牌名称”下,输入令牌的名称。
在“过期时间”下,选择令牌的过期时间。
在“资源所有者”下,选择你的 GitHub 用户名。
在“存储库访问权限”下,选择“仅选择存储库”。 在“选定的存储库”下,搜索并选择你创建的存储库:
在“权限”下选择“存储库权限”,然后将“内容”更改为“只读”:
选择“生成令牌”。
请复制并保存你的个人访问令牌。 以后再也无法查看它。
3.5 将个人访问令牌保存到密钥保管库
接下来,将个人访问令牌保存为名为 pat 的密钥保管库机密:
az keyvault secret set \
--name pat \
--vault-name $AZURE_KEYVAULT \
--value <personalAccessToken>
4.将目录添连接到开发人员中心
在 Azure 部署环境中,目录是包含一组环境定义的存储库。 目录项由基础结构即代码 (IaC) 模板和充当清单的环境文件组成。 模板定义环境,环境文件提供有关模板的元数据。 开发团队使用目录中的环境定义来创建环境。
用于创建 GitHub 存储库的模板包含 Environments 文件夹中的目录。
将目录添加到开发人员中心
在以下命令中,请将 < Organization/Repository > 替换为你的 GitHub 组织和存储库名称:
az devcenter admin catalog create \
--name Environments \
--resource-group $AZURE_RESOURCE_GROUP \
--dev-center $AZURE_DEVCENTER \
--git-hub path="/Environments" branch="main" secret-identifier="https://$AZURE_KEYVAULT.vault.azure.net/secrets/pat" uri="https://github.com/< Organization/Repository >.git"
5.配置部署标识
使用 GitHub Actions 进行 OpenID Connect 是一种身份验证方法,它使用生存期较短的令牌来增强安全性。 建议使用这种方法向 Azure 验证 GitHub Actions。
还可以直接使用机密对服务主体进行身份验证,但这不在本教程的范围内。
5.1 配置部署标识
为三种环境类型中的每一种注册 Microsoft Entra 应用程序和服务主体。
为 Dev 创建 Microsoft Entra 应用程序:
az ad app create --display-name "$AZURE_PROJECT-Dev"此命令输出 JSON,其中包含在创建具有 Graph API 的联合凭据时使用的
id以及appId(也称为客户端 ID)。设置以下环境变量:
DEV_AZURE_CLIENT_ID=<appId> DEV_APPLICATION_ID=<id>针对 Test 重复上述步骤:
az ad app create --display-name "$AZURE_PROJECT-Test"TEST_AZURE_CLIENT_ID=<appId> TEST_APPLICATION_ID=<id>再次针对 Prod 重复上述步骤:
az ad app create --display-name "$AZURE_PROJECT-Prod"PROD_AZURE_CLIENT_ID=<appId> PROD_APPLICATION_ID=<id>为每个应用程序创建服务主体。
运行以下命令为 Dev 创建新服务主体:
az ad sp create --id $DEV_AZURE_CLIENT_ID此命令使用不同的
id生成 JSON 输出,将在下一步中使用。设置以下环境变量:
DEV_SERVICE_PRINCIPAL_ID=<id>针对 Test 重复上述步骤:
az ad sp create --id $TEST_AZURE_CLIENT_IDTEST_SERVICE_PRINCIPAL_ID=<id>再次针对 Prod 重复上述步骤:
az ad sp create --id $PROD_AZURE_CLIENT_IDPROD_SERVICE_PRINCIPAL_ID=<id>运行以下命令,为每个 Microsoft Entra 应用程序创建新的联合标识凭据。
在以下三个命令中,将
< Organization/Repository >替换为 GitHub 组织和存储库名称。为 Dev 创建联合标识凭据:
az rest --method POST \ --uri "https://graph.microsoft.com/beta/applications/$DEV_APPLICATION_ID/federatedIdentityCredentials" \ --body '{"name":"ADEDev","issuer":"https://token.actions.githubusercontent.com","subject":"repo:< Organization/Repository >:environment:Dev","description":"Dev","audiences":["api://AzureADTokenExchange"]}'为 Test 创建凭据:
az rest --method POST \ --uri "https://graph.microsoft.com/beta/applications/$TEST_APPLICATION_ID/federatedIdentityCredentials" \ --body '{"name":"ADETest","issuer":"https://token.actions.githubusercontent.com","subject":"repo:< Organization/Repository >:environment:Test","description":"Test","audiences":["api://AzureADTokenExchange"]}'为 Prod 创建凭据:
az rest --method POST \ --uri "https://graph.microsoft.com/beta/applications/$PROD_APPLICATION_ID/federatedIdentityCredentials" \ --body '{"name":"ADEProd","issuer":"https://token.actions.githubusercontent.com","subject":"repo:< Organization/Repository >:environment:Prod","description":"Prod","audiences":["api://AzureADTokenExchange"]}'
5.2 将角色分配给部署标识
为每个部署标识分配项目的“读取者”角色:
az role assignment create \ --scope "$AZURE_PROJECT_ID" \ --role Reader \ --assignee-object-id $DEV_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipalaz role assignment create \ --scope "$AZURE_PROJECT_ID" \ --role Reader \ --assignee-object-id $TEST_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipalaz role assignment create \ --scope "$AZURE_PROJECT_ID" \ --role Reader \ --assignee-object-id $PROD_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipal为每个部署标识分配对应的环境类型的“部署环境用户”角色:
az role assignment create \ --scope "$AZURE_PROJECT_ID/environmentTypes/Dev" \ --role "Deployment Environments User" \ --assignee-object-id $DEV_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipalaz role assignment create \ --scope "$AZURE_PROJECT_ID/environmentTypes/Test" \ --role "Deployment Environments User" \ --assignee-object-id $TEST_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipalaz role assignment create \ --scope "$AZURE_PROJECT_ID/environmentTypes/Prod" \ --role "Deployment Environments User" \ --assignee-object-id $PROD_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipal
6.配置 GitHub 环境
在 GitHub 环境中,可以使用保护规则和机密配置环境。 引用环境的工作流作业在运行或访问环境的机密之前,必须遵守该环境的所有保护规则。
创建映射到 Azure 部署环境项目中的环境类型的 Dev、Test 和 Prod 环境。
注释
环境、环境机密和环境保护规则在所有产品的公共存储库中均可用。 若要访问专用存储库或内部存储库中的环境、环境机密和部署分支,必须使用 GitHub Pro、GitHub Team 或 GitHub Enterprise。 若要访问专用存储库或内部存储库中的其他环境保护规则,必须使用 GitHub Enterprise。 有关详细信息,请参阅 GitHub 计划。
6.1 创建 Dev 环境
在 GitHub 中,转到存储库的主页。
在存储库名称下,选择“设置”。 如果未看到“设置”选项卡,请选择“...”下拉菜单,然后选择“设置”。
在左侧边栏中,选择“环境”。
选择“新建环境”,输入“Dev”作为环境名称,然后选择“配置环境”:
在“环境机密”下选择“添加环境机密”,然后在“名称”框中输入“AZURE_CLIENT_ID”。
在“值”框中,输入前面创建的“Dev”Microsoft Entra 应用的客户端 ID (
appId)(已另存为$DEV_AZURE_CLIENT_ID环境变量):选择“添加机密”。
6.2 创建 Test 环境
在左侧边栏中选择“环境”,返回到环境主页。
选择“新建环境”,输入“Test”作为环境名称,然后选择“配置环境”。
在“环境机密”下选择“添加环境机密”,然后在“名称”框中输入“AZURE_CLIENT_ID”。
在“值”框中,输入前面创建的“Test”Microsoft Entra 应用的客户端 ID (
appId)(已另存为$TEST_AZURE_CLIENT_ID环境变量)。选择“添加机密”。
6.3 创建 Prod 环境
再次在左侧边栏中选择“环境”,返回到环境主页。
选择“新建环境”,输入“Prod”作为环境名称,然后选择“配置环境”。
在“环境机密”下选择“添加环境机密”,然后在“名称”框中输入“AZURE_CLIENT_ID”。
在“值”框中,输入前面创建的“Prod”Microsoft Entra 应用的客户端 ID (
appId)(已另存为$PROD_AZURE_CLIENT_ID环境变量)。选择“添加机密”。
接下来,将自己设置为此环境的必需审阅者。 尝试部署到 Prod 时,GitHub Actions 会等待批准后再开始部署。 当作业正在等待批准时,其状态为“等待中”。 如果作业在 30 天内未获得批准,会自动失败。
有关环境和所需批准的详细信息,请参阅使用环境进行部署。
选择“所需审查者”。
搜索并选择你的 GitHub 用户名。 最多可输入 6 个人员或团队。 只需指定一名审查者即可批准该作业,使其可继续进行。
选择“保存保护规则”。
最后,将 main 配置为部署分支:
在“部署分支和标记”列表中,选择“选定的分支和标记”。
选择“添加部署分支或标记规则”,确保已选择“引用类型: 分支”,然后在“名称模式”框中输入“main”。
选择“添加规则”。
7.测试 CI/CD 管道
在本部分,你将对存储库进行一些更改并测试 CI/CD 管道。
7.1 克隆存储库
在 Git Bash 中,使用
cd切换到你要将存储库克隆到的本地文件夹。克隆存储库。 在以下命令中,确保将
< Organization/Repository >替换为 GitHub 组织和存储库名称。git clone https://github.com/< Organization/Repository >.git导航到克隆的目录:
cd <repository>创建一个新分支并将其远程发布:
git checkout -b feature1git push -u origin feature1将在 Azure 中创建特定于此分支的新环境。
在 GitHub 中,转到新建的存储库的主页。
在存储库名称下,选择“操作”:
你将会看到新的“创建环境”工作流正在运行。
7.2 更改代码
在 Visual Studio Code 中打开本地克隆的存储库。
在 ADE.Tutorial 文件夹中,对文件进行更改。
保存所做更改。
7.3 推送更改以更新环境
暂存更改并推送到
feature1分支:git add . git commit -m '<commit message>' git push在存储库的“操作”页上,可以看到一个新的“更新环境”工作流正在运行。
7.4 创建拉取请求
创建 GitHub 拉取请求
main <- feature1。在存储库的“操作”页面上,你会看到已启动新的工作流来创建特定于拉取请求的环境。 使用“Test”环境类型。
7.5 合并拉取请求
在 GitHub 中,转到你创建的拉取请求。
合并该拉取请求。
更改将发布到生产环境中,并删除分支和拉取请求环境。
清理资源
如果不打算使用已创建的任何资源,请删除它们,以免继续产生费用。 如果已将示例应用程序部署在其他资源组中,可能需要重复以下步骤。
若要使用 Azure 门户删除资源:
选择左上角的菜单按钮,然后选择“资源组”。
从列表中选择你创建的资源组。
选择“删除资源组”。
输入资源组名称。 然后选择“删除”。
若要使用 Azure CLI 删除资源,请输入以下命令:
az group delete --name <my-dev-center-rg>
请记住,删除资源组会删除其中的所有资源。














