練習 - 將 lint 和驗證階段新增至管線

已完成

您已與小組交談,並決定使用管線進一步自動化部署。 您想要對部署的內容建立更多信賴度。

在本練習中,您要將驗證階段新增至管線。 接著,您會在每次部署之前執行 Linter 和預撿驗證。

在此過程中,您將會:

  • 更新您現有的管線,新增兩個階段來 Lint 和驗證 Bicep 程式碼。
  • 執行您的管線。
  • 修正管線偵測到的任何問題。

更新管線以準備階段

首先,您必須更新管線檔案來定義階段。 Azure Pipelines 會自動為您建立單一階段,但因為您很快就會新增更多的階段,所以您必須更新管線以明確定義階段。

  1. 在 Visual Studio Code 中,開啟 deploy 資料夾中的 azure-pipelines.yml 檔案。

  2. 將檔案中第 14 行的所有內容移除到檔案底部。 請務必同時移除 jobs: 這一行。

  3. 在檔案底端,新增下列程式碼:

    stages:
    
    - stage: Deploy
      jobs:
      - job: Deploy
        steps:
          - task: AzureResourceManagerTemplateDeployment@3
            name: Deploy
            displayName: Deploy to Azure
            inputs:
              connectedServiceName: $(ServiceConnectionName)
              deploymentName: $(Build.BuildNumber)
              location: $(DeploymentDefaultLocation)
              resourceGroupName: $(ResourceGroupName)
              csmFile: deploy/main.bicep
              overrideParameters: >
                -environmentType $(EnvironmentType)
    

    提示

    YAML 檔案會區分縮排。 無論您是輸入或貼上此程式碼,請確定您的縮排正確無誤。 在下一節中,您會看到完整的 YAML 管線定義,以便確認檔案相符。

將 lint 和驗證階段新增至管線

  1. stages: 行下方,新增 lint 階段:

    - stage: Lint
      jobs:
      - job: LintCode
        displayName: Lint code
        steps:
          - script: |
              az bicep build --file deploy/main.bicep
            name: LintBicepCode
            displayName: Run Bicep linter
    

    此階段會定義單一步驟,以執行 az bicep build 命令將 Bicep 檔案進行 lint。

  2. 在您剛才新增的行下方,新增驗證階段:

    - stage: Validate
      jobs:
      - job: ValidateBicepCode
        displayName: Validate Bicep code
        steps:
          - task: AzureResourceManagerTemplateDeployment@3
            name: RunPreflightValidation
            displayName: Run preflight validation
            inputs:
              connectedServiceName: $(ServiceConnectionName)
              location: $(deploymentDefaultLocation)
              deploymentMode: Validation
              resourceGroupName: $(ResourceGroupName)
              csmFile: deploy/main.bicep
              overrideParameters: >
                -environmentType $(EnvironmentType)
    

    此階段會定義執行預檢驗證的單一步驟。 請注意,此步驟包含服務連線的參考,因為預檢驗證程序需要與 Azure 進行通訊。

    您的管線定義現在有三個階段。 第一個會對您的 Bicep 檔案執行 Linter,第二個會執行預檢驗證,而第三個會執行部署到 Azure。

  3. 儲存檔案。

設定 Linter

Bicep Linter 預設會在偵測到檔案問題時提出警告。 Azure Pipelines 不會將 Linter 警告視為應該會停止管線的問題。 若要自訂此行為,請建立 bicepconfig.json 檔案,重新設定該 Linter。

  1. 在部署資料夾中新增檔案,並將其命名為 bicepconfig.json

    Screenshot of Visual Studio Code Explorer, with the new file shown in the deploy folder.

  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. 儲存檔案。

驗證並認可管線定義

  1. 確認您的 azure-pipelines.yml 檔案看起來像下列檔案:

    trigger:
      batch: true
      branches:
        include:
        - main
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      - name: deploymentDefaultLocation
        value: westus3
    
    stages:
    
    - stage: Lint
      jobs:
      - job: LintCode
        displayName: Lint code
        steps:
          - script: |
              az bicep build --file deploy/main.bicep
            name: LintBicepCode
            displayName: Run Bicep linter
    
    - stage: Validate
      jobs:
      - job: ValidateBicepCode
        displayName: Validate Bicep code
        steps:
          - task: AzureResourceManagerTemplateDeployment@3
            name: RunPreflightValidation
            displayName: Run preflight validation
            inputs:
              connectedServiceName: $(ServiceConnectionName)
              location: $(deploymentDefaultLocation)
              deploymentMode: Validation
              resourceGroupName: $(ResourceGroupName)
              csmFile: deploy/main.bicep
              overrideParameters: >
                -environmentType $(EnvironmentType)
    
    - stage: Deploy
      jobs:
      - job: Deploy
        steps:
          - task: AzureResourceManagerTemplateDeployment@3
            name: Deploy
            displayName: Deploy to Azure
            inputs:
              connectedServiceName: $(ServiceConnectionName)
              deploymentName: $(Build.BuildNumber)
              location: $(DeploymentDefaultLocation)
              resourceGroupName: $(ResourceGroupName)
              csmFile: deploy/main.bicep
              overrideParameters: >
                -environmentType $(EnvironmentType)
    

    如果不相符,請更新以符合此範例,然後將其儲存。

  2. 在 Visual Studio Code 終端機中執行下列命令,以認可所做的變更,並將其推送至您的 Git 存放庫:

    git add .
    git commit -m "Add lint and validation stages"
    git push
    

    在您推送之後,Azure Pipelines 會立即啟動新的管線執行。

檢視管線執行

  1. 在您的瀏覽器中,移至 [管線]

  2. 選取管線的最近一次執行。

    Screenshot of Azure DevOps with the link to the latest pipeline run highlighted.

    如果管線仍在執行中,請等到執行完成為止。 雖然 Azure Pipelines 自動將頁面更新為最新狀態,但最好偶爾重新整理頁面。

  3. 請注意,管線執行現在會顯示您在 YAML 檔案中定義的三個階段。 另請注意,Lint 階段失敗。

    Screenshot of a pipeline run in Azure DevOps, with the Lint stage reporting failure.

  4. 選取 [Lint] 階段以查看其詳細資料。

    Screenshot of a pipeline run in Azure DevOps, with the name of the Lint stage highlighted.

  5. 選取 [執行 Bicep Linter] 步驟,以檢視管線記錄。

    Screenshot of the pipeline log for the Lint stage, with the step for running a Bicep linter highlighted.

    請注意,顯示的錯誤與下列錯誤類似:

    no-unused-params 錯誤:已宣告 "storageAccountNameParam" 參數,但從未使用過。

    此錯誤表示 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
    

    同樣地,Azure Pipelines 會自動觸發新的管線執行。

再次檢視管線執行

  1. 在瀏覽器中,前往您的管線。

  2. 選取最近的執行。

    等候管線執行完成。 雖然 Azure Pipelines 自動將頁面更新為最新狀態,但最好偶爾重新整理頁面。

  3. 請注意,Lint 階段已順利完成,但現在 [驗證] 階段已失敗。

    Screenshot of the pipeline run, with the Lint stage reporting success and the Validate stage reporting failure.

  4. 選取 [驗證] 階段以查看其詳細資料。

  5. 選取 [執行預檢驗證] 步驟以檢視管線記錄。

    Screenshot of the pipeline log for the Validate stage, with the step for running preflight validation highlighted.

    請注意,記錄檔中顯示的錯誤包括下列訊息:

    mystorageresourceNameSuffix 不是有效的儲存空間帳戶名稱。 儲存體帳戶名稱長度必須介於 3 至 24 字元之間,並且只能使用數字及小寫字母。

    此錯誤表示儲存體帳戶名稱無效。

修正驗證錯誤

您在 Bicep 檔案中發現另一個問題。 在這裡,您將修正問題。

  1. 在 Visual Studio Code 中,開啟 [deploy] 資料夾中的 main.bicep 檔案。

  2. 查看 storageAccountName 變數的定義:

    var appServiceAppName = 'toy-website-${resourceNameSuffix}'
    var appServicePlanName = 'toy-website'
    var applicationInsightsName = 'toywebsite'
    var logAnalyticsWorkspaceName = 'workspace-${resourceNameSuffix}'
    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. 選取最近的執行。

    等候管線執行完成。 雖然 Azure Pipelines 自動將頁面更新為最新狀態,但最好偶爾重新整理頁面。

  3. 請注意,管線的三個階段全都已順利完成:

    Screenshot of the pipeline run in Azure DevOps, with all three stages reporting success.

您現在有一個管線,可在部署程序初期成功偵測 Bicep 程式碼中的錯誤,然後在沒有任何錯誤時部署到 Azure。