チュートリアル:Jenkins を使用して GitHub から Azure Kubernetes Service にデプロイする

重要

多くの Azure サービスには Jenkins プラグインがあります。これらのプラグインの一部は、2024 年 2 月 29 日時点ではサポート対象外となります。 Azure CLI は、Jenkins と Azure サービスを統合するために現在推奨されている方法です。 詳細については、「Azure 用の Jenkins プラグイン」を参照してください。

このチュートリアルでは、Jenkins で継続的インテグレーション (CI) と継続的デプロイ (CD) を設定して、GitHub から Azure Kubernetes Service (AKS) クラスターにサンプル アプリをデプロイします。

このチュートリアルでは、以下のタスクを完了します。

  • サンプルの Azure 投票アプリを AKS クラスターにデプロイする
  • 基本的な Jenkins プロジェクトを作成する
  • ACR とやりとりする Jenkins 用の資格情報を設定する
  • Jenkins ビルド ジョブと自動ビルド用の GitHub Webhook を作成する
  • GitHub コード コミットに基づき、CI/CD パイプラインをテストして AKS でアプリケーションをアップデートする

前提条件

このチュートリアルを完了するには、以下のものが必要です。

アプリケーションの準備

この記事では、一時的なデータ ストレージ用の Web インターフェイスと Redis を含むサンプルの Azure 投票アプリケーションを使用します。

Jenkins と AKS を自動デプロイ用に統合する前に、まず手動で Azure 投票アプリケーションを準備し、AKS クラスターにデプロイします。 この手動のデプロイにより、アプリケーションが動作していることを確認できます。

Note

サンプルの Azure 投票アプリケーションでは、Linux ノード上で実行するようにスケジュールされた Linux ポッドを使用します。 この記事で概要を説明するフローは、Windows Server ノード上でスケジュールされた Windows Server ポッドでも機能します。

サンプル アプリケーション (https://github.com/Azure-Samples/azure-voting-app-redis) の GitHub リポジトリをフォークします。 自身の GitHub アカウントにリポジトリをフォークするには、右上隅の [Fork] ボタンを選択します。

開発システム用にフォークの複製を作成します。 このリポジトリを複製するときに、フォークの URL を使用するようにします。

git clone https://github.com/<your-github-account>/azure-voting-app-redis.git

複製したフォークのディレクトリに変更します。

cd azure-voting-app-redis

サンプル アプリケーションに必要なコンテナー イメージを作成するには、docker-composedocker-compose.yaml ファイルを使用します。

docker-compose up -d

必要な基本イメージがプルされ、アプリケーション コンテナーがビルドされます。 その後、docker images コマンドを使用して、作成されたイメージを確認できます。 3 つのイメージがダウンロードまたは作成されていることを確認してください。 azure-vote-front イメージはアプリケーションを含み、nginx-flask イメージをベースとして使用します。 redis イメージは、Redis インスタンスを起動するために使用されます。

$ docker images

REPOSITORY                   TAG        IMAGE ID            CREATED             SIZE
azure-vote-front             latest     9cc914e25834        40 seconds ago      694MB
redis                        latest     a1b99da73d05        7 days ago          106MB
tiangolo/uwsgi-nginx-flask   flask      788ca94b2313        9 months ago        694MB

自分の Azure コンテナー レジストリにサインインします。

az acr login -n <acrLoginServer>

<acrLoginServer> は、実際の ACR ログイン サーバーに置き換えてください。

docker tag コマンドを使用して、ACR ログイン サーバー名とバージョン番号 v1 でイメージにタグを付けます。 前のステップで取得した独自の <acrLoginServer> 名を使用します。

docker tag azure-vote-front <acrLoginServer>/azure-vote-front:v1

最後に、azure-vote-front イメージを ACR レジストリにプッシュします。 ここでも、<acrLoginServer>myacrregistry.azurecr.io などの独自の ACR レジストリのログイン サーバー名と置き換えます。

docker push <acrLoginServer>/azure-vote-front:v1

サンプル アプリケーションを AKS にデプロイする

サンプル アプリケーションを AKS クラスターにデプロイするには、Azure 投票リポジトリのルートにある Kubernetes マニフェスト ファイルを使用します。 vi などのエディターで azure-vote-all-in-one-redis.yaml マニフェスト ファイルを開きます。 microsoft は、実際の ACR ログイン サーバー名に置き換えてください。 この値は、マニフェスト ファイルの 60 行にあります。

containers:
- name: azure-vote-front
  image: azuredocs/azure-vote-front

次に、kubectl apply コマンドを使用して、アプリケーションを AKS クラスターにデプロイします。

kubectl apply -f azure-vote-all-in-one-redis.yaml

アプリケーションをインターネットに公開するための Kubernetes ロード バランサー サービスが作成されます。 このプロセスには数分かかる場合があります。 ロード バランサーのデプロイの進行状況を監視するには、kubectl get service コマンドを使用し、--watch 引数を指定します。 EXTERNAL-IP アドレスが "保留中" から "IP アドレス" に変わったら、Control + C を使用して kubectl ウォッチ プロセスを停止します。

$ kubectl get service azure-vote-front --watch

NAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
azure-vote-front   LoadBalancer   10.0.215.27   <pending>     80:30747/TCP   22s
azure-vote-front   LoadBalancer   10.0.215.27   40.117.57.239   80:30747/TCP   2m

アプリケーションが動作していることを確認するには、Web ブラウザーを開いてサービスの外部 IP アドレスにアクセスします。 次の例に示すように、Azure 投票アプリケーションが表示されます。

Azure sample vote application running in AKS

Jenkins コントローラーの構成

次の変更を適用して、Jenkins コントローラーからの AKS デプロイを有効にします。

ポート 80 を受信用に開きます。

az vm open-port \
--resource-group <Resource_Group_name> \
--name <Jenkins_Controller_VM>  \
--port 80 --priority 1020

<Resource_Group_name><Jenkins_Controller_VM> を、適切な値に置き換えます。

Jenkins コントローラーに SSH で接続します。

ssh azureuser@<PublicIPAddres>

<PublicIPAddress>を Jenkins コントローラーの IP アドレスに置き換えます。

AzCLI のインストールとログイン

curl -L https://aka.ms/InstallAzureCli | bash
az login

Note

AzCLI を手動でインストールするには、これらの手順に従います。

Docker をインストールする

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -;
sudo apt-key fingerprint 0EBFCD88;
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable";
sudo apt-get update;
sudo apt-get install docker-ce -y;

Kubectl をインストールして AKS に接続する

sudo az aks install-cli
sudo az aks get-credentials --resource-group <Resource_Group> --name <AKS_Name>

<Resource_Group><AKS_Name> を、適切な値に置き換えます。

アクセスを構成する

sudo usermod -aG docker jenkins;
sudo usermod -aG docker azureuser;
sudo touch /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion;
sudo service jenkins restart;
sudo cp ~/.kube/config /var/lib/jenkins/.kube/
sudo chmod 777 /var/lib/jenkins/
sudo chmod 777 /var/lib/jenkins/config

Jenkins の環境変数を作成する

ACR ログイン サーバー名を保持するために Jenkins の環境変数が使用されます。 この変数は、Jenkins のビルド ジョブ中に参照されます。 この環境変数を作成するには、次の手順を完了します。

  • Jenkins ポータルの左側にある [Jenkins の管理] > [システムの構成] を選択します。

  • [グローバル プロパティ][環境変数] を選択します。 名前 ACR_LOGINSERVER と ACR ログイン サーバーの値で変数を追加します。

    Jenkins environment variables

  • 完了したら、ページの下部にある [保存] を選択します。

ACR の Jenkins 資格情報を作成する

CI/CD プロセス中に、Jenkins がアプリケーションの更新プログラムに基づいて新しいコンテナーのイメージをビルドし、その後これらのイメージを ACR レジストリにプッシュする必要があります。

Jenkins が更新されたコンテナー イメージを ACR にプッシュできるようにするには、ACR の資格情報を指定する必要があります。

ロールとアクセス許可を分離するために、ACR レジストリへの Contributor アクセス許可で Jenkins 用のサービス プリンシパルを構成します。

ACR を使用する Jenkins 用のサービス プリンシパルを作成する

まず、az ad sp create-for-rbac コマンドを使用して、サービス プリンシパルを作成します。

az ad sp create-for-rbac
{
  "appId": "626dd8ea-042d-4043-a8df-4ef56273670f",
  "displayName": "azure-cli-2018-09-28-22-19-34",
  "name": "http://azure-cli-2018-09-28-22-19-34",
  "password": "1ceb4df3-c567-4fb6-955e-f95ac9460297",
  "tenant": "72f988bf-86f1-41af-91ab-2d7cd011db48"
}

appIdpassword を書き留めておいてください。 これらの値は、Jenkins で資格情報リソースを構成する次の手順で使用します。

az acr show コマンドを使用して ACR レジストリのリソース ID を取得し、それを変数として保存します。

ACR_ID=$(az acr show --resource-group <Resource_Group> --name <acrLoginServer> --query "id" --output tsv)

<Resource_Group><acrLoginServer> を、適切な値に置き換えます。

サービス プリンシパルの Contributor 権限を ACR レジストリに割り当てるためのロールの割り当てを作成します。

az role assignment create --assignee <appID> --role Contributor --scope $ACR_ID

<appId>を、サービス プリンシパルの作成に使用した、前のコマンドの出力に指定された値に置き換えます。

ACR サービス プリンシパル用の資格情報リソースを Jenkins に作成する

Azure で作成したロールの割り当てを使用して、ACR の資格情報を Jenkins 資格情報オブジェクトに保存します。 これらの資格情報は、Jenkins ビルド ジョブの間に参照されます。

Jenkins ポータルの左側に戻り、[Manage Jenkins]\(Jenkins の管理\)>[資格情報の管理]>[Jenkins Store]\(Jenkins ストア\)>[Global credentials (unrestricted)]\(グローバル資格情報 (無制限)\)>[Add Credentials]\(資格情報の追加\) を選択します。

資格情報の種類が [Username with password]\(ユーザー名とパスワード\) であることを確認し、次の項目を入力します。

  • [Username]\(ユーザー名\) - ACR レジストリでの認証に作成されるサービス プリンシパルの appId です。
  • パスワード - ACR レジストリでの認証に作成されるサービス プリンシパルのパスワードです。
  • ID - acr-credentials などの資格情報の識別子

完了すると、資格情報の形式は、次の例のようになります。

Create a Jenkins credential object with the service principal information

[OK] を選択して、Jenkins ポータルに戻ります。

Jenkins プロジェクトを作成する

Jenkins ポータルのホーム ページから左側の [新しい項目] を選択します。

  1. ジョブ名として azure-vote を入力します。 Freestyle プロジェクトを選択し、[OK] をクリックします

  2. [General]\(一般\) セクションで [GitHub project]\(GitHub プロジェクト\) を選択し、フォークしたリポジトリの URL (例: https://github.com/<your-github-account>/azure-voting-app-redis) を入力します

  3. [Source code management]\(ソース コードの管理\) セクションで [Git] を選択し、フォークしたリポジトリの .git URL を入力します (例: https://github.com/<your-github-account>/azure-voting-app-redis.git)

  4. [Build Triggers] セクションから GitHub hook trigger for GITscm polling を選択します

  5. [Build Environment]\(ビルド環境\) で、[Use secret texts or files]\(シークレット テキストまたはファイルを使用する\) を選びます

  6. [Bindings]\(バインド\) で、[Add]\(追加\)>[Username and password (separated)]\(ユーザー名とパスワード (別)\) を選びます

    • [Username Variable]\(ユーザー名変数\) に「ACR_ID」と入力し、[Password Variable]\(パスワード変数\) に「ACR_PASSWORD」と入力します

      Jenkins bindings

  7. 実行シェルタイプのビルド ステップを追加し、次のテキストを使います。 このスクリプトは、新しいコンテナー イメージをビルドし、ACR レジストリにプッシュします。

    # Build new image and push to ACR.
    WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}"
    docker build -t $WEB_IMAGE_NAME ./azure-vote
    docker login ${ACR_LOGINSERVER} -u ${ACR_ID} -p ${ACR_PASSWORD}
    docker push $WEB_IMAGE_NAME
    
  8. 実行シェルタイプのビルド ステップをもう 1 つ追加し、次のテキストを使います。 このスクリプトは、AKS のアプリケーションの展開を ACR からの新しいコンテナー イメージで更新します。

    # Update kubernetes deployment with new image.
    WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}"
    kubectl set image deployment/azure-vote-front azure-vote-front=$WEB_IMAGE_NAME
    
  9. 終了したら、[Save]\(保存\) をクリックします。

Jenkins のビルドをテストする

GitHub のコミットに基づいてジョブを自動化する前に、Jenkins ビルドを手動でテストします。

このビルドにより、ジョブが正しく構成されていることを検証します。 適切な Kubernetes 認証ファイルが配置されていること、および ACR への認証が動作することが確認されます。

プロジェクトの左側にあるメニューの [Build Now]\(今すぐビルド\) をクリックします。

Jenkins test build

Docker イメージ レイヤーが Jenkins サーバーにプルダウンされるため、最初のビルドは時間がかかります。

ビルドにより、次のタスクが実行されます。

  1. GitHub リポジトリを複製する
  2. 新しいコンテナー イメージをビルドする
  3. ACR レジストリにコンテナー イメージをプッシュする
  4. AKS デプロイで使用されるイメージを更新する

アプリケーション コードは変更されていないため、Web UI は変更されません。

ビルド ジョブが完了したら、ビルド履歴の下のビルド #1を選択します。 [コンソール出力] を選択し、ビルド プロセスからの出力を表示します。 最後の行でビルドの成功が示されている必要があります。

GitHub Webhook の作成

手動ビルドが完了したら、ここで GitHub を Jenkins ビルドに組み込みます。 Webhook を使用して、コードが GitHub にコミットされるたびに Jenkins のビルド ジョブを実行します。

GitHub Webhook を作成するには、次の手順を完了します。

  1. Web ブラウザーで、フォークされた GitHub リポジトリに移動します。

  2. [Settings]\(設定\) を選択して、左側の [Integrations & services]\(統合とサービス\) を選択します。

  3. [Add webhook]\(Webhook の追加\)を選択します。 [Payload URL]\(ペイロード URL\) に、「http://<publicIp:8080>/github-webhook/」と入力します。<publicIp> は、Jenkins サーバーの IP アドレスです。 必ず、末尾の / を含めるようにしてください。 他の規定値 ([Content type]\(コンテンツの種類\) と push イベントでトリガー) は既定値のままにします。

  4. [Add webhook](Webhook の追加) を選択します。

    Create a GitHub webhook for Jenkins

完全な CI/CD パイプラインをテストする

ここで CI/CD パイプライン全体をテストできます。 コード コミットを GitHub にプッシュすると、次のステップが行われます。

  1. GitHub Webhook により、Jenkins に通知されます。
  2. Jenkins がビルド ジョブを開始し、GitHub から最新のコード コミットをプルします。
  3. Docker ビルドが更新されたコードを使用して開始され、新しいコンテナー イメージが最新のビルド番号でタグ付けされます。
  4. この新しいコンテナー イメージが Azure Container Registry にプッシュされます。
  5. Azure Kubernetes Service で実行されているアプリケーションが、Azure Container Registry からの最新イメージで更新されます。

開発マシンで、複製されたアプリケーションをコード エディターで開きます。 /azure-vote/azure-vote ディレクトリで、config_file.cfg という名前のファイルを開きます。 次の例に示すように、このファイルの投票値を cats と dogs 以外のものに更新します。

# UI Configurations
TITLE = 'Azure Voting App'
VOTE1VALUE = 'Blue'
VOTE2VALUE = 'Purple'
SHOWHOST = 'false'

更新したら、ファイルを保存し、変更をコミットして、GitHub リポジトリのフォークにそれらをプッシュします。 GitHub Webhook は、Jenkins の新しいビルド ジョブをトリガーします。 Jenkins Web ダッシュ ボードでビルド プロセスを監視します。 最新のコードをプルし、更新されたイメージを作成してプッシュして、AKS で更新されたアプリケーションをデプロイするには数秒かかります。

ビルドが完了したら、サンプルの Azure 投票アプリケーションの Web ブラウザーを更新します。 次の例に示すように、変更内容が表示されます。

Sample Azure vote in AKS updated by the Jenkins build job

次のステップ