Ubuntu 16.04のJenkinsで継続的統合パイプラインを設定する方法

前書き

Jenkinsは、ソフトウェアの継続的な統合と配信に伴う反復的な技術タスクを自動化することを目的としたオープンソース自動化サーバーです。 プラグインの強力なエコシステムと幅広いサポートにより、Jenkinsはアプリケーションを構築、テスト、デプロイするための多様なワークロードセットを処理できます。

以前のガイドでは、installed Jenkins on an Ubuntu 16.04 serverconfigured 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を選択します。

GitHub settings item

次のページで、左側のメニューのDeveloper settingsセクションを見つけて、Personal access tokensをクリックします。

GitHub personal access tokens link

次のページのGenerate new tokenボタンをクリックします。

GitHub generate new token button

新しいトークンのスコープを定義できるページに移動します。

[Token description]ボックスに、後で認識できるように説明を追加します。

GitHub token description

Select scopesセクションで、repo:statusrepo:public_repo、およびadmin:org_hookボックスをチェックします。 これらにより、Jenkinsはコミットステータスを更新し、プロジェクトのWebhookを作成できます。 プライベートリポジトリを使用している場合は、リポジトリサブアイテムの代わりに一般的なrepo権限を選択する必要があります。

GitHub token scope

終了したら、下部にあるGenerate tokenをクリックします。

個人用アクセストークンのインデックスページにリダイレクトされ、新しいトークンが表示されます。

GitHub view new token

トークンをコピーして、後で参照できるようにします。 メッセージが示すように、このページを離れるとトークンを取得する方法はありません。

[.note]#Note:上のスクリーンショットで述べたように、セキュリティ上の理由から、このページを離れるとトークンを再表示する方法はありません。 トークンを紛失した場合は、GitHubアカウントから現在のトークンを削除してから、新しいトークンを作成してください。

GitHubアカウントの個人アクセストークンを取得したので、プロジェクトのリポジトリを監視するようにJenkinsを構成できます。

GitHubパーソナルアクセストークンをJenkinsに追加する

トークンを取得したので、Jenkinsサーバーにトークンを追加して、Webhookを自動的にセットアップできるようにする必要があります。 インストール中に設定した管理アカウントを使用して、Jenkins Webインターフェースにログインします。

メインダッシュボードから、左側のメニューのCredentialsをクリックします。

Jenkins credentials item

次のページで、Jenkinsスコープ内の(global)の横にある矢印をクリックします。 表示されるボックスで、Add credentialsをクリックします。

Jenkins add credentials button

新しい資格情報を追加するためのフォームが表示されます。

Kindドロップダウンメニューで、Secret textを選択します。 Secretフィールドに、GitHubパーソナルアクセストークンを貼り付けます。 後日このエントリを識別できるように、Descriptionフィールドに入力します。 スコープをグローバルのままにし、IDフィールドを空白のままにすることができます。

Jenkins credentials form

終了したら、OKボタンをクリックします。

これで、Jenkinsの他の部分からこれらの資格情報を参照して、構成を支援できるようになります。

GitHubへのJenkinsアクセスのセットアップ

Jenkinsのメインダッシュボードに戻り、左側のメニューでManage Jenkinsをクリックします。

Jenkins credentials item

次のページのリンクのリストで、Configure Systemをクリックします。

Jenkins configure system link

GitHubセクションが見つかるまで、次のページのオプションをスクロールします。 Add GitHub Serverボタンをクリックしてから、GitHub Serverを選択します。

Jenkins add GitHub server

セクションが展開され、いくつかの追加情報の入力が求められます。 Credentialsドロップダウンメニューで、前のセクションで追加したGitHubパーソナルアクセストークンを選択します。

Jenkins select GitHub credentials

Test connectionボタンをクリックします。 JenkinsはアカウントにテストAPI呼び出しを行い、接続を確認します。

Jenkins test GitHub credentials

終了したら、Saveボタンをクリックして変更を実装します。

GitHubアカウントでデモンストレーションアプリケーションをセットアップする

Jenkinsを使用してアプリケーションをテストする方法を示すために、Hapi.jsで作成された単純な“hello world” programを使用します。 リポジトリへのプッシュに反応するようにJenkinsを設定しているため、デモンストレーションコードの独自のコピーが必要です。

project repositoryにアクセスし、右上隅にあるForkボタンをクリックして、アカウントにリポジトリのコピーを作成します。

Fork example project

リポジトリのコピーがアカウントに追加されます。

リポジトリには、ランタイムと開発の依存関係、および含まれているテストスイートの実行方法を定義する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のフレームワークであるため、nodeDockerイメージをベースとして使用します。 コンテナー内でrootユーザーを指定して、ユーザーがチェックアウトされたコードを含む接続されたボリュームと、スクリプトが出力を書き込むボリュームの両方に同時に書き込むことができるようにします。

次に、ファイルは2つの段階を定義します。これは、作業の論理的な分割です。 1つ目を「ビルド」、2つ目を「テスト」と名付けました。 ビルドステップでは、診断メッセージを出力してからnpm installを実行し、必要な依存関係を取得します。 テストステップは別のメッセージを出力してから、package.jsonファイルで定義されているようにテストを実行します。

有効なJenkinsfileを持つリポジトリができたので、このリポジトリを監視し、変更が導入されたときにファイルを実行するようにJenkinsを設定できます。

Jenkinsで新しいパイプラインを作成する

次に、GitHubパーソナルアクセストークンを使用してリポジトリを監視するようにJenkinsをセットアップできます。

Jenkinsのメインダッシュボードに戻り、左側のメニューでNew Itemをクリックします。

Jenkins side menu

新しいパイプラインの名前をEnter an item nameフィールドに入力します。 その後、アイテムタイプとしてPipelineを選択します。

Jenkins pipeline type

下部にあるOKボタンをクリックして次に進みます。

次の画面で、GitHub projectボックスをチェックします。 表示されるProject urlフィールドに、プロジェクトのGitHubリポジトリのURLを入力します。

[.note]#Note:Jenkinsがwebhookを構成する権限を持つように、Hello Hapiアプリケーションのフォークをポイントするようにしてください。

Jenkins add GitHub project

次に、Build Triggersセクションで、GitHub hook trigger for GITScm pollingボックスをチェックします。

Jenkins GitHub hook box

Pipelineセクションで、リポジトリ内のJenkinsfileで定義されたパイプラインを実行するようにJenkinsに指示する必要があります。 DefinitionタイプをPipeline script from SCMに変更します。

表示される新しいセクションで、SCMメニューのGitを選択します。 表示されるRepository URLフィールドに、リポジトリのフォークへのURLをもう一度入力します。

[.note]#Note:繰り返しになりますが、Hello Hapiアプリケーションのフォークを指していることを確認してください。

Jenkins GitHub add pipeline repository

[.note]#Note:この例では、パブリックリポジトリ内で使用可能なJenkinsfileを参照しています。 プロジェクトが一般公開されていない場合は、add credentialsボタンを使用してリポジトリへのアクセスを追加する必要があります。 以前のフック構成で行ったように、パーソナルアクセストークンを追加できます。

終了したら、ページの下部にあるSaveボタンをクリックします。

初期ビルドの実行とWebhookの構成

この記事の執筆時点(2017年6月)では、インターフェイスでリポジトリのパイプラインを定義するときに、Jenkinsはwebhookを自動的に構成しません。

Jenkinsをトリガーして適切なフックをセットアップするには、最初に手動ビルドを実行する必要があります。

パイプラインのメインページで、左側のメニューのBuild Nowをクリックします。

Jenkins build pipeline now

新しいビルドがスケジュールされます。 左下隅のBuild Historyボックスに、新しいビルドがすぐに表示されます。 さらに、Stage Viewがインターフェイスのメイン領域に描画され始めます。 これにより、さまざまな段階が完了したときのテスト実行の進行状況が追跡されます。

Jenkins build progress

[Build History]ボックスで、ビルドに関連付けられている番号をクリックして、ビルドの詳細ページに移動します。 ここから、左側のメニューのConsole Outputボタンをクリックして、実行されたステップの詳細を確認できます。

Jenkins console output

終了したら、左側のメニューのBack to Project項目をクリックして、メインのパイプラインビューに戻ります。

プロジェクトを一度構築したので、ジェンキンスにプロジェクトのウェブフックを作成させることができます。 パイプラインの左側のメニューでConfigureをクリックします。

Jenkins configure item

この画面では変更は必要ありません。下部にあるSaveボタンをクリックするだけです。 Jenkinsは初期ビルドプロセスからのプロジェクトに関する情報を取得したので、ページを保存するときにGitHubプロジェクトにwebhookを登録します。

これを確認するには、GitHubリポジトリに移動し、Settingsボタンをクリックします。 次のページで、サイドメニューからWebhooksをクリックします。 メインインターフェイスにJenkinsサーバーのwebhookが表示されるはずです。

Jenkins view webhooks

これで、リポジトリに新しい変更をプッシュすると、Jenkinsに通知されます。 その後、新しいコードを取得し、同じ手順を使用して再テストします。

これを概算するには、GitHubのリポジトリページで、緑色のClone or downloadボタンの左側にあるCreate new fileボタンをクリックします。

Jenkins create new file button

次のページで、ファイル名とダミーコンテンツを選択します。

Jenkins new file contents

終了したら、下部にあるCommit new fileボタンをクリックします。

Jenkinsインターフェイスに戻ると、新しいビルドが自動的に開始されます:

Jenkins new build started

リポジトリのローカルコピーにコミットし、GitHubにプッシュすることで、追加のビルドを開始できます。

結論

このガイドでは、GitHubプロジェクトを監視し、コミットされた新しい変更を自動的にテストするようにJenkinsを構成しました。 Jenkinsはリポジトリからコードを取得し、隔離されたDockerコンテナ内からビルドおよびテスト手順を実行します。 結果のコードは、同じJenkinsfileに命令を追加することで、デプロイまたは保存できます。

Related