练习 - 向工作流添加 Bicep 部署作

已完成

你已创建一个基本工作流,并且已将 Azure 和 GitHub 环境配置为连接。 现在,你已准备好从工作流将网站的 Bicep 文件部署到 Azure。

通过学习本练习,你将能够:

  • 将 Bicep 文件添加到存储库。
  • 添加工作流步骤,将存储库源代码下载到运行程序的文件系统。
  • 添加工作流步骤以登录到 Azure。
  • 添加工作流步骤以部署 Bicep 文件。
  • 再次运行工作流并验证它是否已成功部署网站。

将网站的 Bicep 文件添加到 GitHub 存储库

你已经准备好了网站的 Bicep 文件,你可以使用该文件根据环境和配置部署网站资源的不同配置。 在这里,你将将 Bicep 文件添加到存储库。

  1. 打开 Visual Studio Code 资源管理器。

  2. 在存储库的根目录中,创建一个“deploy”文件。

  3. 在部署文件夹中,创建一个名为 main.bicep 的新文件。 请确保在 部署 文件夹中创建文件:

    Visual Studio Code 资源管理器的屏幕截图,其中突出显示了 main.bicep 文件(位于 deploy 文件夹中)。

  4. 将以下代码复制到 main.bicep 文件中:

    @description('The Azure region into which the resources should be deployed.')
    param ___location string = resourceGroup().___location
    
    @description('The type of environment. This must be nonprod or prod.')
    @allowed([
      'nonprod'
      'prod'
    ])
    param environmentType string
    
    @description('A unique suffix to add to resource names that need to be globally unique.')
    @maxLength(13)
    param resourceNameSuffix string = uniqueString(resourceGroup().id)
    
    var appServiceAppName = 'toy-website-${resourceNameSuffix}'
    var appServicePlanName = 'toy-website-plan'
    var toyManualsStorageAccountName = 'toyweb${resourceNameSuffix}'
    
    // Define the SKUs for each component based on the environment type.
    var environmentConfigurationMap = {
      nonprod: {
        appServicePlan: {
          sku: {
            name: 'F1'
            capacity: 1
          }
        }
        toyManualsStorageAccount: {
          sku: {
            name: 'Standard_LRS'
          }
        }
      }
      prod: {
        appServicePlan: {
          sku: {
            name: 'S1'
            capacity: 2
          }
        }
        toyManualsStorageAccount: {
          sku: {
            name: 'Standard_ZRS'
          }
        }
      }
    }
    
    var toyManualsStorageAccountConnectionString = 'DefaultEndpointsProtocol=https;AccountName=${toyManualsStorageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${toyManualsStorageAccount.listKeys().keys[0].value}'
    
    resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
      name: appServicePlanName
      ___location: ___location
      sku: environmentConfigurationMap[environmentType].appServicePlan.sku
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
      name: appServiceAppName
      ___location: ___location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
        siteConfig: {
          appSettings: [
            {
              name: 'ToyManualsStorageAccountConnectionString'
              value: toyManualsStorageAccountConnectionString
            }
          ]
        }
      }
    }
    
    resource toyManualsStorageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
      name: toyManualsStorageAccountName
      ___location: ___location
      kind: 'StorageV2'
      sku: environmentConfigurationMap[environmentType].toyManualsStorageAccount.sku
    }
    
  5. 保存对该文件所做的更改。

  6. 在 Visual Studio Code 终端中,运行以下代码以暂存更改、提交更改并将更改推送到存储库:

    git add deploy/main.bicep
    git commit -m 'Add Bicep file'
    git push
    

替换工作流步骤

接下来,更新工作流定义,将 Bicep 文件部署到 Azure。

  1. 在 Visual Studio Code 中,打开 .github/workflows/workflow.yml 文件。

  2. 在文件的顶部,在on:jobs:之间添加一个permissions:部分。

    name: deploy-toy-website
    
    on: [workflow_dispatch]
    
    permissions:
      id-token: write
      contents: read
    
    jobs:
    

    此更改允许工作流使用工作负荷标识。

  3. say-hello 作业重命名为 deploy

    jobs:
      deploy:
        runs-on: ubuntu-latest
        steps:
    
  4. 若要从工作流定义中删除 placeholder 步骤,请删除文件底部的两行。

  5. 首先,你会添加一个任务以将代码签出到运行器的文件系统中。 在文件底部添加新步骤:

    jobs:
      deploy:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
    

    注释

    最好是自行键入此代码,而不是从本模块中复制粘贴。 请注意文件缩进。 如果缩进不正确,YAML 文件将无效。 Visual Studio Code 通过显示波浪线来指示错误。

  6. 在刚刚添加的步骤下,添加一个任务以登录到 Azure 环境。 此任务通过工作负载标识使用你先前定义的机密进行登录:

    jobs:
      deploy:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v1
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
  7. 在刚添加的步骤下方,添加另一个步骤以执行 Bicep 部署:

    jobs:
      deploy:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v1
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
        - uses: azure/arm-deploy@v1
          with:
            deploymentName: ${{ github.run_number }}
            resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
            template: ./deploy/main.bicep
            parameters: environmentType=${{ env.ENVIRONMENT }}
    

    请注意,此任务使用 github.run_number 默认环境变量命名 Azure 中的部署。 它还对资源组名称和 environmentType Bicep 文件中的参数使用环境变量。

  8. 在工作流文件顶部,添加这些变量及其值,介于 permissions:jobs 之间。

    name: deploy-toy-website
    
    on: [workflow_dispatch]
    
    permissions:
      id-token: write
      contents: read
    
    env:
        AZURE_RESOURCEGROUP_NAME: ToyWebsite
        ENVIRONMENT: nonprod
    
    jobs:
    
  9. 保存对该文件所做的更改。 文件应如下例所示:

    name: deploy-toy-website
    
    on: [workflow_dispatch]
    
    permissions:
      id-token: write
      contents: read
    
    env:
        AZURE_RESOURCEGROUP_NAME: ToyWebsite
        ENVIRONMENT: nonprod
    
    jobs:
      deploy:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v1
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
        - uses: azure/arm-deploy@v1
          with:
            deploymentName: ${{ github.run_number }}
            resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
            template: ./deploy/main.bicep
            parameters: environmentType=${{ env.ENVIRONMENT }}
    
  10. 在 Visual Studio Code 终端中,暂存更改,将更改提交到存储库,然后推送到 Azure Repos:

    git add .
    git commit -m 'Add Azure CLI tasks to workflow'
    git push
    

运行工作流

现在可以运行工作流了!

  1. 在浏览器中,通过选择 Actions>deploy-toy-website 打开工作流。

  2. 选择运行工作流>运行工作流

  3. 工作流的新运行将显示在运行列表中。 如果未显示,请刷新浏览器页面。

  4. 选择正在运行的工作流以查看运行的详细信息。

    请等待运行完成。

  5. 选择 部署 作业。

    GitHub 界面的屏幕截图,其中显示了运行页,其中突出显示了部署作业。

  6. 选择“ 运行 azure/arm-deploy@v1”。 这会显示任务详细信息。

  7. 在任务详细信息中选择 “运行 azure/arm-deploy@v1 ”。

    GitHub 界面的屏幕截图,其中显示了工作流日志,其中突出显示了“环境变量”。

    请注意,此步骤使用添加到工作流文件的环境变量。

  8. 检查工作流输出的其余部分。

    工作流显示成功的部署。

验证部署

  1. 转到 Azure 门户

  2. 在左侧菜单中,选择“资源组”

  3. 选择“ToyWebsite”。

  4. 在“概述”中,查看部署状态。 你会看到有一个部署成功了。

    Azure 门户的屏幕截图,其中显示了具有一个成功部署的资源组。

  5. 选择 “1 成功 ”链接以查看部署的详细信息。

    Azure 门户的屏幕截图,其中显示了资源组部署历史记录,并突出显示了部署。

    请注意,部署的名称与 GitHub Actions 中的工作流运行编号匹配,因为使用了 github.run_number 环境变量来命名部署。

  6. 若要查看部署的资源,请选择部署。 若要展开部署并查看更多详细信息,请选择 “部署详细信息”。 在这种情况下,有一个存储帐户、一个 Azure 应用服务计划和一个应用。

    Azure 门户的屏幕截图,其中显示了资源组部署详细信息,其中突出显示了应用服务资源。