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

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

次の図に示すように、CI / CD パイプラインは、開発用と本番環境用の 2 つの GKE クラスタを使用します。

デベロッパーとエンドユーザーがアプリケーションとやり取りする方法を示す CI / CD パイプラインの概念図

パイプラインの始めに、デベロッパーがサンプル コードベースへの変更を commit します。この操作がトリガーとなり、パイプラインによってリリースが作成され、開発クラスタにデプロイされます。その後リリース管理者がリリースをプロモートし、本番環境クラスタにデプロイします。

このチュートリアルは、デベロッパーと DevOps エンジニアを対象としています。.NET Core、Azure Pipelines、GKE の基本的な知識があることを前提としています。ここでは、Azure DevOps アカウントへの管理アクセス権限も必要となります。

目標

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

費用

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

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

Azure DevOps を使用した場合に適用される可能性がある費用については、Azure DevOps の料金ページをご覧ください。

始める前に

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

  1. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

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

  2. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。 プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  3. Azure DevOps アカウントがあり、そのアカウントに対する管理者権限があることを確認します。Azure DevOps アカウントがまだない場合は、Azure DevOps ホームページで登録できます。

Azure DevOps プロジェクトの作成

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

  1. Azure DevOps ホームページ(https://dev.azure.com/YOUR_AZURE_DEVOPS_ACCOUNT_NAME)に移動します。
  2. [New Project] をクリックします。
  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
  7. [Import] をクリックします。

    インポートプロセスが完了すると、MusicStore アプリのソースコードが表示されます。

継続的なビルド

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

デフォルトの分岐の設定

このチュートリアルは、MusicStore アプリのバージョン 2.1 でビルド、テストされています。同じバージョンを使用するには、Azure Pipelines が release/2.1 分岐をデフォルトの分岐として使用するように構成します。

  1. Azure DevOps のメニューで、[Project settings] を選択します。
  2. [Repos] > [Repositories] の順に選択します。
  3. リポジトリのリストで、先ほどインポートした Git リポジトリを選択します。Azure DevOps プロジェクトと同じ名前になっているはずです。
  4. [Branches] の横の矢印をクリックして分岐のリストを展開します。
  5. [release/2.1] の分岐を選択します。分岐名の横に ... ボタンが表示されます。
  6. [...] をクリックし、[Set as default branch] を選択します。

コードをビルドする

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

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

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

  1. Visual Studio またはコマンドライン git クライアントを使用して、新しい Git リポジトリのクローンを作成します。
  2. リポジトリのルートで、azure-pipelines.yml という名前のファイルを作成します。
  3. 次のコードをファイルにコピーします。

    resources:
    - repo: self
      fetchDepth: 1
    queue:
      name: Hosted Ubuntu 1604
    trigger:
    - release/2.1
    variables:
      TargetFramework: 'netcoreapp2.1'
      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
    

    PROJECT_ID をプロジェクトの名前に置き換え、ファイルを保存します。

  4. 変更を commit し、Azure Pipelines に push します。

    Visual Studio

    1. チーム エクスプローラーを開き、[ホーム] アイコンをクリックします。
    2. [変更] をクリックします。
    3. Add build definition」といった Commit メッセージを入力します。
    4. [すべてをコミットしてプッシュ] をクリックします。

    コマンドライン

    1. 変更されたすべてのファイルをステージングします。

      git add -A
      
    2. ローカル リポジトリへの変更を commit します。

      git commit -m "Add build definition"
      
    3. Azure DevOps への変更を push します。

      git push
      
  5. Azure で [Pipelines] を選択します。

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

Docker イメージを公開する

MusicStore アプリを GKE にデプロイするには、アプリを Docker コンテナ イメージとしてパッケージ化し、Container Registry で利用可能にする必要があります。このタスクには、本番環境プロジェクトでの Container Registry を使用します。

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

コンテナ イメージをビルドして公開できるよう Azure Pipelines を構成する前に、Container Registry で Azure Pipelines が認証されることを確認する必要があります。そのためには、本番環境プロジェクトで Google Cloud サービス アカウントを作成します。

  1. Cloud Console で自分のプロジェクトに切り替えます。
  2. Cloud Console で、Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

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

    gcloud config set project PROJECT_ID
    gcloud config set compute/zone ZONE

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

    例:

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

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

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

    AZURE_PIPELINES_PUBLISHER=azure-pipelines-publisher@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member serviceAccount:$AZURE_PIPELINES_PUBLISHER \
        --role roles/storage.admin
    
  7. サービス アカウント キーを生成します。

    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
  8. Cloud Shell メニューで、[エディタを開く] をクリックします。

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

Azure Pipeline を Container Registry に接続する

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

  1. Azure の DevOps メニューで、[Project settings] を選択してから、[Pipelines]、[Service connections] の順に選択します。
  2. [New service connection] をクリックします。
  3. リストから [Docker Registry] を選択し、[Next] をクリックします。
  4. ダイアログの以下のフィールドに値を入力します。
    • Registry type: Others
    • Docker Registry: https://gcr.io/PROJECT_IDPROJECT_ID はプロジェクト名に置き換えます(例: https://gcr.io/azure-pipelines-test-project-12345)。
    • Docker ID: _json_key
    • Password: azure-pipelines-publisher-oneline.json の内容を貼り付けます。
    • Service connection name: gcr-tutorial
  5. [Save] をクリックして接続を作成します。

Dockerfile の作成

これで、Azure Pipelines がコンテナ イメージのビルドに使用する Dockerfile を作成できます。

  1. リポジトリのルートで、Dockerfile という名前のファイルを作成します。
  2. ファイルに次のコードをコピーし、ファイルを保存します。

    FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
    WORKDIR /app
    COPY samples/MusicStore/bin/Release/netcoreapp2.1/publish /app/
    COPY samples/MusicStore/config.json /app/
    
    ENV ASPNETCORE_URLS=http://0.0.0.0:8080
    
    ENTRYPOINT ["dotnet", "MusicStore.dll"]
    
  3. Git ワークスペースのルートに deployment.yaml という名前の別のファイルを作成します。この段階ではこのファイルを空のままにしておきます。

  4. 変更を commit します。

    Visual Studio

    1. チーム エクスプローラーを開き、左上の [ホーム] アイコンをクリックして [ホーム] ビューに切り替えます。
    2. [変更] をクリックします。
    3. Add Dockerfile and placeholder for the Kubernetes manifest」といった Commit メッセージを入力します。
    4. [すべてをコミット] をクリックします。

    コマンドライン

    1. 変更されたすべてのファイルをステージングします。

      git add -A
      
    2. ローカル リポジトリへの変更を commit します。

      git commit -m "Add Dockerfile and placeholder for the Kubernetes manifest"
      

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

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

  1. 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)'
    
  3. 変更を commit し、Azure Pipelines に push します。

    Visual Studio

    1. チーム エクスプローラーを開き、左上の [ホーム] アイコンをクリックして [ホーム] ビューに切り替えます。
    2. [変更] をクリックします。
    3. Extend build definition to build Docker image」といった Commit メッセージを入力します。
    4. [すべてをコミットしてプッシュ] をクリックします。

    コマンドライン

    1. 変更されたすべてのファイルをステージングします。

      git add -A
      
    2. ローカル リポジトリへの変更を commit します。

      git commit -m "Extend build definition to build Docker image"
      
    3. Azure DevOps への変更を push します。

      git push
      
  4. Azure DevOps のメニューで [Pipelines] を選択します。

    新しいビルドは自動的にトリガーされます。ビルドが完了するまで 2 分ほどかかります。ビルドの完了には 2 分ほどかかります。

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

    1 つのイメージと、そのイメージのタグが表示されます。このタグは、Azure Pipelines で実行されたビルドの数値 ID と一致しています。

継続的デプロイ

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

他の継続的インテグレーション システムとは異なり、Azure Pipelines ではビルドとデプロイが区別され、デプロイ関連のすべてのタスクに、リリース管理というラベルが付けられた専用のツールセットが提供されます。

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

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

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

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

Kubernetes のデプロイを構成する

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

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

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

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

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

  1. deployment.yaml を開いて次のコードを貼り付け、ファイルを保存します。

    apiVersion: v1
    kind: Service
    metadata:
      name: musicstore
    spec:
      ports:
      - port: 80
        targetPort: 8080
        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: 8080
            livenessProbe:      # Used by deployment controller
              httpGet:
                path: /
                port: 8080
              initialDelaySeconds: 5
              periodSeconds: 5
            readinessProbe:     # Used by Ingress/GCLB
              httpGet:
                path: /
                port: 8080
              initialDelaySeconds: 3
              periodSeconds: 5
            resources:
              limits:
                memory: 1024Mi
              requests:
                memory: 768Mi
    
  2. 変更を commit し、Azure Pipelines に push します。

    Visual Studio

    1. チーム エクスプローラーを開き、左上の [ホーム] アイコンをクリックして [ホーム] ビューに切り替えます。
    2. [変更] をクリックします。
    3. Add Kubernetes manifest」といった Commit メッセージを入力します。
    4. [すべてをコミットしてプッシュ] をクリックします。

    コマンドライン

    1. 変更されたすべてのファイルをステージングします。

      git add -A
      
    2. ローカル リポジトリへの変更を commit します。

      git commit -m "Add Kubernetes manifest"
      
    3. Azure DevOps への変更を push します。

      git push
      

開発環境と本番環境を設定する

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

GKE クラスタを作成する

  1. Cloud Shell インスタンスに戻ります。

  2. プロジェクトの GKE API を有効にします。

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

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

    gcloud container clusters create azure-pipelines-cicd-prod

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

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

Google Cloud サービス アカウントを使用して Container Registry を認証することは可能ですが、Azure Pipeline での GKE による認証に Google Cloud サービス アカウントを使用することはできません。Azure Pipeline での GKE による認証には、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] をクリックします。

  7. [Kubernetes] を選択して [Next] をクリックします。

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

    • Authentication method: サービス アカウント
    • Server URL: https://[MASTER-IP]/[MASTER-IP] は前に確認した IP アドレスに置き換えます。
    • Secret: Cloud Shell で次のコマンドを実行し、出力をコピーします。
      kubectl get secret $(kubectl get serviceaccounts azure-pipelines-deploy -o custom-columns=":secrets[0].name") -o yaml
    • Service connection name: azure-pipelines-cicd-dev
  9. [Save] をクリックします。

本番環境クラスタに 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 のメニューで、[Project settings] を選択し、[Pipelines]、[Service connections] の順に選択します。

  6. [New service connection] をクリックします。

  7. [Kubernetes] を選択して [Next] をクリックします。

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

    • Authentication method: サービス アカウント
    • Server URL: https://[MASTER-IP]/[MASTER-IP] は前に確認した IP アドレスに置き換えます。
    • Secret: Cloud Shell で次のコマンドを実行し、出力をコピーします。
      kubectl get secret $(kubectl get serviceaccounts azure-pipelines-deploy -o custom-columns=":secrets[0].name") -o yaml
    • Service connection name: azure-pipelines-cicd-prod
  9. [Save] をクリックします。

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

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

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

リリース定義を作成する

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

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

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

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

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

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

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

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

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

開発クラスタにデプロイする

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

  1. メニューで [Tasks] タブに切り替えます。
  2. [Agent job] をクリックします。
  3. エージェントの仕様を [ubuntu-18.04] に設定します。
  4. [Agent job] の横の [Add a task to agent job] をクリックして、フェーズにステップを追加します。
  5. [Deploy to Kubernetes] タスクを選択して、[Add] をクリックします。
  6. 新たに追加したタスクをクリックし、以下の設定を構成します。

    • Display name: Deploy
    • Action: デプロイ
    • Kubernetes サービス接続: azure-pipelines-cicd-dev
    • Namespace: default
    • Strategy: なし
    • Manifests: manifest/drop/deployment.yaml
  7. [Save] をクリックします。

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

本番環境クラスタにデプロイする

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

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

    • Select trigger: After stage
    • Stages: Dev
    • Pre-deployment approvals: (有効)
    • Approvers: 自分のユーザー名を選択します。

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

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

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

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

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

  10. エージェントの仕様を [ubuntu-18.04] に設定します。

  11. [Add a task to agent job] をクリックして、フェーズにステップを追加します。

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

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

    • Display name: Deploy
    • Action: デプロイ
    • Kubernetes service connection: azure-pipelines-cicd-prod
    • Namespace: default
    • Strategy: なし
    • Manifests: manifest/drop/deployment.yaml
  14. [Save] をクリックします。

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

パイプラインを実行する

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

  1. ローカルのパソコンで、先ほどクローンを作成した Git リポジトリからファイル samples\MusicStore\config.json を開きます。
  2. 3 行目の SiteTitle 設定を ASP.NET MVC Music Store on Kubernetes Engine に変更します。
  3. 変更を commit し、Azure Pipelines に push します。

    Visual Studio

    1. チーム エクスプローラーを開き、[ホーム] アイコンをクリックします。
    2. [変更] をクリックします。
    3. Change site title」といった Commit メッセージを入力します。
    4. [すべてをコミットしてプッシュ] をクリックします。

    コマンドライン

    1. 変更されたすべてのファイルをステージングします。

      git add -A
      
    2. ローカル リポジトリへの変更を commit します。

      git commit -m "Change site title"
      
    3. 変更を Azure Pipelines に push します。

      git push
      
  4. Azure DevOps のメニューで [Pipelines] を選択します。ビルドがトリガーされます。

  5. ビルドが完了したら、[Pipelines] > [Releases] の順に選択します。リリース プロセスが開始されます。

  6. [Release-1] をクリックして詳細ページを開き、Development ステージのステータスが [Succeeded] に切り替わるのを待ちます。

  7. Cloud Console で、[Kubernetes Engine] > [サービスと Ingress] の順に選択します。

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

  9. 同じ行の [エンドポイント] 列でリンクを開きます。ロードバランサが利用可能になるまで数分かかるため、最初はエラーが表示される場合があります。ページが開いたら、Music Store がデプロイ済みであり、カスタム タイトルが使用されていることを確認します。

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

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

    リリースページとメッセージ「A pre-deployment approval is pending ... Approve or Reject」を表示しているスクリーンショット

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

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

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

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

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

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

クリーンアップ

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

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

Azure Pipelines プロジェクトを削除するには、Azure DevOps Services のドキュメントをご覧ください。Azure Pipelines プロジェクトを削除すると、すべてのソースコードの変更が失われます。

Google Cloud の開発プロジェクトと本番環境プロジェクトを削除する

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

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

次のステップ