次の方法で共有


チュートリアル: GitHub と Docker を使用して Jenkins パイプラインを作成する

重要

多くの 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 にログインします。

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 の追加] を選択します。

フォークされたリポジトリに GitHub 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 フォークの最新のコミットが次のように反映されます。

Node.js アプリの実行

次に、GitHub の index.js ファイルに対して別の編集を行い、変更をコミットします。 Jenkins でジョブが完了するまで数秒待ってから、Web ブラウザーを更新して、新しいコンテナーで実行されているアプリの更新バージョンを次のように確認します。

別の GitHub コミット後 Node.js アプリを実行する

次のステップ

このチュートリアルでは、コード コミットごとに Jenkins ビルド ジョブを実行し、Docker コンテナーをデプロイしてアプリをテストするように GitHub を構成しました。 以下の方法を学習しました。

  • Jenkins VM を作成する
  • Jenkins のインストールと構成
  • GitHub と Jenkins の間に Webhook 統合を作成する
  • GitHub コミットから Jenkins ビルド ジョブを作成してトリガーする
  • アプリの Docker イメージを作成する
  • GitHub のコミットが新しい Docker イメージをビルドし、実行中のアプリを更新することを確認する

Jenkins と Azure DevOps Services を統合する方法の詳細については、次のチュートリアルに進んでください。