Azure Pipelines と Google Kubernetes Engine を使用した CI / CD パイプラインの作成

このチュートリアルでは、Azure Pipelines(旧称 Visual Studio Team Services)、Google Kubernetes Engine(GKE)、Container Registry を使用して、継続的インテグレーション / 継続的デプロイ(CI / CD)パイプラインを作成する方法を学習します。ここでは ASP.NET Core を基にした ASP.NET MusicStore ウェブ アプリケーションを使用します。

CI / CD パイプラインでは、テスト用と本番環境用の 2 つの GKE クラスタを使用します。パイプラインの始めに、デベロッパーがサンプル コードベースへの変更を commit します。この操作がトリガーとなり、パイプラインによってリリースが作成され、開発クラスタにデプロイされます。その後リリース管理者がリリースをプロモートし、本番環境クラスタにデプロイします。このプロセスを次の図に示します。

デベロッパーとエンドユーザーがどのようにアプリケーションを操作するかを示す CI / CD パイプラインの概念図

このチュートリアルは、.NET Core、Azure Pipelines、GKE に関する基本的な知識があることを前提としています。また、Azure DevOps アカウントに対する管理者権限を持っていること、Visual Studio 2017 がインストール済みで Azure DevOps アカウントに接続済みであることも必要です。

目標

  • Docker イメージを公開するために Container Registry を Azure Pipelines に接続する。
  • GKE にデプロイする .NET Core サンプル アプリケーションを準備する。
  • 従来の認証を使用せずに GKE での認証を安全に実施する。
  • Azure Pipelines リリース管理を使用して GKE のデプロイをオーケストレートする。

料金

このチュートリアルでは、Google Cloud Platform の課金対象となる以下のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを作成できます。Azure DevOps の使用によって生じる費用については、Azure DevOps 料金ページをご覧ください。

始める前に

Identity and Access Management(IAM)の役割と権限を個別に付与できるようにするため、通常は開発環境と本番環境のワークロードに別個のプロジェクトを使用することをおすすめします。このチュートリアルではわかりやすくするために、開発環境と本番環境の両方の GKE クラスタで 1 つのプロジェクトを使用します。

  1. GCP プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  2. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。

  3. Azure DevOps アカウントがあり、そのアカウントに対する管理者権限があることを確認します。まだ Azure DevOps アカウントがない場合は、Azure DevOps ホームページで登録できます。
  4. Visual Studio 2017 がインストールされ、Azure DevOps アカウントに接続していることを確認します。

Azure DevOps プロジェクトの作成

Azure DevOps を使用してソースコードを管理し、ビルドとテストを実行し、GKE へのデプロイをオーケストレートします。最初に Azure DevOps アカウントで新しいプロジェクトを作成します。

  1. Azure DevOps ホームページ(https://dev.azure.com/[YOUR_AZURE_DEVOPS_ACCOUNT_NAME])に移動します。
  2. [プロジェクトを作成] をクリックします。
  3. Music Store などのプロジェクト名を入力します。
  4. [Visibility] を [Private] に設定してから、[Create] をクリックします。
  5. プロジェクトが作成されたら、左側のメニューで [Repos] をクリックします。
  6. [Import] をクリックして、GitHub から MusicStore リポジトリを fork します。次のように値を設定します。

    • Source type: Git
    • Clone URL: https://github.com/aspnet/MusicStore.git
    • [承認が必要] チェックボックスはオフのままにします。

    [Git リポジトリをインポートする] ダイアログ ボックスのスクリーンショット

  7. [Import] をクリックします。

    インポート処理が完了すると、MusicStore アプリケーションのソースコードが表示されます。

継続的なビルド

この段階で Azure Pipelines を使用して継続的インテグレーションを設定できます。commit によって Git リポジトリへの push を行うたびに、Azure Pipelines によってコードがビルドされ、そのビルドのアーティファクトが Docker コンテナにパッケージ化されます。そのコンテナは Container Registry に公開されます。

testing ブランチの作成

このチュートリアルの手順に問題がないか確認するために、特定のバージョンのソースコードに基づくコードのブランチを作成します(ブランチを作成すると、今後 GitHub 上でコードの変更が発生しても、このチュートリアルが中断されないようにできます)。

  1. Azure DevOps のメニューで、[Repos] > [Tags] を選択します。
  2. タグの一覧で、rel を展開してから 2.0.0 の横にあるアイコンを右クリックします。
  3. [New branch] を選択します。
  4. ブランチ名として「testing」と入力し、[Create branch] をクリックして選択を確定します。

    Azure Pipelines の [Create a branch] ダイアログ ボックスのスクリーンショット

Azure Pipelines では、コードが master ブランチにあることがデフォルトとして想定されます。Azure Pipelines で testing ブランチが使用されるようにするには、デフォルトのブランチを変更する必要があります。

  1. Azure DevOps のメニューで、[Project settings] を選択します。
  2. [Repos]、[Repositories] の順に選択します。
  3. リポジトリのリストで、先ほどインポートした Git リポジトリを選択します。Azure DevOps プロジェクトと同じ名前になっているはずです。
  4. [Branches] の横の矢印をクリックしてブランチのリストを展開します。
  5. testing 分岐を選択します。

    分岐名の横に ... ボタンが表示されます。

  6. [...] をクリックして [既定の分岐として設定] を選択します。

コードのビルド

分岐を作成したら、ビルドの自動化を開始できます。MusicStore は ASP.NET Core アプリケーションであるため、ビルドには以下の 4 つのステップが含まれます。

  • 依存関係をダウンロードしてインストールする。
  • コードをコンパイルする。
  • 単体テストを実施する。
  • ビルド結果を公開する。

後で、GKE へのデプロイを行うためのステップを追加します。GKE は Linux ベースの環境であるため、ビルドプロセス全体を Linux ベースのビルド エージェントで実行するように設定します。

Visual Studio でのプロジェクトのチェックアウト

ビルド パイプラインを定義する YAML ファイルを作成するには、まずコードをチェックアウトする必要があります。

  1. Visual Studio でチーム エクスプローラーを開きます。
  2. メニューの [接続の管理] アイコンをクリックします。
  3. [接続の管理] > [プロジェクトに接続] の順に選択します。

    Visual Studio の [チーム エクスプローラー] ペインにある [プロジェクトに接続] オプションのスクリーンショット

  4. 次のダイアログで、[Music Store] Git リポジトリを選択し、[複製] をクリックします。

    Visual Studio の [プロジェクトに接続] ダイアログで [Music Store] Git リポジトリが選択されているスクリーンショット

ビルド パイプラインを定義する YAML ファイルを作成する

コードをチェックアウトしたら、ビルド パイプラインを構成できます。

  1. Visual Studio でソリューション エクスプローラーを開きます。
  2. ソリューションのルートで、azure-pipelines.yml という名前の新しいファイルを作成します。
  3. 次のコードをコピーしてファイルに貼り付けます。

    resources:
    - repo: self
      fetchDepth: 1
    queue:
      name: Hosted Ubuntu 1604
    trigger:
    - testing
    variables:
      TargetFramework: 'netcoreapp2.0'
      RestoreBuildProjects: 'samples/**/*.csproj'
      TestProjects: 'test/MusicStore.Test/*.csproj'
      BuildConfiguration: 'Release'
      DockerImageName: '[PROJECT-ID]/musicstore'
    steps:
    - task: DotNetCoreCLI@2
      displayName: Restore
      inputs:
        command: restore
        projects: '$(RestoreBuildProjects)'
        feedsToUse: config
        nugetConfigPath: NuGet.config
    - task: DotNetCoreCLI@2
      displayName: Build
      inputs:
        projects: '$(RestoreBuildProjects)'
        arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)'
    - task: DotNetCoreCLI@2
      displayName: Test
      inputs:
        command: test
        projects: '$(TestProjects)'
        arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)'
    - task: DotNetCoreCLI@2
      displayName: Publish
      inputs:
        command: publish
        publishWebProjects: True
        arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)'
        zipAfterPublish: false
        modifyOutputPath: false
    
  4. variables セクションで、[PROJECT_ID] を GCP プロジェクトの名前に置き換えてから、ファイルを保存します。

  5. チーム エクスプローラーを開き、左上の [ホーム] アイコンをクリックして [ホーム] ビューに切り替えます。

  6. [変更] をクリックします。

  7. Add build definition ような commit メッセージを入力します。

  8. [すべてをコミットしてプッシュ] をクリックします。

  9. Azure DevOps のメニューで、[Pipelines]、[Builds] の順に選択します。

    Git リポジトリに commit した YAML ファイルに基づいてビルド定義が作成されたことを確認します。

Docker イメージの公開

MusicStore アプリケーションを GKE にデプロイするには、このアプリケーションを Docker コンテナとしてパッケージ化して Container Registry に公開する必要があります。この段階でビルドの定義を拡張し、ビルドの手順を自動化します。

イメージを公開するためのサービス アカウントの設定

Container Registry に接続するには、GCP で Azure Pipelines を認証できることが必須条件です。そのためには、専用のサービス アカウントを GCP で作成します。

  1. GCP Console で自分のプロジェクトに切り替えて、Cloud Shell を開きます。

    Cloud Shell を開く

  2. プロジェクト ID と Compute Engine ゾーンの各オプションを入力する時間を節約するために、次のコマンドを実行してデフォルトの構成値を設定します。

    gcloud config set project [PROJECT_NAME]
    gcloud config set compute/zone [ZONE]

    [PROJECT_NAME] は使用する GCP プロジェクトの名前に置き換え、[ZONE] はリソース作成に使用するゾーン名に置き換えます。選択するゾーンが不明な場合は、us-central1-a を使用します。

    例:

    gcloud config set project azure-pipelines-test-project-12345
    gcloud config set compute/zone us-central1-a
  3. このプロジェクト用に Container Registry API を有効にします。

    gcloud services enable containerregistry.googleapis.com
  4. Docker イメージを公開する際に使用する、Azure Pipelines のサービス アカウントを作成します。

    gcloud iam service-accounts create azure-pipelines-publisher --display-name "Azure Pipelines Publisher"
  5. そのサービス アカウントにストレージ管理者の IAM 役割を割り当てます。

    PROJECT_NUMBER=$(gcloud projects describe \
        $(gcloud config get-value core/project) \
        --format='value(projectNumber)')
    
    AZURE_PIPELINES_PUBLISHER=$(gcloud iam service-accounts list \
        --filter="displayName:Azure Pipelines Publisher" \
        --format='value(email)')
    
    gcloud projects add-iam-policy-binding \
        $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_PUBLISHER \
        --role roles/storage.admin
    
  6. サービス アカウントキーを生成します。

    gcloud iam service-accounts keys create \
        azure-pipelines-publisher.json --iam-account $AZURE_PIPELINES_PUBLISHER
    
    tr -d '\n' < azure-pipelines-publisher.json > azure-pipelines-publisher-oneline.json
  7. Cloud Shell の右上のボタンをクリックしてコードエディタを起動します。

    Cloud Shell のメニューバーにある [コードエディタの起動] アイコンのスクリーンショット

  8. azure-pipelines-publisher-oneline.json というファイルを開きます。このファイルの内容が以下の手順で必要になります。

Container Registry に Azure Pipeline を接続する

サービス アカウントを作成したら、Azure Pipeline を Container Registry に接続できます。

  1. [Azure DevOps] メニューで [プロジェクトの設定] を選択し、[パイプライン] > [サービス接続] を選択します。
  2. [新しいサービス接続] をクリックします。
  3. リストから [Docker レジストリ] を選択します。
  4. ダイアログの以下のフィールドに値を入力します。

    • Connection Name: gcr-tutorial
    • Docker Registry: https://gcr.io/[PROJECT-ID][PROJECT-ID] は GCP プロジェクトの名前です)

      例: https://gcr.io/azure-pipelines-test-project-12345

    • Docker ID: _json_key

    • Password: azure-pipelines-publisher-oneline.json の内容を貼り付けます。

  5. [OK] をクリックして接続を作成します。

Dockerfile の作成

  1. Visual Studio でソリューション エクスプローラーを開きます。
  2. ソリューションのルートで、Dockerfile という名前の新しいファイルを作成します。
  3. このファイルに次のコードをコピーして貼り付け、ファイルを保存します。

    FROM microsoft/aspnetcore:2.0.0
    WORKDIR /app
    COPY samples/MusicStore/bin/Release/netcoreapp2.0/publish /app/
    ENTRYPOINT ["dotnet", "MusicStore.dll"]
  4. ソリューションのルートで、deployment.yaml という名前の新しいファイルを作成します。この段階ではこのファイルを空のままにしておきます。

  5. チーム エクスプローラーを開き、左上の [ホーム] アイコンをクリックして [ホーム] ビューに切り替えます。

  6. [変更] をクリックします。

  7. Add Dockerfile and placeholder for the Kubernetes manifest」のような commit メッセージを入力します。

  8. [すべてをコミット] をクリックします。

Docker イメージをビルドするためのビルド定義の拡張

必要なファイルをすべてチェックインしたら、ビルド定義を拡張できます。

  1. Visual Studio で azure-pipelines.yml を開きます。
  2. このファイルに次のコードを付加してビルド定義を拡張します。

    - task: CmdLine@1
      displayName: 'Lock image version in deployment.yaml'
      inputs:
        filename: /bin/bash
        arguments: '-c "awk ''{gsub(\"MUSICSTORE_IMAGE\", \"gcr.io/$(DockerImageName):$(Build.BuildId)\", $0); print}'' deployment.yaml > $(build.artifactstagingdirectory)/deployment.yaml"'
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact'
      inputs:
        PathtoPublish: '$(build.artifactstagingdirectory)'
    - task: Docker@0
      displayName: 'Build image'
      inputs:
        containerregistrytype: 'Container Registry'
        dockerRegistryConnection: 'gcr-tutorial'
        imageName: '$(DockerImageName):$(Build.BuildId)'
    - task: Docker@0
      displayName: 'Publish image'
      inputs:
        containerregistrytype: 'Container Registry'
        dockerRegistryConnection: 'gcr-tutorial'
        action: 'Push an image'
        imageName: '$(DockerImageName):$(Build.BuildId)'
    

変更を commit して Azure DevOps に push する手順は次のとおりです。

  1. Visual Studio でチーム エクスプローラーを開きます。
  2. 左上の [ホーム] アイコンをクリックして、[ホーム] ビューに切り替えます。
  3. [変更] をクリックします。
  4. Extend build definition to build Docker image のような commit メッセージを入力します。
  5. [すべてをコミットしてプッシュ] をクリックします。
  6. Azure DevOps のメニューで、[Pipelines]、[Builds] の順に選択します。

    新しいビルドが自動的に起動されたことを確認してください。ビルドの完了には 2 分ほどかかります。

    エラー メッセージ [Step input dockerRegistryConnection references service connection gcr-tutorial which could not be found] が表示されてビルドが失敗した場合、必要に応じてパイプラインを保存し直します

  7. イメージが Container Registry に公開されたことを確認するには、GCP Console に切り替えて、[Container Registry] > [イメージ] の順に選択し、[musicstore] をクリックします。

    イメージが 1 つあり、そのイメージのタグが Azure Pipelines で実行されたビルドの数値 ID と一致することを確認します。

    Container Registry のイメージリストのスクリーンショット

継続的デプロイ

commit するたびに Azure Pipelines で自動的にコードのビルドと Docker イメージの公開が実施されるようになったら、デプロイするための操作に移行できます。

Azure Pipelines は他の継続的インテグレーション システムとは異なり、ビルドとデプロイを明確に区別します。Azure Pipelines には、すべてのデプロイ関連タスク用にリリース管理という特殊なツールセットが用意されています。

Azure Pipelines リリース管理は、次のコンセプトに基づいて構築されています。

  • リリースは、通常はビルドプロセスの結果からなる、アプリケーションの特定のバージョンを形成するアーティファクト群です。
  • デプロイは、リリースを特定の環境に導入する過程です。
  • デプロイによって一連のタスクが実行され、タスクはジョブにグループ分けされます。
  • ステージによってパイプラインを分割でき、ステージを使用することで、開発環境やテスト環境などの複数の環境へのデプロイをオーケストレートできます。

MusicStore のビルドプロセスによって生成されるメイン アーティファクトは Docker イメージです。ただし、Docker イメージは Container Registry に公開されるため、Azure Pipelines の対象範囲には含まれません。そのため、Docker イメージはリリースの定義としては利用できません。

Kubernetes をデプロイするには、マニフェストも必要です。マニフェストは部品表(BOM)に似ています。マニフェストは Kubernetes によって作成、管理されるリソースを定義するだけでなく、使用する Docker イメージのバージョンも明示します。Kubernetes マニフェストは、Azure Pipelines リリース管理でリリースを定義するアーティファクトとして適しています。

Kubernetes のデプロイ構成

Kubernetes で MusicStore を実行するには、以下のリソースが必要です。

  • デプロイメント。ビルドによって生成された Docker イメージを実行する単一のポッドを定義します。
  • NodePort サービス。このサービスによってロードバランサがポッドにアクセスできます。
  • Ingress。これにより、Cloud HTTP(S) ロードバランサを使用してアプリケーションが公共のインターネットに公開されます。

MusicStore アプリケーションでは、SQL Server またはローカルに保存された組み込みデータベースを使用できます。説明をわかりやすくするため、組み込みデータベースに依存するデフォルトの構成を使用します。ただし、次の 2 つの制限が存在します。

  • 一度に実行できるポッドのコピーは 1 つだけです。複数のポッドを実行すると、ユーザーに表示されるデータがポッドごとに変わる可能性があります。
  • 永続ボリュームを使用するようにデプロイを変更しないと、ポッドを再起動するたびにすべてのデータ変更が失われます(この状況については、このチュートリアルでは取り上げません)。

上記の Kubernetes リソースを定義する手順は次のとおりです。

  1. Visual Studio でソリューション エクスプローラーを開きます。
  2. deployment.yaml を開いて次のコードに貼り付け、ファイルを保存します。

    apiVersion: v1
    kind: Service
    metadata:
      name: musicstore
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
        name: http
      selector:
        app: musicstore
      type: NodePort
    
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: musicstore
    spec:
      backend:
        serviceName: musicstore
        servicePort: 80
    
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: musicstore
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: musicstore
        spec:
          containers:
          - name: musicstore
            image: MUSICSTORE_IMAGE
            ports:
              - containerPort: 80
            livenessProbe:      # Used by deployment controller
              httpGet:
                path: /
                port: 80
              initialDelaySeconds: 5
              periodSeconds: 5
            readinessProbe:     # Used by Ingress/GCLB
              httpGet:
                path: /
                port: 80
              initialDelaySeconds: 3
              periodSeconds: 5
            resources:
              limits:
                memory: 1024Mi
              requests:
                memory: 768Mi
    
  3. チーム エクスプローラーを開き、[ホーム] ビューに切り替えます。

  4. [変更] をクリックします。

  5. Add Kubernetes manifest」のような commit メッセージを入力します。

  6. [すべてをコミットしてプッシュ] をクリックします。

開発環境と本番環境の設定

Azure Pipelines リリース管理に戻る前に、GKE クラスタを作成する必要があります。

GKE クラスタの作成

  1. GCP で Cloud Shell インスタンスを開きます。
  2. プロジェクト ID と Compute Engine ゾーンの各オプションを入力する時間を節約するために、次のコマンドを実行してデフォルトの構成値を設定します。

    gcloud config set project [PROJECT_NAME]
    gcloud config set compute/zone [ZONE]

    例:

    gcloud config set project azure-pipelines-test-project-12345
    gcloud config set compute/zone us-central1-a
  3. プロジェクトの GKE API を有効にします。

    gcloud services enable container.googleapis.com
  4. 次のコマンドを使用して開発クラスタを作成します。完了するまで数分かかることがあります。

    gcloud container clusters create azure-pipelines-cicd-dev
  5. 次のコマンドを使用して本番環境クラスタを作成します。完了するまで数分かかることがあります。

    gcloud container clusters create azure-pipelines-cicd-prod

開発クラスタに Azure Pipeline を接続する

Azure Pipelines を使用すると Container Registry などの外部 Docker レジストリに接続できますが、同様に、Azure Pipelines を使用して外部 Kubernetes クラスタを統合できます。

GCP サービス アカウントを使用して Container Registry を認証することは可能ですが、Azure Pipeline では GKE を使用する認証に GCP サービス アカウントを使用することはサポートされていません。代わりに、Kubernetes サービス アカウントを使用する必要があります。

したがって、Azure Pipelines を開発クラスタに接続するには、まず Kubernetes サービス アカウントを作成する必要があります。

  1. Cloud Shell で、開発クラスタに接続します。

    gcloud container clusters get-credentials azure-pipelines-cicd-dev
  2. Azure Pipeline 用の Kubernetes サービス アカウントを作成します。

    kubectl create serviceaccount azure-pipelines-deploy
  3. クラスタの役割バインディングを作成して、サービス アカウントに cluster-admin の役割を割り当てます。

    kubectl create clusterrolebinding azure-pipelines-deploy --clusterrole=cluster-admin --serviceaccount=default:azure-pipelines-deploy
  4. クラスタの IP アドレスを指定します。

    gcloud container clusters describe azure-pipelines-cicd-dev --format=value\(endpoint\)
    

    後でこのアドレスが必要になります。

  5. Azure DevOps のメニューで、[Project settings] を選択してから、[Pipelines]、[Service connections] の順に選択します。

  6. [New service connection] をクリックし、[Kubernetes] を選択します。

  7. 以下の設定を構成します。

    • Choose authentication: サービス アカウント
    • Connection name: azure-pipelines-cicd-dev
    • Server URL: https://[MASTER-IP]/[MASTER-IP] を前に確認した IP アドレスに置き換えます)
    • Token: Cloud Shell で次のコマンドを実行し、出力をコピーします。
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data.token}{'\n'}"
    • Certificate: Cloud Shell で次のコマンドを実行し、出力をコピーします。
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data['ca\.crt']}{'\n'}"
  8. [OK] をクリックします。

本番環境クラスタに Azure Pipeline を接続する

Azure Pipelines を本番環境クラスタに接続する場合も、同じ手順を使用できます。

  1. Cloud Shell で、本番環境クラスタに接続します。

    gcloud container clusters get-credentials azure-pipelines-cicd-prod
  2. Azure Pipeline 用の Kubernetes サービス アカウントを作成します。

    kubectl create serviceaccount azure-pipelines-deploy
  3. クラスタの役割バインディングを作成して、サービス アカウントに cluster-admin の役割を割り当てます。

    kubectl create clusterrolebinding azure-pipelines-deploy --clusterrole=cluster-admin --serviceaccount=default:azure-pipelines-deploy
  4. クラスタの IP アドレスを指定します。

    gcloud container clusters describe azure-pipelines-cicd-prod --format=value\(endpoint\)
    

    後でこのアドレスが必要になります。

  5. [Azure DevOps] メニューで [プロジェクトの設定] を選択し、[パイプライン] > [サービス接続] を選択します。

  6. [新しいサービス接続] をクリックし、[Kubernetes] を選択します。

  7. 以下を構成します。

    • Choose authentication: サービス アカウント
    • Connection name: azure-pipelines-cicd-prod
    • Server URL: https://[MASTER-IP]/[MASTER-IP] を前に確認した IP アドレスに置き換えます)
    • Token: Cloud Shell で次のコマンドを実行し、出力をコピーします。
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data.token}{'\n'}"
    • Certificate: Cloud Shell で次のコマンドを実行し、出力をコピーします。
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data['ca\.crt']}{'\n'}"
  8. [OK] をクリックします。

リリース パイプラインを構成する

GKE インフラストラクチャを設定したら、Azure Pipelines に戻ってデプロイを自動化します。デプロイには以下の操作が含まれます。

  • 開発環境にデプロイする。
  • 本番環境へのデプロイを開始する前に、手動承認をリクエストする。
  • 本番環境にデプロイする。

リリース定義の作成

最初に、新しいリリース定義を作成します。

  1. Azure DevOps のメニューで、[パイプライン] > [リリース] の順に選択します。
  2. [新しいパイプライン] をクリックします。
  3. テンプレートのリストから [Empty job] を選択します。
  4. ステージ名の入力が求められたら、「Dev」と入力します。
  5. 画面上部でリリースに MusicStore-KubernetesEngine という名前を付けます。
  6. パイプライン図で、[成果物] の横にある [追加] をクリックします。
  7. [Build] を選択して、以下の設定を追加します。

    • Source (build pipeline): ビルド定義を選択します(選択肢は 1 つだけです)
    • Default version: Latest
    • Source Alias: manifest
  8. [Add] をクリックします。

  9. [Artifact] ボックスで、稲妻のアイコンをクリックしてデプロイ トリガーを追加します。

  10. [Continuous deployment trigger] で、スイッチを [Enabled] に設定します。

  11. [Save] をクリックします。

  12. 必要に応じてコメントを入力し、[Save] をクリックして確定します。

パイプラインは次のようになります。

Azure Pipelines で更新されたパイプラインのスクリーンショット

開発クラスタへのデプロイ

リリース定義を作成したら、GKE 開発クラスタへのデプロイを構成できるようになります。

  1. [パイプライン] メニューで [タスク] タブに切り替えます。
  2. [エージェント ジョブ] をクリックします。
  3. エージェント プールを [Hosted Ubuntu 1604] に変更します。
  4. [Agent job] の横の [+] アイコンをクリックして、フェーズにステップを追加します。
  5. [Deploy to Kubernetes] タスクを選択して、[Add] をクリックします。
  6. 新たに追加したタスクをクリックし、以下の設定を構成します。

    • Display name: Deploy
    • サービス接続タイプ: Kubernetes Service Connection
    • Kubernetes サービス接続: azure-pipelines-cicd-dev
    • Command: apply
    • Use configuration: Enabled
    • Configuration type: File path
    • Configuration file: manifest/drop/deployment.yaml
  7. [保存] をクリックします。

  8. 必要に応じてコメントを入力し、[OK] をクリックして確定します。

本番環境クラスタへのデプロイ

最後に GKE の本番環境クラスタへのデプロイを構成します。

  1. メニューで [パイプライン] タブに切り替えます。
  2. [ステージ] ボックスで、[追加] > [新しいステージ] を選択します。
  3. テンプレートのリストから [Empty job] を選択します。
  4. ステージ名の入力が求められたら、「Prod」と入力します。
  5. 新たに作成したステージの稲妻のアイコンをクリックします。
  6. 以下を構成します。

    • Select trigger: After stage
    • Stages: Dev
    • 配置前の承認: (有効)
    • 承認者: 自分のユーザー名かグループを選択します。

    パイプラインは次のようになります。

    Azure Pipelines で更新されたパイプラインのスクリーンショット

  7. [タスク] タブに切り替えます。

  8. [Tasks] タブにマウスカーソルを合わせ、[Tasks]、[Prod] の順に選択します。

  9. [Agent job] をクリックします。

  10. エージェント プールを [Hosted Ubuntu 1604] に変更します。

  11. [+] アイコンをクリックしてステップをフェーズに追加します。

  12. [Deploy to Kubernetes] タスクを選択して、[Add] をクリックします。

  13. 新たに追加したタスクをクリックし、以下の設定を構成します。

    • Display name: Deploy
    • Service connection type: Kubernetes Service Connection
    • Kubernetes service connection: azure-pipelines-cicd-prod
    • Command: apply
    • Use configuration: Enabled
    • Configuration type: File path
    • Configuration file: manifest/drop/deployment.yaml
  14. [Save] をクリックします。

  15. 必要に応じてコメントを入力し、[OK] をクリックして確定します。

パイプラインの実行

パイプライン全体の構成が済んだら、ソースコードの変更を行ってパイプラインをテストできます。

  1. Visual Studio でファイル samples\MusicStore\config.json を開きます。
  2. 3 行目の SiteTitle 設定を ASP.NET MVC Music Store running on Google Kubernetes Engine に変更します。
  3. チーム エクスプローラーを開き、[ホーム] ビューに切り替えます。
  4. [変更] をクリックします。
  5. Change site title のような commit メッセージを入力します。
  6. [すべてをコミットしてプッシュ] をクリックします。
  7. Azure DevOps のメニューで、[Pipelines]、[Builds] の順に選択し、ビルドが自動的にトリガーされたことを確認します。

    進行中のビルドのリスト(図では Music Store のビルドが進行中)を示すスクリーンショット

    ステータスが [成功] に切り替わるまで 2 分ほどかかります。

  8. ビルドが完了したら、[パイプライン] > [リリース] の順に選択し、リリース プロセスが開始されたことを確認します。

    リリース プロセスが開始されたことを示すスクリーンショット

  9. [リリース-1] をクリックして詳細ページを開き、開発ステージのステータスが [成功] に切り替わるのを待ちます。場合によっては、メニューの [更新] ボタンをクリックするか、ブラウザページを再読み込みしてステータスを更新する必要があります。

  10. GCP Console で、[Kubernetes Engine] > [サービス] の順に選択します。

  11. azure-pipelines-cicd-dev クラスタの Ingress サービスを確認して、そのステータスが [OK] に切り替わるのを待ちます。これには数分かかることがあります。

  12. 同じ行の */* が表示されているリンクの URL をコピーし、末尾のアスタリスクを削除します。

  13. 新しいブラウザタブでその URL を開きます。ロードバランサが利用可能になるまで数分かかるため、最初はエラーが表示される場合があります。ページが開いたら、Music Store がデプロイ済みであり、カスタム タイトルが使用されていることを確認します。

    ブラウザページで実行中の Music Store アプリを示すスクリーンショット

  14. Azure Pipelines で、[Prod] ステージの下にある [Approve] ボタンをクリックして、本番環境へのデプロイをプロモートします。

    リリースページとメッセージ [配置前の承認は、...[承認または却下] で保留中です。] を示すスクリーンショット

    ボタンが表示されない場合は、まず以前のリリースを承認または却下する必要があります。

  15. 必要に応じてコメントを入力し、[承認] をクリックして確定します。

  16. Prod 環境のステータスが [成功] に切り替わるのを待ちます。場合によっては、ブラウザのページを手動で更新する必要があります。

  17. GCP Console で、[サービス] ページを更新します。

  18. azure-pipelines-cicd-prod クラスタの Ingress サービスを確認して、そのステータスが [OK] に切り替わるのを待ちます。これには数分かかることがあります。

  19. 同じ行の */* が表示されているリンクの URL をコピーし、末尾のアスタリスクを削除します。

  20. 新しいブラウザタブでその URL を開きます。ロードバランサが利用可能になるまで数分かかるため、この場合も最初はエラーが表示されることがあります。ページが開くと、この場合もカスタム タイトルが付いた Music Store アプリが表示されます。ただし、今回は本番環境クラスタで実行されます。

クリーンアップ

このチュートリアルの完了後に請求が発生しないようにするには、作成したエンティティを削除してください。

Azure Pipelines プロジェクトを削除する

Azure Pipelines でプロジェクトを削除します。ただし、プロジェクトを削除するとソースコードの変更もすべて失われます。

GCP プロジェクトの削除

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...