练习 - 使用 GitHub Actions 将 ARM 模板部署为 CI/CD 工作的一部分
在这里,从 GitHub Actions 工作流部署 Azure 资源管理器 (ARM) 模板。
重要
在 Microsoft Learn 环境之外执行此练习。 本练习要求你拥有自己的 Azure 订阅,并且可能会产生费用。 这是必需的,因为你将需要创建沙盒订阅中不支持的服务主体。 如果还没有 Azure 订阅,请在开始之前创建 一个免费帐户 。
创建 GitHub 帐户和存储库
首先,如果没有 GitHub 帐户,请在 GitHub 帐户创建页上立即创建一个。 (这是免费的。
拥有帐户后,登录并创建一个新存储库,可以在其中将模板保留为基础结构即代码(IaC)模型的一部分。 若要创建存储库(通常称为行业中的 存储库 ),请执行以下步骤:
在 GitHub 站点上任何页面的右上角,使用 + 下拉菜单并选择“ 新建存储库”。 或者,选择绿色的 “创建存储库 ”按钮(如果存在)。
输入存储库的简短、难忘的名称。 例如,使用 Deploy-ARM-Template。 可以选择性地添加存储库的说明。 例如,使用 通过 GitHub Actions 部署我的第一个 ARM 模板。
选择存储库可见性设置。 互联网上的所有人都可以访问公共存储库。 专用存储库仅可供你和显式共享访问权限的人员访问。 (两者均适用于这项练习。)
在 “使用:初始化此存储库”下,选择 “添加自述文件”。
选择“创建存储库”。
你创建了存储库,并使用自述文件对其进行初始化。 是时候将模板和模板参数文件提交到存储库了。
注释
自述文件是更详细地描述项目或添加一些文档(例如如何安装或使用项目)的绝佳位置。 README 文件的内容会自动显示在存储库的首页上。
将 ARM 模板文件提交到存储库
在 GitHub 上,转到存储库的主页。
在文件列表上方的 “添加文件 ”下拉列表中,选择“ 创建新文件”。
在文件名字段中,输入模板的名称和扩展名。 在我们的练习中,请使用名称 azuredeploy.json。 将以下模板复制并粘贴到新的 GitHub 文件中。
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "VnetName": { "type": "string", "defaultValue": "VNet-001", "metadata": { "description": "Virtual Network Name" } }, "CostCenterIO": { "type": "string", "defaultValue": "12345", "metadata": { "description": "Cost Center IO number for cross billing" } }, "OwnerName": { "type": "string", "defaultValue": "John Smith", "metadata": { "description": "Name of the stakeholder responsible for this resource" } } }, "variables": {}, "resources": [ { "apiVersion": "2018-10-01", "type": "Microsoft.Network/virtualNetworks", "name": "[parameters('VnetName')]", "___location": "[resourceGroup().___location]", "tags": { "CostCenter": "[parameters('CostCenterIO')]", "Owner": "[parameters('OwnerName')]" }, "properties": { "addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] }, "enableVmProtection": false, "enableDdosProtection": false, "subnets": [ { "name": "subnet001", "properties": { "addressPrefix": "10.0.0.0/24" } }, { "name": "subnet002", "properties": { "addressPrefix": "10.0.1.0/24" } } ] } } ] }
在 “提交新文件 ”部分添加说明,然后选择 “提交新文件 ”以将其保存到存储库。
在 GitHub Actions 和 Azure 订阅之间配置身份验证
若要使用 GitHub Actions 将任何资源部署到 Azure,需要创建 Azure 服务主体,并向其授予创建模板中定义的资源的权限。 登录到订阅后,将在 Azure 门户的 Azure Cloud Shell 部分中执行该步骤。
创建服务主体
若 GitHub Actions 工作流的主体要部署 Azure 资源,则需要正确的内置参与者。
以下 Azure CLI 脚本演示如何在 Azure 资源组中生成具有参与者权限的 Azure 服务主体。 此资源组是工作流部署 ARM 模板中定义的资源的位置。
projectName="GitHubActionExercise"
___location="eastus"
resourceGroupName="${projectName}-rg"
appName="http://${projectName}"
# Create the resource group
az group create --name $resourceGroupName --___location $___location
# Store the resource group ID in a variable
scope=$(az group list --query "[?contains(name, '$resourceGroupName')].id" -o tsv)
# Create the service principal with contributor rights to the resource group we just created
az ad sp create-for-rbac --name $appName --role Contributor --scopes $scope --sdk-auth
在门户中,登录订阅时,选择 Cloud Shell 图标以在页面底部打开 shell。
在 shell 中,使用前面的代码创建服务主体。 你将获得以下结果。 复制结果的 JSON 部分(以下屏幕截图中的红色框中的内容),因为在 GitHub 中配置机密时需要它。
通过执行 GitHub 中的以下步骤,复制 JSON 输出并将其存储为 GitHub 存储库中的 GitHub 机密:在 GitHub 存储库中,选择 “设置” 选项卡。在左侧菜单中,选择“ 机密 ”下拉列表,然后选择 “Codespaces”。
输入以下值,然后选择 “添加机密”
- 名称:输入 AZURE_CREDENTIALS。
- 机密:粘贴之前复制的 JSON 输出。
需要此信息才能在工作流中指定身份验证。
创建工作流
工作流文件必须存储在存储库根目录的 .github/workflows 文件夹中。 工作流文件扩展名可以是.yml或 .yaml。
可以创建工作流文件,然后将文件推送/上传到存储库。 或者,可以使用以下过程在 GitHub 界面中创建它:
从你的 GitHub 存储库顶部菜单中选择 “操作”,然后选择 “自行设置工作流”。
如果更喜欢其他名称而不是main.yml,请重命名工作流文件。 例如,使用 deployARMTemplate.yml。
将.yml文件的内容替换为以下代码。
注释
GitHub 市场具有一些自定义生成的操作,可用于部署 ARM 模板。 本模块使用名为 “部署 Azure 资源管理器”(ARM)模板的市场提供程序。
name: Deploy ARM Template on: push: branches: - main env: AZURE_SUBSCRIPTION_ID: << Subscription Id >> # set this to your Azure Subscription Id AZURE_RESOURCE_GROUP: GitHubActionExercise-rg # set this to your target resource group jobs: deploy-virtual-network-template: runs-on: ubuntu-latest steps: - name: Checkout source code uses: actions/checkout@main - name: Login to Azure uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: Deploy ARM Template uses: azure/arm-deploy@v1 with: scope: resourcegroup subscriptionId: ${{ env.AZURE_SUBSCRIPTION_ID }} resourceGroupName: ${{ env.AZURE_RESOURCE_GROUP }} template: ./azuredeploy.json
工作流文件有三个部分。
name
:工作流的名称。on
:触发工作流的 GitHub 事件的名称。 当推送事件位于主分支上并修改主分支上的至少一个文件时,将触发工作流。jobs
:工作流运行由一个或多个作业组成。 只有一个作业的名称为deploy-virtual-network-template
。 此作业有三个步骤。- 查看源代码。
- 登录到 Azure。
- 部署 ARM 模板。
重要
验证表达式
creds: ${{ secrets.AZURE_CREDENTIALS }}
中的机密名称是否与保存到存储库设置的机密的名称匹配。 此外,请验证步骤template: $GITHUB_WORKSPACE/azuredeploy.json
中的Deploy ARM Template
ARM 模板名称是否与之前保存在存储库中的 ARM 模板名称匹配。注释
配置部署凭据时,资源组名称应为
GitHubActionExercise-rg
,如果你使用了上述 Azure CLI 代码。 生成的资源组名称是项目名称加上rg
。选择“开始提交”。 根据需要添加注释和说明。
确保选择 “直接提交到主分支 ”,然后选择“ 提交新文件 ”(或 提交更改)。
创建工作流文件并将其提交到存储库的主分支后,工作流将自动启动,因为工作流中的触发器是提交/推送到主分支。
on: push: branches: - main
转到存储库并检查工作流的状态。
检查你的部署
工作流完成后,转到 Azure 门户以检查部署状态。
在左窗格中,选择 资源组>GitHubActionExercise-rg。 在 “部署 ”窗格中,验证部署是否成功。