演習 - 自分のパイプラインにリンティングと検証ステージを追加する

完了

あなたはチームと話し合い、パイプラインを使用してデプロイをさらに自動化することを決定しました。 より自信を持って、デプロイする対象を構築する必要があります。

この演習では、検証ステージをパイプラインに追加します。 次に、各デプロイの前に、リンターとプレフライト検証を実行します。

このプロセスでは、次のことを行います。

  • 既存のパイプラインを更新して、リンティングに新しいステージを 2 つ追加し、Bicep コードを検証する。
  • パイプラインを実行する。
  • パイプラインによって検出された問題を修正します。

パイプラインを更新してステージを準備する

まず、パイプライン ファイルを更新してステージを定義する必要があります。 Azure Pipelines によって自動的に 1 つのステージが作成されますが、後でステージを追加するので、ステージを明示的に定義するためにパイプラインを更新する必要があります。

  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 パイプライン定義を確認します。

リンティングと検証ステージをパイプラインに追加する

  1. stages: 行の下にリント ステージを追加します。

    - 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 ファイルをリンティングする単一ステップを定義します。

  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 との通信が必要になるため、このステップにはサービス接続への参照が含まれています。

    パイプライン定義には 3 つのステージがあります。 1 つ目は Bicep ファイルでリンターを実行し、2 つ目はプレフライト検証を実行し、3 つ目は Azure へのデプロイを実行します。

  3. ファイルを保存します。

リンターを構成する

既定では、ファイルに問題が検出されると、Bicep リンターによって警告が表示されます。 Azure Pipelines では、リンターの警告をパイプラインを停止する必要がある問題として扱いません。 この動作をカスタマイズするには、リンターを再構成する bicepconfig.json ファイルを作成します。

  1. deploy フォルダーに新しいファイルを追加し、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. ブラウザーで、[Pipelines] に移動します。

  2. パイプラインの最新の実行を選択します。

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

    パイプラインがまだ実行中の場合は、完了するまで待機します。 Azure Pipelines によってページが最新の状態で自動的に更新されますが、ページを随時更新することをお勧めします。

  3. パイプライン実行では、YAML ファイルで定義した 3 つのステージが示されています。 リンティング ステージが失敗していることにも注目してください。

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

  4. リンティング ステージを選択して詳細を表示します。

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

  5. [Bicep リンターの実行] ステップを選択して、パイプライン ログを表示します。

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

    次のようなエラーが表示されます。

    エラー no-unused-params: パラメーター "storageAccountNameParam" が宣言されていますが使用されていません。

    このエラーは、リンターによって Bicep ファイルの規則違反が検出されたことを示します。

リンター エラーを修正する

これで問題が特定されたので、Bicep ファイルで修正できます。

  1. Visual Studio Code で、deploy フォルダーの main.bicep ファイルを開きます。

  2. Bicep リンターによって、storageAccountNameParam パラメーターが使用されていないことも検出されたことがわかります。 Visual Studio Code では、未使用のパラメーターが波線で示されます。 通常、この行は警告を示す黄色になります。 しかし、bicepconfig.json ファイルをカスタマイズしたため、リンターはコードをエラーとして扱い、行は赤で表示されます。

    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. リント ステージは正常に終了しましたが、検証ステージは失敗したことがわかります。

    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. パイプラインの 3 つのステージがすべて正常に終了しています。

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

これで、デプロイ プロセスの早い段階で Bicep コード内のエラーを正常に検出し、エラーがない場合は Azure にデプロイするパイプラインが完成しました。