練習 - 將 lint 和驗證階段新增至管線
您已與小組交談,並決定使用管線進一步自動化部署。 您想要對部署的內容建立更多信賴度。
在本練習中,您要將驗證階段新增至管線。 接著,您會在每次部署之前執行 Linter 和預撿驗證。
在此過程中,您將會:
- 更新您現有的管線,新增兩個階段來 Lint 和驗證 Bicep 程式碼。
- 執行您的管線。
- 修正管線偵測到的任何問題。
更新管線以準備階段
首先,您必須更新管線檔案來定義階段。 Azure Pipelines 會自動為您建立單一階段,但因為您很快就會新增更多的階段,所以您必須更新管線以明確定義階段。
在 Visual Studio Code 中,開啟 deploy 資料夾中的 azure-pipelines.yml 檔案。
將檔案中第 14 行的所有內容移除到檔案底部。 請務必同時移除
jobs:
這一行。在檔案底端,新增下列程式碼:
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 和驗證階段新增至管線
在
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。在您剛才新增的行下方,新增驗證階段:
- 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。
儲存檔案。
設定 Linter
Bicep Linter 預設會在偵測到檔案問題時提出警告。 Azure Pipelines 不會將 Linter 警告視為應該會停止管線的問題。 若要自訂此行為,請建立 bicepconfig.json 檔案,重新設定該 Linter。
在部署資料夾中新增檔案,並將其命名為 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" } } } } }
儲存檔案。
驗證並認可管線定義
確認您的 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)
如果不相符,請更新以符合此範例,然後將其儲存。
在 Visual Studio Code 終端機中執行下列命令,以認可所做的變更,並將其推送至您的 Git 存放庫:
git add . git commit -m "Add lint and validation stages" git push
在您推送之後,Azure Pipelines 會立即啟動新的管線執行。
檢視管線執行
在您的瀏覽器中,移至 [管線]。
選取管線的最近一次執行。
如果管線仍在執行中,請等到執行完成為止。 雖然 Azure Pipelines 自動將頁面更新為最新狀態,但最好偶爾重新整理頁面。
請注意,管線執行現在會顯示您在 YAML 檔案中定義的三個階段。 另請注意,Lint 階段失敗。
選取 [Lint] 階段以查看其詳細資料。
選取 [執行 Bicep Linter] 步驟,以檢視管線記錄。
請注意,顯示的錯誤與下列錯誤類似:
no-unused-params 錯誤:已宣告 "storageAccountNameParam" 參數,但從未使用過。
此錯誤表示 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
同樣地,Azure Pipelines 會自動觸發新的管線執行。
再次檢視管線執行
在瀏覽器中,前往您的管線。
選取最近的執行。
等候管線執行完成。 雖然 Azure Pipelines 自動將頁面更新為最新狀態,但最好偶爾重新整理頁面。
請注意,Lint 階段已順利完成,但現在 [驗證] 階段已失敗。
選取 [驗證] 階段以查看其詳細資料。
選取 [執行預檢驗證] 步驟以檢視管線記錄。
請注意,記錄檔中顯示的錯誤包括下列訊息:
mystorageresourceNameSuffix 不是有效的儲存空間帳戶名稱。 儲存體帳戶名稱長度必須介於 3 至 24 字元之間,並且只能使用數字及小寫字母。
此錯誤表示儲存體帳戶名稱無效。
修正驗證錯誤
您在 Bicep 檔案中發現另一個問題。 在這裡,您將修正問題。
在 Visual Studio Code 中,開啟 [deploy] 資料夾中的 main.bicep 檔案。
查看
storageAccountName
變數的定義:var appServiceAppName = 'toy-website-${resourceNameSuffix}' var appServicePlanName = 'toy-website' var applicationInsightsName = 'toywebsite' var logAnalyticsWorkspaceName = 'workspace-${resourceNameSuffix}' var storageAccountName = 'mystorageresourceNameSuffix'
似乎有拼字錯誤,且字串內插補點尚未正確設定。
更新
storageAccountName
變數以正確使用字串插補:var storageAccountName = 'mystorage${resourceNameSuffix}'
儲存檔案。
在 Visual Studio Code 終端機中執行下列命令,以認可所做的變更,並將其推送至您的 Git 存放庫:
git add . git commit -m "Fix string interpolation" git push
檢視成功的管線執行
在瀏覽器中,前往您的管線。
選取最近的執行。
等候管線執行完成。 雖然 Azure Pipelines 自動將頁面更新為最新狀態,但最好偶爾重新整理頁面。
請注意,管線的三個階段全都已順利完成:
您現在有一個管線,可在部署程序初期成功偵測 Bicep 程式碼中的錯誤,然後在沒有任何錯誤時部署到 Azure。