重要
多くの 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 のアプリケーションを更新します。
[前提条件]
このチュートリアルを完了するには、次のものが必要です。
Kubernetes、Git、CI/CD、コンテナー イメージに関する基本的な理解
AKS クラスターと
kubectl
AKS クラスターの資格情報を使用して構成されます。Azure Container Registry (ACR) レジストリ、ACR ログイン サーバー名、および ACR レジストリで認証するように構成された AKS クラスター。
Azure 仮想マシンにデプロイされた Jenkins コントローラー 。
Azure CLI バージョン 2.0.46 以降がインストールおよび構成されています。 バージョンを確認するには、
az --version
を実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールを参照してください。開発システムにインストールされた Docker
開発システムにインストールされている GitHub アカウント、GitHub 個人用アクセス トークン、Git クライアント
このサンプルスクリプトを使用して Jenkins をデプロイする方法ではなく、独自の Jenkins インスタンスを提供する場合、Jenkins インスタンスには Docker がインストールされ、構成され、kubectl が必要です。
アプリケーションの準備
この記事では、一時データ ストレージ用の 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 投票アプリケーションが表示されます。
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 ログイン サーバーの値を含む変数を追加します。完了したら、ページの下部にある [保存] を選択します。
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 などの資格情報識別子
完了すると、資格情報フォームは次の例のようになります。
[ OK] を 選択し、Jenkins ポータルに戻ります。
Jenkins プロジェクトを作成する
Jenkins ポータルのホーム ページで、左側にある [新しいアイテム ] を選択します。
ジョブ名として azure-vote を入力します。 [フリースタイル プロジェクト] を選択し、[OK] を選択します
[全般] セクションで、GitHub プロジェクトを選択し、フォークされたリポジトリの URL (https://github.com/<your-github-account>/azure-voting-app-redis など) を入力します。
[ソース コード管理] セクションで、Git を選択し、フォークされたリポジトリ
.git
URL (https://github.com/<your-github-account>/azure-voting-app-redis.git など) を入力します。[Build Triggers]\(ビルド トリガー\) セクションで、GITscm ポーリング用の GitHub フック トリガーを選択します
[ビルド環境] で、[シークレット テキストまたはファイルを使用する] を選択します
[バインド] で、[追加>ユーザー名とパスワード (区切り) を選択します。
ACR_ID
にを入力し、パスワード変数のACR_PASSWORD
を入力します。
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
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
完了したら、[ 保存] をクリックします。
Jenkins ビルドをテストする
GitHub コミットに基づいてジョブを自動化する前に、Jenkins ビルドを手動でテストします。
このビルドでは、ジョブが正しく構成されていることを検証します。 適切な Kubernetes 認証ファイルが配置されていること、および ACR への認証が機能していることを確認します。
プロジェクトの左側のメニューで、[ 今すぐビルド] を選択します。
Docker イメージ レイヤーが Jenkins サーバーにプルダウンされるにつれて、最初のビルドが長くなります。
ビルドでは、次のタスクが実行されます。
- GitHub リポジトリを複製します
- 新しいコンテナー イメージをビルドする
- コンテナー イメージを ACR レジストリにプッシュします
- AKS デプロイで使用されるイメージを更新します
アプリケーション コードに変更が加えされていないため、Web UI は変更されません。
ビルド ジョブが完了したら、ビルド履歴で ビルド #1 を選択します。 [コンソール出力] を選択し、ビルド プロセスからの出力を表示します。 最後の行は、ビルドが成功したことを示す必要があります。
GitHub Webhook を作成する
手動ビルドが正常に完了したら、GitHub を Jenkins ビルドに統合します。 コードが GitHub にコミットされるたびに、Webhook を使用して Jenkins ビルド ジョブを実行します。
GitHub Webhook を作成するには、次の手順を実行します。
Web ブラウザーでフォークされた GitHub リポジトリを参照します。
[ 設定] を選択し、左側にある [Webhook ] を選択します。
[ Webhook の追加] を選択します。 ペイロード URL に「
http://<publicIp:8080>/github-webhook/
」と入力します。ここで、<publicIp>
は Jenkins サーバーの IP アドレスです。 末尾の/
を必ず含めます。 その他の既定値はコンテンツ タイプのままにし、 プッシュ イベントでトリガーします。[Add webhook](Webhook の追加) を選択します。
完全な CI/CD パイプラインをテストする
これで、CI/CD パイプライン全体をテストできます。 GitHub にコード コミットをプッシュすると、次の手順が実行されます。
- GitHub Webhook が Jenkins に通知します。
- Jenkins はビルド ジョブを開始し、GitHub から最新のコード コミットをプルします。
- 更新されたコードを使用して Docker ビルドが開始され、新しいコンテナー イメージに最新のビルド番号がタグ付けされます。
- この新しいコンテナー イメージは、Azure Container Registry にプッシュされます。
- 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 ブラウザーを更新します。 次の例に示すように、変更が表示されます。