前書き
Jenkinsは、ソフトウェアの継続的な統合と配信に伴う反復的な技術タスクを自動化することを目的としたオープンソース自動化サーバーです。 プラグインの強力なエコシステムと幅広いサポートにより、Jenkinsはアプリケーションを構築、テスト、デプロイするための多様なワークロードセットを処理できます。
以前のガイドでは、installed Jenkins on an Ubuntu 16.04 serverとconfigured Jenkins with SSL using an Nginx reverse proxyを使用していました。 このガイドでは、変更がリポジトリにプッシュされたときにアプリケーションを自動的にテストするようにJenkinsをセットアップする方法を示します。
このチュートリアルでは、JenkinsをGitHubと統合して、新しいコードがリポジトリにプッシュされたときにJenkinsに通知されるようにします。 Jenkinsに通知されると、コードをチェックアウトし、Dockerコンテナー内でテストして、Jenkinsホストマシンからテスト環境を分離します。 サンプルのNode.jsアプリケーションを使用して、プロジェクトのCI / CDプロセスを定義する方法を示します。
前提条件
このガイドに従うには、安全なJenkinsインストールで構成された少なくとも1GのRAMを備えたUbuntu 16.04サーバーが必要です。 Webインターフェースを適切に保護するには、Jenkinsサーバーにドメイン名を割り当てる必要があります。 予想される形式でJenkinsをセットアップする方法については、以下のガイドに従ってください。
テスト環境を最適に制御するために、Dockerコンテナ内でアプリケーションのテストを実行します。 Jenkinsを起動して実行したら、このガイドのステップ1と2に従ってDockerをサーバーにインストールします。
上記のガイドを完了したら、この記事を続けることができます。
JenkinsユーザーをDockerグループに追加します
前提条件に従って、JenkinsとDockerの両方がサーバーにインストールされます。 ただし、デフォルトでは、Jenkinsプロセスの実行を担当するLinuxユーザーはDockerにアクセスできません。
これを修正するには、usermod
コマンドを使用してjenkins
ユーザーをdocker
グループに追加する必要があります。
sudo usermod -aG docker jenkins
docker
グループのメンバーを一覧表示して、jenkins
ユーザーが正常に追加されたことを確認できます。
grep docker /etc/group
Outputdocker:x:999:sammy,jenkins
Jenkinsが新しいメンバーシップを使用するには、プロセスを再起動する必要があります。
sudo systemctl restart jenkins
インストール時に有効にしたデフォルトのプラグインのいくつかの助けを借りて、JenkinsはDockerを使用してビルドおよびテストタスクを実行できるようになりました。
GitHubで個人用アクセストークンを作成する
JenkinsがGitHubプロジェクトを視聴できるようにするには、GitHubアカウントにパーソナルアクセストークンを作成する必要があります。
まだ行っていない場合は、GitHubにアクセスし、アカウントにサインインすることから始めます。 その後、右上隅にあるユーザーアイコンをクリックし、ドロップダウンメニューからSettingsを選択します。
次のページで、左側のメニューのDeveloper settingsセクションを見つけて、Personal access tokensをクリックします。
次のページのGenerate new tokenボタンをクリックします。
新しいトークンのスコープを定義できるページに移動します。
[Token description]ボックスに、後で認識できるように説明を追加します。
Select scopesセクションで、repo:status、repo:public_repo、およびadmin:org_hookボックスをチェックします。 これらにより、Jenkinsはコミットステータスを更新し、プロジェクトのWebhookを作成できます。 プライベートリポジトリを使用している場合は、リポジトリサブアイテムの代わりに一般的なrepo権限を選択する必要があります。
終了したら、下部にあるGenerate tokenをクリックします。
個人用アクセストークンのインデックスページにリダイレクトされ、新しいトークンが表示されます。
トークンをコピーして、後で参照できるようにします。 メッセージが示すように、このページを離れるとトークンを取得する方法はありません。
[.note]#Note:上のスクリーンショットで述べたように、セキュリティ上の理由から、このページを離れるとトークンを再表示する方法はありません。 トークンを紛失した場合は、GitHubアカウントから現在のトークンを削除してから、新しいトークンを作成してください。
#
GitHubアカウントの個人アクセストークンを取得したので、プロジェクトのリポジトリを監視するようにJenkinsを構成できます。
GitHubパーソナルアクセストークンをJenkinsに追加する
トークンを取得したので、Jenkinsサーバーにトークンを追加して、Webhookを自動的にセットアップできるようにする必要があります。 インストール中に設定した管理アカウントを使用して、Jenkins Webインターフェースにログインします。
メインダッシュボードから、左側のメニューのCredentialsをクリックします。
次のページで、Jenkinsスコープ内の(global)の横にある矢印をクリックします。 表示されるボックスで、Add credentialsをクリックします。
新しい資格情報を追加するためのフォームが表示されます。
Kindドロップダウンメニューで、Secret textを選択します。 Secretフィールドに、GitHubパーソナルアクセストークンを貼り付けます。 後日このエントリを識別できるように、Descriptionフィールドに入力します。 スコープをグローバルのままにし、IDフィールドを空白のままにすることができます。
終了したら、OKボタンをクリックします。
これで、Jenkinsの他の部分からこれらの資格情報を参照して、構成を支援できるようになります。
GitHubへのJenkinsアクセスのセットアップ
Jenkinsのメインダッシュボードに戻り、左側のメニューでManage Jenkinsをクリックします。
次のページのリンクのリストで、Configure Systemをクリックします。
GitHubセクションが見つかるまで、次のページのオプションをスクロールします。 Add GitHub Serverボタンをクリックしてから、GitHub Serverを選択します。
セクションが展開され、いくつかの追加情報の入力が求められます。 Credentialsドロップダウンメニューで、前のセクションで追加したGitHubパーソナルアクセストークンを選択します。
Test connectionボタンをクリックします。 JenkinsはアカウントにテストAPI呼び出しを行い、接続を確認します。
終了したら、Saveボタンをクリックして変更を実装します。
GitHubアカウントでデモンストレーションアプリケーションをセットアップする
Jenkinsを使用してアプリケーションをテストする方法を示すために、Hapi.jsで作成された単純な“hello world” programを使用します。 リポジトリへのプッシュに反応するようにJenkinsを設定しているため、デモンストレーションコードの独自のコピーが必要です。
project repositoryにアクセスし、右上隅にあるForkボタンをクリックして、アカウントにリポジトリのコピーを作成します。
リポジトリのコピーがアカウントに追加されます。
リポジトリには、ランタイムと開発の依存関係、および含まれているテストスイートの実行方法を定義するpackage.json
ファイルが含まれています。 依存関係はnpm install
を実行することでインストールでき、テストはnpm test
を使用して実行できます。
リポジトリにもJenkinsfile
を追加しました。 Jenkinsはこのファイルを読み取って、リポジトリに対して実行、ビルド、テスト、または展開するアクションを決定します。 これは、JenkinsPipeline DSLの宣言型バージョンを使用して記述されています。
hello-hapi
リポジトリに含まれるJenkinsfile
は、次のようになります。
ジェンキンスファイル
#!/usr/bin/env groovy
pipeline {
agent {
docker {
image 'node'
args '-u root'
}
}
stages {
stage('Build') {
steps {
echo 'Building...'
sh 'npm install'
}
}
stage('Test') {
steps {
echo 'Testing...'
sh 'npm test'
}
}
}
}
pipeline
には、Jenkinsが評価する定義全体が含まれています。 内部には、パイプラインのアクションが実行される場所を指定するagent
セクションがあります。 環境をホストシステムから分離するために、docker
エージェントで指定されたDockerコンテナーでテストします。
Hapi.jsはNode.jsのフレームワークであるため、node
Dockerイメージをベースとして使用します。 コンテナー内でroot
ユーザーを指定して、ユーザーがチェックアウトされたコードを含む接続されたボリュームと、スクリプトが出力を書き込むボリュームの両方に同時に書き込むことができるようにします。
次に、ファイルは2つの段階を定義します。これは、作業の論理的な分割です。 1つ目を「ビルド」、2つ目を「テスト」と名付けました。 ビルドステップでは、診断メッセージを出力してからnpm install
を実行し、必要な依存関係を取得します。 テストステップは別のメッセージを出力してから、package.json
ファイルで定義されているようにテストを実行します。
有効なJenkinsfile
を持つリポジトリができたので、このリポジトリを監視し、変更が導入されたときにファイルを実行するようにJenkinsを設定できます。
Jenkinsで新しいパイプラインを作成する
次に、GitHubパーソナルアクセストークンを使用してリポジトリを監視するようにJenkinsをセットアップできます。
Jenkinsのメインダッシュボードに戻り、左側のメニューでNew Itemをクリックします。
新しいパイプラインの名前をEnter an item nameフィールドに入力します。 その後、アイテムタイプとしてPipelineを選択します。
下部にあるOKボタンをクリックして次に進みます。
次の画面で、GitHub projectボックスをチェックします。 表示されるProject urlフィールドに、プロジェクトのGitHubリポジトリのURLを入力します。
[.note]#Note:Jenkinsがwebhookを構成する権限を持つように、Hello Hapiアプリケーションのフォークをポイントするようにしてください。
#
次に、Build Triggersセクションで、GitHub hook trigger for GITScm pollingボックスをチェックします。
Pipelineセクションで、リポジトリ内のJenkinsfile
で定義されたパイプラインを実行するようにJenkinsに指示する必要があります。 DefinitionタイプをPipeline script from SCMに変更します。
表示される新しいセクションで、SCMメニューのGitを選択します。 表示されるRepository URLフィールドに、リポジトリのフォークへのURLをもう一度入力します。
[.note]#Note:繰り返しになりますが、Hello Hapiアプリケーションのフォークを指していることを確認してください。
#
[.note]#Note:この例では、パブリックリポジトリ内で使用可能なJenkinsfile
を参照しています。 プロジェクトが一般公開されていない場合は、add credentialsボタンを使用してリポジトリへのアクセスを追加する必要があります。 以前のフック構成で行ったように、パーソナルアクセストークンを追加できます。
#
終了したら、ページの下部にあるSaveボタンをクリックします。
初期ビルドの実行とWebhookの構成
この記事の執筆時点(2017年6月)では、インターフェイスでリポジトリのパイプラインを定義するときに、Jenkinsはwebhookを自動的に構成しません。
Jenkinsをトリガーして適切なフックをセットアップするには、最初に手動ビルドを実行する必要があります。
パイプラインのメインページで、左側のメニューのBuild Nowをクリックします。
新しいビルドがスケジュールされます。 左下隅のBuild Historyボックスに、新しいビルドがすぐに表示されます。 さらに、Stage Viewがインターフェイスのメイン領域に描画され始めます。 これにより、さまざまな段階が完了したときのテスト実行の進行状況が追跡されます。
[Build History]ボックスで、ビルドに関連付けられている番号をクリックして、ビルドの詳細ページに移動します。 ここから、左側のメニューのConsole Outputボタンをクリックして、実行されたステップの詳細を確認できます。
終了したら、左側のメニューのBack to Project項目をクリックして、メインのパイプラインビューに戻ります。
プロジェクトを一度構築したので、ジェンキンスにプロジェクトのウェブフックを作成させることができます。 パイプラインの左側のメニューでConfigureをクリックします。
この画面では変更は必要ありません。下部にあるSaveボタンをクリックするだけです。 Jenkinsは初期ビルドプロセスからのプロジェクトに関する情報を取得したので、ページを保存するときにGitHubプロジェクトにwebhookを登録します。
これを確認するには、GitHubリポジトリに移動し、Settingsボタンをクリックします。 次のページで、サイドメニューからWebhooksをクリックします。 メインインターフェイスにJenkinsサーバーのwebhookが表示されるはずです。
これで、リポジトリに新しい変更をプッシュすると、Jenkinsに通知されます。 その後、新しいコードを取得し、同じ手順を使用して再テストします。
これを概算するには、GitHubのリポジトリページで、緑色のClone or downloadボタンの左側にあるCreate new fileボタンをクリックします。
次のページで、ファイル名とダミーコンテンツを選択します。
終了したら、下部にあるCommit new fileボタンをクリックします。
Jenkinsインターフェイスに戻ると、新しいビルドが自動的に開始されます:
リポジトリのローカルコピーにコミットし、GitHubにプッシュすることで、追加のビルドを開始できます。
結論
このガイドでは、GitHubプロジェクトを監視し、コミットされた新しい変更を自動的にテストするようにJenkinsを構成しました。 Jenkinsはリポジトリからコードを取得し、隔離されたDockerコンテナ内からビルドおよびテスト手順を実行します。 結果のコードは、同じJenkinsfile
に命令を追加することで、デプロイまたは保存できます。