次の方法で共有


チュートリアル: 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 プロジェクトを作成します。
  • Jenkins が ACR と対話するための資格情報を設定します。
  • Jenkins ビルド ジョブと、自動ビルド用の GitHub Webhook を作成します。
  • CI/CD パイプラインをテストして、GitHub コードコミットに基づいて AKS のアプリケーションを更新します。

[前提条件]

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

アプリケーションの準備

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

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

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

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

フォークを開発システムに複製します。 このリポジトリを複製するときは、フォークの URL を使用してください。

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

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

cd azure-voting-app-redis

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

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 マニフェスト ファイルを使用します。 azure-vote-all-in-one-redis.yamlなどのエディターを使用して、vi マニフェスト ファイルを開きます。 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 引数を使用します。

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

EXTERNAL-IP アドレスが保留中から IP アドレスに変更されたら、Control + Cを使用して kubectl ウォッチ プロセスを停止します。

NAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE

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

AKS で実行されている Azure サンプル投票アプリケーション

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@<PublicIPAddress>

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

AzCLI にインストールしてログインする

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

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 環境変数を作成する

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

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

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

    Jenkins 環境変数

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

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

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

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

ロールとアクセス許可を分離するには、ACR レジストリへの 共同作成者 アクセス許可を使用して Jenkins のサービス プリンシパルを構成します。

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

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

az ad sp create-for-rbac

次の例のような出力が表示されます。

{
  "appId": "<app-ID>",
  "displayName": "azure-cli-2018-09-28-22-19-34",
  "name": "http://azure-cli-2018-09-28-22-19-34",
  "password": "<password>",
  "tenant": "<tenant-ID>"
}

appId とパスワードを書き留めます。 これらの値は、Jenkins で資格情報リソースを構成するために、次の手順で使用されます。

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

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

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

サービス プリンシパルに ACR レジストリで 貢献者 権限を与えるロール割り当てを作成します。

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

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

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

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

Jenkins ポータルの左側に戻り、Jenkins の管理>管理資格情報>Jenkins Store>Global 資格情報 (無制限)>資格情報の追加を選択します。

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

  • Username - ACR レジストリでの認証用に作成されたサービス プリンシパルの appId
  • パスワード - ACR レジストリでの認証用に作成されたサービス プリンシパルの パスワード
  • ID - acr-credentials などの資格情報識別子

完了すると、資格情報フォームは次の例のようになります。

サービス プリンシパル情報を使用して Jenkins 資格情報オブジェクトを作成する

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

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

Jenkins ポータルのホーム ページで、左側にある [新しいアイテム ] を選択します。

  1. ジョブ名として azure-vote を入力します。 [フリースタイル プロジェクト] を選択し、[OK] を選択します

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

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

  4. [Build Triggers]\(ビルド トリガー\) セクションで、GITscm ポーリング用の GitHub フック トリガーを選択します

  5. [ビルド環境] で、[シークレット テキストまたはファイルを使用する] を選択します

  6. [バインド] で、[追加>ユーザー名とパスワード (区切り) を選択します。

    • ACR_IDを入力し、パスワード変数のACR_PASSWORDを入力します

      Jenkins バインディング

  7. Execute シェル型のビルド ステップを追加し、次のテキストを使用することを選択します。 このスクリプトは、新しいコンテナー イメージをビルドし、それを 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. Execute シェル型の別のビルド ステップを追加し、次のテキストを使用します。 このスクリプトは、ACR の新しいコンテナー イメージを使用して、AKS でのアプリケーションのデプロイを更新します。

    # 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. 完了したら、[ 保存] をクリックします。

Jenkins ビルドをテストする

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

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

プロジェクトの左側のメニューで、[ 今すぐビルド] を選択します。

Jenkins テスト ビルド

Docker イメージ レイヤーが Jenkins サーバーにプルダウンされるにつれて、最初のビルドが長くなります。

ビルドでは、次のタスクが実行されます。

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

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

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

GitHub Webhook を作成する

手動ビルドが正常に完了したら、GitHub を Jenkins ビルドに統合します。 コードが GitHub にコミットされるたびに、Webhook を使用して Jenkins ビルド ジョブを実行します。

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

  1. Web ブラウザーでフォークされた GitHub リポジトリを参照します。

  2. [ 設定] を選択し、左側にある [Webhook ] を選択します。

  3. [ Webhook の追加] を選択します。 ペイロード URL に「http://<publicIp:8080>/github-webhook/」と入力します。ここで、<publicIp>は Jenkins サーバーの IP アドレスです。 末尾の /を必ず含めます。 その他の既定値はコンテンツ タイプのままにし、 プッシュ イベントでトリガーします。

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

    Jenkins 用の GitHub Webhook を作成する

完全な 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 という名前のファイルを開きます。 次の例に示すように、このファイル内の投票値を猫と犬以外のものに更新します。

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

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

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

Jenkins ビルド ジョブによって更新された AKS での Azure 投票のサンプル

次のステップ