重要
多くの Azure サービスには Jenkins プラグインが用意されていますが、これらのプラグインのほとんどは 2024 年 2 月 29 日の時点でサポートを終了しました。 Azure CLI は、Jenkins と Azure サービスを統合するための現在推奨されている方法です。 詳細については、 Azure の Jenkins プラグインに関する記事を参照してください。
アプリケーション開発のビルドとテストのフェーズを自動化するには、継続的インテグレーションとデプロイ (CI/CD) パイプラインを使用できます。 このチュートリアルでは、次の方法を含む CI/CD パイプラインを Azure VM に作成します。
- Jenkins VM を作成する
- Jenkins のインストールと構成
- GitHub と Jenkins の間に Webhook 統合を作成する
- GitHub コミットから Jenkins ビルド ジョブを作成してトリガーする
- アプリの Docker イメージを作成する
- GitHub のコミットが新しい Docker イメージをビルドし、実行中のアプリを更新することを確認する
このチュートリアルでは、Azure Cloud Shell で CLI を使用します。このバージョンは常に更新され最新になっています。 Cloud Shell を開くには、コード ブロックの上部にある [使ってみる] を選択します。
CLI をローカルにインストールして使用する場合、このチュートリアルでは、Azure CLI バージョン 2.0.30 以降を実行していることが要件です。 バージョンを確認するには、az --version
を実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールを参照してください。
Jenkins インスタンスを作成する
初回起動時に Linux 仮想マシンをカスタマイズする方法に関する前のチュートリアルでは、cloud-init を使用して VM のカスタマイズを自動化する方法を学習しました。 このチュートリアルでは、cloud-init ファイルを使用して、Jenkins と Docker を VM にインストールします。 Jenkins は、Azure とシームレスに統合され、継続的インテグレーション (CI) と継続的デリバリー (CD) を可能にする一般的なオープンソースのオートメーション サーバーです。 Jenkins の使用方法に関するその他のチュートリアルについては、 Azure Hub の Jenkins を参照してください。
現在のシェルで、cloud-init-jenkins.txtという名前 の ファイルを作成し、次の構成を貼り付けます。 たとえば、ローカル コンピューター上にない Cloud Shell でファイルを作成します。
sensible-editor cloud-init-jenkins.txt
を入力してファイルを作成し、使用可能なエディターの一覧を表示します。 cloud-init ファイル全体 (特に最初の行) が正しくコピーされたことを確認してください。
#cloud-config
package_upgrade: true
write_files:
- path: /etc/systemd/system/docker.service.d/docker.conf
content: |
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
- path: /etc/docker/daemon.json
content: |
{
"hosts": ["fd://","tcp://127.0.0.1:2375"]
}
runcmd:
- apt install openjdk-8-jre-headless -y
- wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
- sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
- apt-get update && apt-get install jenkins -y
- curl -sSL https://get.docker.com/ | sh
- usermod -aG docker azureuser
- usermod -aG docker jenkins
- service jenkins restart
VM を作成する前に、az group create を使用してリソース グループを作成します。 次の例では、 myResourceGroupJenkins という名前のリソース グループを eastus の場所に作成します。
az group create --name myResourceGroupJenkins --location eastus
ここで az vm create を使用して VM を作成します。
--custom-data
パラメーターを使用して、cloud-init 構成ファイルを渡します。 現在の作業ディレクトリの外部にファイルを保存した場合は 、cloud-init-jenkins.txt への完全なパスを指定します。
az vm create --resource-group myResourceGroupJenkins \
--name myVM \
--image UbuntuLTS \
--admin-username azureuser \
--generate-ssh-keys \
--custom-data cloud-init-jenkins.txt
VM の作成と構成には数分かかります。
Web トラフィックが VM に到達できるようにするには、 az vm open-port を使用して Jenkins トラフィック用にポート 8080 を開き、サンプル アプリの実行に使用される Node.js アプリのポート 1337 を開きます。
az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 8080 --priority 1001
az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 1337 --priority 1002
Jenkins の構成
Jenkins インスタンスにアクセスするには、VM のパブリック IP アドレスを取得します。
az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv
セキュリティ上の理由から、Jenkins のインストールを開始するには、VM 上のテキスト ファイルに格納されている初期管理者パスワードを入力する必要があります。 前の手順で取得したパブリック IP アドレスを使用して、VM に SSH 接続します。
ssh azureuser@<publicIps>
service
コマンドを使用して Jenkins が実行されていることを確認します。
$ service jenkins status
● jenkins.service - LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; generated)
Active: active (exited) since Tue 2019-02-12 16:16:11 UTC; 55s ago
Docs: man:systemd-sysv-generator(8)
Tasks: 0 (limit: 4103)
CGroup: /system.slice/jenkins.service
Feb 12 16:16:10 myVM systemd[1]: Starting LSB: Start Jenkins at boot time...
...
Jenkins インストールの initialAdminPassword
を表示し、コピーします。
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
ファイルがまだ使用できない場合は、cloud-init が Jenkins と Docker のインストールを完了するまでさらに数分待ちます。
次に、Web ブラウザーを開き、 http://<publicIps>:8080
に移動します。 次のように、Jenkins の初期セットアップを完了します。
- [ インストールするプラグインの選択] を選択する
- 上部のテキスト ボックスで GitHub を検索します。 GitHub のチェック ボックスをオンにし、[インストール] を選択します
- 最初の管理者ユーザーを作成します。 管理者などのユーザー名を入力し、独自のセキュリティで保護されたパスワードを指定します。 最後に、完全な名前と電子メール アドレスを入力します。
- [保存して完了] を選択する
- Jenkins の準備ができたら、[Jenkins の使用を開始する] を選択します
- Jenkins の使用を開始するときに Web ブラウザーに空白のページが表示される場合は、Jenkins サービスを再起動します。 SSH セッションから、「
sudo service jenkins restart
」と入力し、Web ブラウザーを更新します。
- Jenkins の使用を開始するときに Web ブラウザーに空白のページが表示される場合は、Jenkins サービスを再起動します。 SSH セッションから、「
- 必要に応じて、作成したユーザー名とパスワードを使用して Jenkins にログインします。
GitHub webhook を作成する
GitHub との統合を構成するには、Azure サンプル リポジトリから Node.js Hello World サンプル アプリ を開きます。 リポジトリを独自の GitHub アカウントにフォークするには、右上隅にある [フォーク ] ボタンを選択します。
作成したフォーク内に webhook を作成します。
- [ 設定] を選択し、左側にある [Webhook ] を選択します。
- [ Webhook の追加] を選択し、フィルター ボックスに 「Jenkins 」と入力します。
-
ペイロード URL に「
http://<publicIps>:8080/github-webhook/
」と入力します。 必ず末尾に / を含めてください。 - [コンテンツ タイプ] で、application/x-www-form-urlencoded を選択します。
- [この webhook をトリガーするイベントはどれですか?] で、[プッシュ イベントのみ] を選択します。
- [アクティブ] にチェックを入れます。
- [Webhook の追加] を選択します。
Jenkins ジョブを作成する
コードのコミットなどの GitHub のイベントに Jenkins が応答できるようにするには、Jenkins ジョブを作成します。 独自の GitHub フォークの URL を使用します。
Jenkins Web サイトで、ホーム ページから [ 新しいジョブの作成 ] を選択します。
- ジョブ名として 「HelloWorld 」と入力します。 [フリースタイル プロジェクト] を選択し、[OK] を選択します。
- [ 全般 ] セクションで、 GitHub プロジェクト を選択し、フォークしたリポジトリの URL を入力します (例:
https://github.com/cynthn/nodejs-docs-hello-world
- [ ソース コード管理 ] セクションで、 Git を選択し、フォークされたリポジトリ の .git URL を入力します (例:
https://github.com/cynthn/nodejs-docs-hello-world.git
- [ Build Triggers]\(ビルド トリガー\ ) セクションで、 GITscm ポーリング用の GitHub フック トリガーを選択します。
- [ ビルド ] セクションで、[ ビルド ステップの追加] を選択します。 [ シェルの実行] を選択し、コマンド ウィンドウに「
echo "Test"
」と入力します。 - ジョブ ウィンドウの下部にある [保存] を 選択します。
GitHub 統合をテストする
GitHub と Jenkins の統合をテストするには、フォークに変更をコミットします。
GitHub Web UI に戻り、フォークしたリポジトリを選択し、 index.js ファイルを選択します。 鉛筆アイコンを選択してこのファイルを編集し、6 行目が次のように表示されるようにします。
response.end("Hello World!");
変更をコミットするには、下部にある [ 変更のコミット ] ボタンを選択します。
Jenkins では、ジョブ ページの左下隅にある [ビルド履歴 ] セクションで新しいビルドが開始されます。 ビルド番号のリンクを選択し、左側の コンソール出力 を選択します。 コードが GitHub からプルされ、ビルド アクションによってコンソールに Test
メッセージが出力されたときに Jenkins が実行する手順を確認できます。 GitHub でコミットが行われるたびに、Webhook は Jenkins に到達し、この方法で新しいビルドをトリガーします。
Docker ビルド イメージの定義
GitHub のコミットに基づいて実行されている Node.js アプリを表示するには、Docker イメージをビルドしてアプリを実行します。 イメージは、アプリを実行するコンテナーを構成する方法を定義する Dockerfile から構築されます。
VM への SSH 接続から、前の手順で作成したジョブにちなんだ Jenkins ワークスペース ディレクトリに変更します。 この例では、 HelloWorld という名前が付けられています。
cd /var/lib/jenkins/workspace/HelloWorld
sudo sensible-editor Dockerfile
を使用してこのワークスペース ディレクトリにファイルを作成し、次の内容を貼り付けます。 Dockerfile 全体、特に最初の行が正しくコピーされていることを確認します。
FROM node:alpine
EXPOSE 1337
WORKDIR /var/www
COPY package.json /var/www/
RUN npm install
COPY index.js /var/www/
この Dockerfile は、Alpine Linux を使用して基本 Node.js イメージを使用し、Hello World アプリが実行されているポート 1337 を公開してから、アプリ ファイルをコピーして初期化します。
Jenkins ビルド ルールを作成する
前の手順では、コンソールにメッセージを出力する基本的な Jenkins ビルド ルールを作成しました。 Dockerfile を使用してアプリを実行するビルド ステップを作成します。
Jenkins インスタンスに戻り、前の手順で作成したジョブを選択します。 左側の [構成 ] を選択し、[ ビルド ] セクションまで下にスクロールします。
既存の
echo "Test"
ビルド ステップを削除します。 既存のビルド ステップ ボックスの右上隅にある赤い十字を選択します。[ビルド ステップの追加] を選択し、[シェルの実行] を選択します
[コマンド] ボックスに次の Docker コマンドを入力し、[保存] を選択します。
docker build --tag helloworld:$BUILD_NUMBER . docker stop helloworld && docker rm helloworld docker run --name helloworld -p 1337:1337 helloworld:$BUILD_NUMBER node /var/www/index.js &
Docker のビルド手順では、イメージを作成し、Jenkins ビルド番号でタグ付けして、イメージの履歴を維持できるようにします。 アプリを実行している既存のコンテナーはすべて停止され、削除されます。 その後、新しいコンテナーがイメージの使用を開始し、GitHub の最新のコミットに基づいて Node.js アプリを実行します。
パイプラインをテストする
パイプライン全体の動作を確認するには、フォークした GitHub リポジトリの index.js ファイルをもう一度編集し、[ 変更のコミット] を選択します。 GitHub の webhook に基づいて Jenkins で新しいジョブが開始されます。 Docker イメージを作成し、新しいコンテナーでアプリを起動するには数秒かかります。
必要に応じて、VM のパブリック IP アドレスをもう一度取得します。
az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv
Web ブラウザーを開き、「 http://<publicIps>:1337
」と入力します。 Node.js アプリが表示され、GitHub フォークの最新のコミットが次のように反映されます。
次に、GitHub の index.js ファイルに対して別の編集を行い、変更をコミットします。 Jenkins でジョブが完了するまで数秒待ってから、Web ブラウザーを更新して、新しいコンテナーで実行されているアプリの更新バージョンを次のように確認します。
次のステップ
このチュートリアルでは、コード コミットごとに Jenkins ビルド ジョブを実行し、Docker コンテナーをデプロイしてアプリをテストするように GitHub を構成しました。 以下の方法を学習しました。
- Jenkins VM を作成する
- Jenkins のインストールと構成
- GitHub と Jenkins の間に Webhook 統合を作成する
- GitHub コミットから Jenkins ビルド ジョブを作成してトリガーする
- アプリの Docker イメージを作成する
- GitHub のコミットが新しい Docker イメージをビルドし、実行中のアプリを更新することを確認する
Jenkins と Azure DevOps Services を統合する方法の詳細については、次のチュートリアルに進んでください。