练习 - 将“Lint 分析”作业和“验证”作业添加到工作流
你已与你的团队交谈,并决定使用工作流进一步自动执行部署。 你想要对部署的内容建立更多信心。
在此练习中,你将向工作流添加“验证”作业。 然后在每个部署之前运行 Linter 和预检验证。
在此过程中,你将执行以下任务:
- 更新现有工作流,以添加两个新作业来对 Bicep 代码执行 Lint 分析和验证。
- 运行工作流。
- 修复工作流检测到的任何问题。
将“Lint 分析”作业和“验证”作业添加到工作流
在 Visual Studio Code 中,打开“.github/workflows”文件夹中的“workflow.yml”文件。
在
env:
部分中,将AZURE_RESOURCEGROUP_NAME
变量的值更改为ToyWebsiteTest
:env: AZURE_RESOURCEGROUP_NAME: ToyWebsiteTest ENVIRONMENT_TYPE: Test
在
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 工作流定义,使你可验证文件是否匹配。
在刚添加的行下方,在“部署”作业的上方添加一个“验证”作业:
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 的部署。
在
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 运行器。
保存文件。
配置 Linter
默认情况下,Bicep Linter 会在检测到文件有问题时发出警告。 GitHub Actions 不会将 Linter 警告视为应停止工作流的问题。 若要自定义此行为,可创建用于重新配置 Linter 的“bicepconfig.json”文件。
在 deploy 文件夹中添加一个新文件,并将其命名为 bicepconfig.json。
将以下代码复制并粘贴到 文件中:
{ "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" } } } } }
保存文件。
配置“部署”作业以使用 Linter
使用自定义 Linter 配置时,Bicep 将写入日志数据,GitHub Actions 会将此数据解释为错误。 若要禁用此行为,可将 arm-deploy
任务配置为忽略标准错误 (stderr) 日志流。
打开“workflow.yml”文件。
在
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 }}
保存文件。
验证并提交工作流定义
验证“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 }}
如果你的文件看起来不一样,请更新它,使其与此示例一致,然后保存。
通过在 Visual Studio Code 终端中运行以下命令来提交更改并将其推送到 Git 存储库:
git add . git commit -m "Add lint and validation jobs" git push
此提交是你首次推送到此存储库,因此系统可能会提示你登录。
在Windows 上,键入 1 以使用 Web 浏览器进行身份验证,然后选择 Enter。
在 macOS 上,选择“授权”。
将会出现一个浏览器窗口。 你可能需要再次登录到 GitHub。 选择“授权”。
推送后,GitHub Actions 将立即启动新的工作流运行。
查看工作流运行
在浏览器中,转到“Actions”。
工作流的第一次运行(标记为“初始提交”)显示为失败。 创建存储库时,GitHub 会自动运行工作流。 由于机密当时未准备就绪,所以失败了。 你可以忽略此次失败。
选择工作流的最新运行。
请注意,工作流运行现在显示了你在 YAML 文件中定义的三个作业。 在“部署”作业开始前,“Lint 分析”作业和“验证”作业并行运行。
如果工作流仍在运行,请等到运行完成。 虽然工作流会使用最新状态自动更新页面,但仍建议偶尔刷新页面。
另请注意,“Lint 分析”作业和“验证”作业已失败。
选择“Lint 分析”作业以查看其详细信息。
选择“运行 Bicep Linter”步骤以查看工作流日志。
工作流日志中的错误包括 Linter 错误消息:
Error no-unused-params: Parameter "storageAccountNameParam" is declared but never used.
此错误消息表示 Linter 在 Bicep 文件中发现了规则冲突。
修复 Linter 错误
确定问题后,可以在 Bicep 文件中修复它。
在 Visual Studio Code 中,打开 deploy 文件夹中的 main.bicep 文件。
请注意,Bicep Linter 还检测到
storageAccountNameParam
参数未使用。 在 Visual Studio Code 中,参数下会显示一条波浪线。 通常情况下,这一行会呈黄色以表示警告。 但由于你自定义了 bicepconfig.json 文件,因此 Linter 将代码视为错误,并以红色显示该行。param storageAccountNameParam string = uniqueString(resourceGroup().id)
删除
storageAccountNameParam
参数。保存文件。
通过在 Visual Studio Code 终端中运行以下命令来提交更改并将其推送到 Git 存储库:
git add . git commit -m "Remove unused parameter" git push
同样,GitHub Actions 会自动触发工作流的新运行。
再次查看工作流运行
在浏览器中,转到你的工作流。
选择最近的运行。
等待工作流运行完成。 虽然 GitHub Actions 会使用最新状态自动更新页面,但仍建议偶尔刷新页面。
请注意,“Lint 分析”作业已成功完成,但“验证”作业还是失败。
选择“验证”作业以查看其详细信息。
选择“运行预检验证”步骤以查看工作流日志。
工作流日志中显示的错误包括以下消息:
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 文件中发现了另一个问题。 修复此问题的方法如下:
在 Visual Studio Code 中,打开 deploy 文件夹中的 main.bicep 文件。
查看
storageAccountName
变量的定义:var appServiceAppName = 'toy-website-${resourceNameSuffix}' var appServicePlanName = 'toy-website' var logAnalyticsWorkspaceName = 'workspace-${resourceNameSuffix}' var applicationInsightsName = 'toywebsite' var storageAccountName = 'mystorageresourceNameSuffix'
似乎有拼写错误,并且字符串内插未正确配置。
更新
storageAccountName
变量以正确使用字符串内插:var storageAccountName = 'mystorage${resourceNameSuffix}'
保存文件。
通过在 Visual Studio Code 终端中运行以下命令来提交更改并将其推送到 Git 存储库:
git add . git commit -m "Fix string interpolation" git push
查看成功的工作流运行
在浏览器中,转到你的工作流。
选择最近的运行。
等待工作流运行完成。 虽然 GitHub Actions 会使用最新状态自动更新页面,但仍建议偶尔刷新页面。
请注意,工作流中的三个作业全部都已成功完成:
“注释”面板中列出了一些警告。 出现这些警告是因为 Bicep 将信息性消息写入工作流日志的方式。 你可以忽略这些警告。
你现在拥有一个工作流,可在部署过程早期成功检测 Bicep 代码中的错误,如果没有错误,则部署到 Azure。