次の方法で共有


Azure Pipelines を使用したビルドと Azure Kubernetes Service へのデプロイ

Azure DevOps Services

Azure Pipelinesを使用して、Azure Kubernetes サービス (AKS) に自動的にデプロイします。 Azure Pipelines を使用すると、 Azure DevOps を使用して継続的インテグレーション (CI) と継続的デリバリー (CD) でビルド、テスト、およびデプロイを行うことができます。

この記事では、アプリを継続的にビルドしてデプロイするパイプラインを作成する方法について説明します。 Dockerfile を含むリポジトリ内のコードを変更すると、そのたびにイメージが Azure Container Registry にプッシュされ、その後、マニフェストが AKS クラスターにデプロイされます。

前提条件

コードを取得する

サンプル アプリケーションと Dockerfile を含む次のリポジトリをフォークします。

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Azure リソースの作成

Azure portal にサインインし、右上隅にある [Cloud Shell] ボタンを選択します。 Azure CLI または PowerShell を使用して AKS クラスターを作成します。

コンテナー レジストリの作成

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys

Azure Pipelines にサインインする

Azure Pipelines にサインインします。 サインインすると、ブラウザーが https://dev.azure.com/my-organization-name に移動し、Azure DevOps ダッシュボーが表示されます。

選択した組織内で、"プロジェクト" を作成します。 組織にプロジェクトがない場合、 [プロジェクトを作成して開始します] 画面が表示されます。 それ以外の場合は、ダッシュボードの右上隅にある [プロジェクトの作成] ボタンを選択します。

パイプラインを作成する

リポジトリを接続して選択する

  1. Azure DevOps 組織にサインインし、プロジェクトに移動します。

  2. パイプラインに移動し、[新しいパイプライン] を選択します。

  3. 最初に、ソース コードの場所として GitHub を選択し、ウィザードの手順を実行します。

  4. サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。

  5. リポジトリの一覧が表示されたら、目的のリポジトリを選択します。

  6. Azure Pipelines アプリをインストールするために、GitHub にリダイレクトされる場合があります。 その場合は、[承認してインストール] を選択します。

  7. [Deploy to Azure Kubernetes Service] (Azure Kubernetes Service へのデプロイ) を選択します。

  8. メッセージが表示されたら、レジストリとクラスターを作成したサブスクリプションを選択します。

  9. myapp クラスターを選択します。

  10. [名前空間] で、[存在している] を選択し、次に [既定] を選択します。

  11. コンテナー レジストリの名前を選択します。

  12. イメージ名は既定値に設定されたままにしておくことができます。

  13. サービス ポートを 8080 に設定します。

  14. 後の手順で自動生成されるパイプラインの YAML に、アプリの確認に関連した構成が組み込まれるように、[pull request に対してアプリの確認を有効にする] チェック ボックスを設定します。

  15. [Validate and configure] を選択します。

    Azure Pipelines によってパイプラインが作成され、次の処理が行われます。

    • "Docker レジストリ サービス接続" を作成して、パイプラインからコンテナー レジストリにイメージをプッシュできるようにします。

    • "環境" を作成し、その環境内に Kubernetes リソースを作成します。 RBAC が有効なクラスターの場合、Kubernetes リソースを作成すると、クラスター内に ServiceAccount および RoleBinding オブジェクトが暗黙的に作成されます。作成された ServiceAccount は、選択された名前空間の外部で操作を実行できません。

    • パイプラインを定義する azure-pipelines.yml ファイルを生成します。

    • Kubernetes マニフェスト ファイルを生成します。 これらのファイルは、選択した内容に基づいて deployment.ymlservice.yml テンプレートをハイドレートすることによって生成されます。 準備ができたら、[保存および実行] を選択します。

  16. [保存および実行] を選択します。

  17. [コミット メッセージ] を "リポジトリにパイプラインを追加する" などに変更できます。 準備ができたら、[保存および実行] を選択して新しいパイプラインをリポジトリにコミットし、その後、新しいパイプラインの初回実行を開始します。

アプリのデプロイを確認する

パイプラインが実行されると、ビルド ステージが、次にデプロイ ステージが、青色 (実行中) から緑色 (完了) に移行するので、その様子を監視します。 ステージとジョブを選択して、パイプラインの動作を監視できます。

Note

Microsoft ホステッド エージェントを使用している場合は、Microsoft ホステッド エージェントの IP 範囲をファイアウォールに追加する必要があります。 毎週水曜日に公開される週単位の JSON ファイルから、IP 範囲の週単位の一覧を取得できます。 新しい IP 範囲は、次の月曜日に有効になります。 詳細については、Microsoft ホステッド エージェントに関するページを参照してください。 ご自身の Azure DevOps 組織に必要な IP 範囲を見つけるには、Microsoft ホステッド エージェントの想定される IP 範囲を特定する方法を確認してください。

パイプラインの実行が完了したら、何が行われたかを調べ、アプリがデプロイされていることを確認します。 パイプラインの概要から:

  1. [環境] タブを選択します。

  2. [環境を表示する] を選択します。

  3. デプロイ先の名前空間のアプリの場合は、インスタンスを選択します。 既定値を使用した場合は、既定の名前空間の myapp アプリです。

  4. [サービス] タブを選択します。

  5. 外部 IP アドレスを選択し、クリップボードにコピーします。

  6. 新しいブラウザー タブまたはウィンドウを開き、「<IP アドレス>:8080」を入力します。

サンプル アプリをビルドしている場合は、Hello world がブラウザーに表示されます。

パイプラインのビルド方法

オプションの選択を完了し、パイプラインの検証と構成に進むと、[Deploy to Azure Kubernetes Service] (Azure Kubernetes Service へのデプロイ) テンプレートを使用して、Azure Pipelines によってパイプラインが作成されています。

ビルド ステージでは、Docker タスクを使用してイメージをビルドし、Azure Container Registry にプッシュします。

- stage: Build
  displayName: Build stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)
          
    - task: PublishPipelineArtifact@1
      inputs:
        artifactName: 'manifests'
        path: 'manifests'

デプロイ ジョブでは、"Kubernetes マニフェスト タスク" を使用して、Kubernetes クラスター ノードで Azure Container Registry リソースからプルするために必要な imagePullSecret を作成します。 その後、マニフェスト ファイルは、Kubernetes クラスターにデプロイするために Kubernetes マニフェスト タスクによって使用されます。 マニフェスト ファイル service.ymldeployment.yml は、Azure Kubernetes Service へのデプロイ テンプレートを使用したときに生成されました。

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  jobs:
  - deployment: Deploy
    displayName: Deploy job
    pool:
      vmImage: $(vmImageName)
    environment: 'myenv.aksnamespace' #customize with your environment
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadPipelineArtifact@2
            inputs:
              artifactName: 'manifests'
              downloadPath: '$(System.ArtifactsDirectory)/manifests'

          - task: KubernetesManifest@1
            displayName: Create imagePullSecret
            inputs:
              action: 'createSecret'
              connectionType: 'kubernetesServiceConnection'
              kubernetesServiceConnection: 'myapp-default' #customize for your Kubernetes service connection
              secretType: 'dockerRegistry'
              secretName: '$(imagePullSecret)'
              dockerRegistryEndpoint: '$(dockerRegistryServiceConnection)'

          - task: KubernetesManifest@1
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: 'deploy'
              connectionType: 'kubernetesServiceConnection'
              kubernetesServiceConnection: 'myapp-default' #customize for your Kubernetes service connection
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              containers: '$(containerRegistry)/$(imageRepository):$(tag)'
              imagePullSecrets: '$(imagePullSecret)'

リソースをクリーンアップする

作成したリソースを使い終わったら、次のコマンドを使用してリソースを削除できます。

az group delete --name myapp-rg

プロンプトが表示されたら、「y」を入力します。