演習 - モジュールをレジストリに発行する

完了

あなたが勤めている玩具会社では、Bicep モジュールをレジストリに発行しています。 発行プロセスは、自分のコンピューターから手動で実行しています。 現在は発行プロセスを処理するパイプラインを作成したいと考えています。

この演習では、以下のことを行います。

  • Bicep モジュール用のコンテナー レジストリを作成します。
  • パイプラインに lint ステージを追加します。
  • モジュールをレジストリに発行するパイプライン ステージを追加します。
  • パイプラインが正常に実行されることを確認します。
  • 発行されたモジュールをレジストリで確認します。

コンテナー レジストリを作成する

モジュールを発行する前に、組織で使用するレジストリを作成する必要があります。 ここでは、Azure portal を使用してレジストリを作成します。

  1. ブラウザーで、Azure portal 内に新しいコンテナー レジストリを作成します

  2. [基本] タブで、対象のサブスクリプションと前に作成した ToyReusable リソース グループを選択します。

  3. レジストリの名前と近くの場所を入力します。

    重要

    レジストリの名前は Azure 内で一意にする必要があり、英数字で 5 ~ 50 文字にする必要があります。 レジストリ名の横のチェック マークは、選択した名前が使用可能であることを示します。

  4. [SKU] で、 [Basic] を選択します。

    他の構成設定は既定値のままにします。

  5. [Review + create](レビュー + 作成) を選択します。

    コンテナー レジストリの作成ページを表示している Azure portal のスクリーンショット。

  6. "検証に成功しました" という設定の表示を確認し、[作成] を選択します。

    デプロイが完了するまで待ちます。通常は 1 - 2 分かかります。

  7. [デプロイメントに成功しました] というメッセージが表示されたら、[リソースに移動] を選択してコンテナー レジストリを開きます。

    コンテナー レジストリのデプロイを示す Azure portal のスクリーンショット。リソースに移動するためのボタンが強調表示されています。

  8. コンテナー レジストリの [概要] 領域で、[ログイン サーバー] 設定の値をメモします。 これは yourregistryname.azurecr.io のような形になります。

    コンテナー レジストリの詳細を示す Azure portal のスクリーンショット。ログイン サーバーが強調表示されています。

    この値は、このあとすぐに必要になります。

モジュールのメタデータ ファイルを追加する

前のユニットでは、モジュールのバージョン管理戦略を持つことの重要性について学習しました。 また、モジュールのメタデータ ファイルを使用して、パイプライン内のモジュールのメジャー バージョン番号とマイナー バージョン番号を指定する方法についても学習しました。 ここでは、ストレージ アカウント モジュールのメタデータ ファイルを追加します。

  1. Visual Studio Code で、リポジトリのルートにある modules/storage-account フォルダーを展開します。

  2. metadata.json という名前の新しいファイルを作成します。

    metadata.json ファイルの場所を示す Visual Studio Code のスクリーンショット。

  3. 次の内容をファイルに追加します。

    {
      "version": {
        "major": 1,
        "minor": 2
      }
    }
    

    メタデータ ファイルでは、メジャー バージョン番号とマイナー バージョン番号を個別に定義していることに注意してください。 パイプラインでは、パイプラインを実行するたびに、これらの数値とパイプラインのビルド番号が組み合わされて、完全なバージョン番号が生成されます。

  4. ファイルに加えた変更を保存します。

パイプライン定義を更新して lint ステージを追加する

リポジトリには、出発点として使用できるパイプラインのドラフトが含まれています。

  1. modules/storage-account フォルダー内の pipeline.yml ファイルを開きます。

  2. 環境変数 ModuleRegistryServer の値をコンテナー レジストリのサーバー名に更新します。 その名前は、この演習の前のほうでコピーしました。

    たとえば、レジストリのログイン サーバーが yourregistryname.azurecr.io の場合、このようになります。

    - name: ModuleRegistryServer
      value: yourregistryname.azurecr.io
    
  3. ファイルの下部にある "# To be added" というコメントの場所に、次の lint ステージの定義を追加します。

    stages:
    
    - stage: Lint
      jobs:
      - job: LintCode
        displayName: Lint code
        steps:
          - script: |
              az bicep build --file $(ModuleFilePath)
            name: LintBicepCode
            displayName: Run Bicep linter
    

パイプラインに発行ステージを追加する

これで、モジュールをコンテナー レジストリに発行する 2 番目のステージを追加できます。

  1. spipeline.yml ファイルの下部で、Publish ステージを定義し、モジュールの metadata.json ファイルからバージョン番号を読み取ってパイプライン変数として設定するステップを追加します。

    - stage: Publish
      jobs:
      - job: Publish
        steps:
          - script: |
              majorMinorVersionNumber=$(jq '(.version.major | tostring) + "." + (.version.minor | tostring)' $(ModuleMetadataFilePath) -r )
              versionNumber="$majorMinorVersionNumber.$(Build.BuildNumber)"
              echo "##vso[task.setvariable variable=ModuleVersion;]$versionNumber"
            name: GetModuleVersionNumber
            displayName: Get module version number
    

    このステップでは、jq コマンド ライン アプリケーションを使用して JSON ファイルを解析するスクリプトを実行します。

  2. 作成したステップの下に、モジュールをレジストリに発行するステップを追加します。

    - task: AzureCLI@2
      name: Publish
      displayName: Publish module
      inputs:
        azureSubscription: $(ServiceConnectionName)
        scriptType: 'bash'
        scriptLocation: 'inlineScript'
        inlineScript: |
          az bicep publish \
            --target 'br:$(ModuleRegistryServer)/$(ModuleName):$(ModuleVersion)' \
            --file $(ModuleFilePath)
    

    このステップでは、--target 引数の値が動的に生成されます。 レジストリ サーバーの値、モジュール名、バージョン番号が組み合わされます。

  3. ファイルに加えた変更を保存します。

パイプライン定義を確認してコミットする

  1. storage_account_module.yml ファイルが、次の例のようになっていることを確認します。

    trigger:
      batch: true
      branches:
        include:
        - main
      paths:
        include:
        - 'modules/storage-account/**'
    
    variables: 
    - name: ServiceConnectionName
      value: ToyReusable
    - name: ModuleName
      value: storage-account
    - name: ModuleRegistryServer
      value: yourregistryname.azurecr.io
    - name: ModuleFilePath
      value: modules/storage-account/main.bicep
    - name: ModuleMetadataFilePath
      value: modules/storage-account/metadata.json
    
    pool:
      vmImage: ubuntu-latest
    
    stages:
    
    - stage: Lint
      jobs:
      - job: LintCode
        displayName: Lint code
        steps:
          - script: |
              az bicep build --file $(ModuleFilePath)
            name: LintBicepCode
            displayName: Run Bicep linter
    
    - stage: Publish
      jobs:
      - job: Publish
        steps:
          - script: |
              majorMinorVersionNumber=$(jq '(.version.major | tostring) + "." + (.version.minor | tostring)' $(ModuleMetadataFilePath) -r )
              versionNumber="$majorMinorVersionNumber.$(Build.BuildNumber)"
              echo "##vso[task.setvariable variable=ModuleVersion;]$versionNumber"
            name: GetModuleVersionNumber
            displayName: Get module version number
          - task: AzureCLI@2
            name: Publish
            displayName: Publish module
            inputs:
              azureSubscription: $(ServiceConnectionName)
              scriptType: 'bash'
              scriptLocation: 'inlineScript'
              inlineScript: |
                az bicep publish \
                  --target 'br:$(ModuleRegistryServer)/$(ModuleName):$(ModuleVersion)' \
                  --file $(ModuleFilePath)
    

    そうでない場合は、この例に一致するように更新してから保存してください。

  2. Visual Studio Code ターミナルで次のコマンドを実行し、変更をコミットして Git リポジトリにプッシュします。

    git add .
    git commit -m "Add lint and publish stages to storage account module pipeline"
    git push
    

    プッシュした直後に、Azure Pipelines で新しいパイプライン実行が開始されます。

パイプラインの監視

  1. ブラウザーで、[パイプライン]>[パイプライン] を選択します。

  2. アクティブなパイプラインの実行を選択します。

  3. パイプラインの実行が表示されます。

    パイプラインの実行が終了するまで待ちます。 Bicep モジュールがコンテナー レジストリに発行されます。

  4. パイプラインのビルド番号に注目してください。ビルド番号には、今日の日付と一意のリビジョン番号が含まれています。

レジストリ内のモジュールを確認する

発行されたモジュールは、Azure portal で表示することもできます。

  1. ブラウザーで、Azure portal に移動します。

  2. ToyReusable リソース グループに移動します。

  3. 前に作成したコンテナー レジストリを選択します。

  4. メニューから [リポジトリ] ペインを選択します。 次に、パイプラインで発行されたモジュールを表す modules\storage-account リポジトリを選択します。

    コンテナー レジストリ内の Bicep モジュールを示す Azure portal のスクリーンショット。

    パイプラインで発行されたモジュールのバージョン番号と一致する "タグ"が 1 つあることに注目してください。 メジャー バージョン (1) とマイナー バージョン (2) は、 metadata.json ファイルで定義したバージョン番号と一致します。 リビジョン番号 (20230407.3) は、パイプラインのビルド番号と一致します。

リソースのクリーンアップ

これで演習が完了したので、課金されないようにリソースを削除しましょう。

Visual Studio Code ターミナルで、次のコマンドを実行します。

az group delete --resource-group ToyReusable --yes --no-wait

バックグラウンドでリソース グループが削除されます。

Remove-AzResourceGroup -Name ToyReusable -Force

サービス接続と Azure DevOps プロジェクトを削除することもできます。

  • サービス接続

    1. Azure DevOps プロジェクトから、[プロジェクト設定]>[サービス接続] の順に選択します。
    2. [ToyReusable] を選択します。
    3. 右上隅にある [その他のアクション] の 3 つのドットを選択します。
    4. [削除] を選択し、削除を確認します。
  • Azure アプリの登録

    1. ポータルのホーム ページから Microsoft Entra ID を検索し、サービスの一覧からそれを選択します。
    2. [管理]>[アプリの登録] に移動します。
    3. [削除されたアプリケーション][toy-reusable] を選択します。
    4. [完全に削除] を選択し、プロンプトに従います。
  • Azure DevOps プロジェクト

    1. Azure DevOps プロジェクトから、[プロジェクトの設定]>[概要] の順に選択します。
    2. [プロジェクトの削除] から [削除] を選択します。
    3. プロジェクト名を入力し、削除を確認します。