练习 - 将“Lint 分析”作业和“验证”作业添加到工作流

已完成

你已与你的团队交谈,并决定使用工作流进一步自动执行部署。 你想要对部署的内容建立更多信心。

在此练习中,你将向工作流添加“验证”作业。 然后在每个部署之前运行 Linter 和预检验证。

在此过程中,你将执行以下任务:

  • 更新现有工作流,以添加两个新作业来对 Bicep 代码执行 Lint 分析和验证。
  • 运行工作流。
  • 修复工作流检测到的任何问题。

将“Lint 分析”作业和“验证”作业添加到工作流

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

  2. env: 部分中,将 AZURE_RESOURCEGROUP_NAME 变量的值更改为 ToyWebsiteTest

    env:
      AZURE_RESOURCEGROUP_NAME: ToyWebsiteTest
      ENVIRONMENT_TYPE: Test
    
  3. jobs: 行下方,在 deploy 作业上方添加一个新的“Lint 分析”作业:

    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - name: Run Bicep linter
          run: az bicep build --file deploy/main.bicep
    

    此作业定义一个用于签出代码的步骤,以及一个用于运行 az bicep build 命令以对 Bicep 文件进行 Lint 分析的步骤。

    提示

    YAML 文件对缩进敏感。 无论是键入还是粘贴此代码,都请确保缩进正确。 在此练习的后续部分,你将看到完整的 YAML 工作流定义,使你可验证文件是否匹配。

  4. 在刚添加的行下方,在“部署”作业的上方添加一个“验证”作业:

    validate:
      runs-on: ubuntu-latest
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      - uses: azure/arm-deploy@v1
        name: Run preflight validation
        with:
          deploymentName: ${{ github.run_number }}
          resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
          template: ./deploy/main.bicep
          parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
          deploymentMode: Validate
    

    此作业定义了签出代码、登录到 Azure 环境以及在 Validate 部署模式下使用 azure/arm-deploy 操作的步骤。

    工作流定义现在有三个作业。 第一个是对 Bicep 文件执行 Lint 分析,第二个是执行预检验证,第三个是执行向 Azure 的部署。

  5. runs-on 行下方,在 deploy 作业上方添加一个 needs 语句:

    deploy:
      runs-on: ubuntu-latest
      needs: [lint, validate]
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
    

    needs 语句表明部署作业依赖于成功完成对作业的 Lint 分析和验证,然后才能运行。

    另请注意,验证和部署作业都登录到 Azure,所有作业都签出存储库中的代码。 这些步骤是必需的,因为每个作业都使用新的 GitHub 运行器。

  6. 保存文件。

配置 Linter

默认情况下,Bicep Linter 会在检测到文件有问题时发出警告。 GitHub Actions 不会将 Linter 警告视为应停止工作流的问题。 若要自定义此行为,可创建用于重新配置 Linter 的“bicepconfig.json”文件。

  1. 在 deploy 文件夹中添加一个新文件,并将其命名为 bicepconfig.json。

    Visual Studio Code 资源管理器的屏幕截图,其中新文件显示在“deploy”文件夹中。

  2. 将以下代码复制并粘贴到 文件中:

    {
      "analyzers": {
        "core": {
          "enabled": true,
          "verbose": true,
          "rules": {
            "adminusername-should-not-be-literal": {
              "level": "error"
            },
            "max-outputs": {
              "level": "error"
            },
            "max-params": {
              "level": "error"
            },
            "max-resources": {
              "level": "error"
            },
            "max-variables": {
              "level": "error"
            },
            "no-hardcoded-env-urls": {
              "level": "error"
            },
            "no-unnecessary-dependson": {
              "level": "error"
            },
            "no-unused-params": {
              "level": "error"
            },
            "no-unused-vars": {
              "level": "error"
            },
            "outputs-should-not-contain-secrets": {
              "level": "error"
            },
            "prefer-interpolation": {
              "level": "error"
            },
            "secure-parameter-default": {
              "level": "error"
            },
            "simplify-interpolation": {
              "level": "error"
            },
            "protect-commandtoexecute-secrets": {
              "level": "error"
            },
            "use-stable-vm-image": {
              "level": "error"
            }
          }
        }
      }
    }
    
  3. 保存文件。

配置“部署”作业以使用 Linter

使用自定义 Linter 配置时,Bicep 将写入日志数据,GitHub Actions 会将此数据解释为错误。 若要禁用此行为,可将 arm-deploy 任务配置为忽略标准错误 (stderr) 日志流。

  1. 打开“workflow.yml”文件。

  2. deploy 作业的“部署网站”测试步骤中,将 failOnStdErr 属性设置为 false

    deploy:
      runs-on: ubuntu-latest
      needs: [lint, validate]
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      - uses: azure/arm-deploy@v1
        name: Deploy website
        with:
          failOnStdErr: false
          deploymentName: ${{ github.run_number }}
          resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
          template: ./deploy/main.bicep
          parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
    
  3. 保存文件。

验证并提交工作流定义

  1. 验证“workflow.yml”文件是否如以下代码所示:

    name: deploy-toy-website-test
    concurrency: toy-company
    
    on:
      push:
        branches:
          - main
    
    permissions:
      id-token: write
      contents: read
    
    env:
      AZURE_RESOURCEGROUP_NAME: ToyWebsiteTest
      ENVIRONMENT_TYPE: Test
    
    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - name: Run Bicep linter
          run: az bicep build --file deploy/main.bicep
    
      validate:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v1
          name: Sign in to Azure
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
        - uses: azure/arm-deploy@v1
          name: Run preflight validation
          with:
            deploymentName: ${{ github.run_number }}
            resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
            template: ./deploy/main.bicep
            parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
            deploymentMode: Validate
    
      deploy:
        runs-on: ubuntu-latest
        needs: [lint, validate]
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v1
          name: Sign in to Azure
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
        - uses: azure/arm-deploy@v1
          name: Deploy website
          with:
            failOnStdErr: false
            deploymentName: ${{ github.run_number }}
            resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
            template: ./deploy/main.bicep
            parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
    

    如果你的文件看起来不一样,请更新它,使其与此示例一致,然后保存。

  2. 通过在 Visual Studio Code 终端中运行以下命令来提交更改并将其推送到 Git 存储库:

    git add .
    git commit -m "Add lint and validation jobs"
    git push
    
  3. 此提交是你首次推送到此存储库,因此系统可能会提示你登录。

    在Windows 上,键入 1 以使用 Web 浏览器进行身份验证,然后选择 Enter

    在 macOS 上,选择“授权”。

  4. 将会出现一个浏览器窗口。 你可能需要再次登录到 GitHub。 选择“授权”。

    推送后,GitHub Actions 将立即启动新的工作流运行。

查看工作流运行

  1. 在浏览器中,转到“Actions”。

    工作流的第一次运行(标记为“初始提交”)显示为失败。 创建存储库时,GitHub 会自动运行工作流。 由于机密当时未准备就绪,所以失败了。 你可以忽略此次失败。

  2. 选择工作流的最新运行。

    GitHub Actions 的屏幕截图,其中突出显示了指向最新工作流运行的链接。

    请注意,工作流运行现在显示了你在 YAML 文件中定义的三个作业。 在“部署”作业开始前,“Lint 分析”作业和“验证”作业并行运行。

  3. 如果工作流仍在运行,请等到运行完成。 虽然工作流会使用最新状态自动更新页面,但仍建议偶尔刷新页面。

    另请注意,“Lint 分析”作业和“验证”作业已失败

    GitHub Actions 中工作流运行的屏幕截图,其中“Lint 分析”作业和“验证”作业报告失败。

  4. 选择“Lint 分析”作业以查看其详细信息。

  5. 选择“运行 Bicep Linter”步骤以查看工作流日志。

    “Lint 分析”作业的工作流日志的屏幕截图,其中突出显示了运行 Bicep Linter 的步骤。

    工作流日志中的错误包括 Linter 错误消息:

    Error no-unused-params: Parameter "storageAccountNameParam" is declared but never used.
    

    此错误消息表示 Linter 在 Bicep 文件中发现了规则冲突。

修复 Linter 错误

确定问题后,可以在 Bicep 文件中修复它。

  1. 在 Visual Studio Code 中,打开 deploy 文件夹中的 main.bicep 文件。

  2. 请注意,Bicep Linter 还检测到 storageAccountNameParam 参数未使用。 在 Visual Studio Code 中,参数下会显示一条波浪线。 通常情况下,这一行会呈黄色以表示警告。 但由于你自定义了 bicepconfig.json 文件,因此 Linter 将代码视为错误,并以红色显示该行。

    param storageAccountNameParam string = uniqueString(resourceGroup().id)
    
  3. 删除 storageAccountNameParam 参数。

  4. 保存文件。

  5. 通过在 Visual Studio Code 终端中运行以下命令来提交更改并将其推送到 Git 存储库:

    git add .
    git commit -m "Remove unused parameter"
    git push
    

    同样,GitHub Actions 会自动触发工作流的新运行。

再次查看工作流运行

  1. 在浏览器中,转到你的工作流。

  2. 选择最近的运行。

    等待工作流运行完成。 虽然 GitHub Actions 会使用最新状态自动更新页面,但仍建议偶尔刷新页面。

  3. 请注意,“Lint 分析”作业已成功完成,但“验证”作业还是失败。

    工作流运行的屏幕截图,其中“Lint 分析”作业报告成功,而“验证”作业报告失败。

  4. 选择“验证”作业以查看其详细信息。

  5. 选择“运行预检验证”步骤以查看工作流日志。

    “验证”作业的工作流日志的屏幕截图,其中突出显示了运行预检验证的步骤。

    工作流日志中显示的错误包括以下消息:

    mystorageresourceNameSuffix is not a valid storage account name. Storage account name must be between 3 and 24 characters in length and use numbers and lower-case letters only.
    

    此错误表示存储帐户名称无效。

修复验证错误

你在 Bicep 文件中发现了另一个问题。 修复此问题的方法如下:

  1. 在 Visual Studio Code 中,打开 deploy 文件夹中的 main.bicep 文件。

  2. 查看 storageAccountName 变量的定义:

    var appServiceAppName = 'toy-website-${resourceNameSuffix}'
    var appServicePlanName = 'toy-website'
    var logAnalyticsWorkspaceName = 'workspace-${resourceNameSuffix}'
    var applicationInsightsName = 'toywebsite'
    var storageAccountName = 'mystorageresourceNameSuffix'
    

    似乎有拼写错误,并且字符串内插未正确配置。

  3. 更新 storageAccountName 变量以正确使用字符串内插:

    var storageAccountName = 'mystorage${resourceNameSuffix}'
    
  4. 保存文件。

  5. 通过在 Visual Studio Code 终端中运行以下命令来提交更改并将其推送到 Git 存储库:

    git add .
    git commit -m "Fix string interpolation"
    git push
    

查看成功的工作流运行

  1. 在浏览器中,转到你的工作流。

  2. 选择最近的运行。

    等待工作流运行完成。 虽然 GitHub Actions 会使用最新状态自动更新页面,但仍建议偶尔刷新页面。

  3. 请注意,工作流中的三个作业全部都已成功完成:

    GitHub Actions 中的工作流运行的屏幕截图,其中所有三个作业均报告成功。

    “注释”面板中列出了一些警告。 出现这些警告是因为 Bicep 将信息性消息写入工作流日志的方式。 你可以忽略这些警告。

你现在拥有一个工作流,可在部署过程早期成功检测 Bicep 代码中的错误,如果没有错误,则部署到 Azure。