Jenkins2のビルド設定

Docker HubのJenkins公式イメージを使うと、インストールして管理画面にログインするところまでは簡単に進みます。

管理画面が立ち上がったら、あとはJenkinsの通常運用プロセスとなり、必要に応じてスレーブを追加し、各プロジェクトのビルド・ジョブを登録していくことになります。

ビルド・ジョブ登録手順の概要

  1. ログイン後のナビから「新規ビルド作成」を選択して登録プロセス開始
  2. “Enter an item name”欄でビルド・プロジェクトの名前を付ける。
    • この名称がビルドトリガのURLなどの識別子になるため、AlphaNumeric的な読みやすい文字列の方が使いやすい。(たとえば空白は%20に置き換えられる)
  3. ビルド種別をリストから選択して、[OK]ボタンを押す
    • Jenkins2以降でプロモートしているのは”Pipeline”。JenkinsfileにGroovyスクリプトでビルドを定義できる。本記事ではPipelineを前提とする
    • すでに作成済みのビルド・ジョブがある場合は、最下部のCopy from欄に指定することで既存の設定をカスタマイズの起点としてコピーできる。ジョブ名はオートコンプリートされる
  4. ジョブ詳細設定画面の「Pipeline」欄でビルドPipelineの動作を定義する。
    • 初期状態ではDefinitionプルダウンで”Pipeline script”が選択されていて、下部のScript欄にJenkinsfileの内容を記述するモードになっている。このモードではビルド手順を変更したい場合、管理画面にログインしてWebインターフェース上でJenkinsfile(相当のスクリプト)を編集する手順となる i * ビルド・スクリプト類をgitなどで管理した方が運用しやすい場合は(おそらくこちらが一般的)、Definitionプルダウンを”Pipeline script from SCM”に切り替える。SCM(Source Code Management)はGitとSubversionから選択可能。”Script Path”欄はデフォルトでJenkinsfileとなっていて、gitプロジェクトのルートにJenkinsfileが置く想定になっている(変更可能)。
    • “Pipeline script from SCM”の”SCM”欄でGitを選択すると詳細設定のダイアログが表示される。”Repository URL”にビルドスクリプトのgitリポジトリのアドレスを記入。”Credential”はgitリポジトリのアクセス情報を選択([追加]ボタンから新規設定も可能。ID/PasswordやSSH鍵も使える)
  5. [保存]ボタンでビルド設定を保存する。
    • ジョブ一覧に設定済みジョブがリストアップされる。設定を変更したい場合は、リストからジョブを選択して詳細画面に移動したうえで、ナビの「設定」を選択することで編集できる。

Jenkinsfile

ビルドを定義するJenkinsfileはGroovyスクリプトですが、ミニマムな使い方は簡単です。

以下の例は、some_slaveというスレーブマシン上でビルドを実行する簡潔なケースです。先ほどのデフォルト設定に沿って、ビルドスクリプトのリポジトリのルートディレクトリにJenkinsfileという名前で置きます。

node('some_slave') {
stage 'Checkout build repo'
checkout scm

stage 'exec build.sh'
sh '. ./bin/build.sh'

stage 'push image'
sh '. ./bin/push.sh'
}
  • stageで実行ステージ(Pipelineの部品)のラベルを定義する。ビルド実行時に管理画面上でステージ単位で進行表示され、どのステージで失敗したのかが分かりやすくなる
  • checkout scmでビルドスクリプト一式の入ったリポジトリを取得する。この例では後の2ステージのbuild.shとpush.shを利用可能にしている
  • shでシェルコマンドを実行

このように、実体の定義をシェルスクリプトに追い出すことで、とくに高度な知識を必要とせずJenkinsfileを利用開始できます。同様に、すでに手持ちのビルドスクリプトがあるケースでも、gitリポジトリにパッケージングするだけで手軽に流用して移行できます。

ここまでの設定で基礎的な準備は完了し、ジョブ詳細画面のナビにある「ビルド実行」を選択することでビルドを手動実行できます。

この時点で、Jenkinsのアカウントと権限を持つユーザーが手軽にビルドを実行できるようになり、いわゆる「ビルド職人」依存から一歩踏み出しています。

Gitコミット時のビルド・トリガーの設定

ビルド・トリガーは外部からJenkinsのビルド・ジョブを起動する機能です。

典型的な活用法は、GitリポジトリにコードをpushしたらJenkinsに通知して自動的にビルド、などがあります。

この自動ワークフローのために必要なセットアップの流れは以下の通りです。

  1. 管理画面のジョブ設定でビルド・トリガーをONにする
    • ジョブ設定画面の「ビルド・トリガ」の項目で「リモートからビルド(例:スクリプトから)」にチェックを入れる。「認証トークン」欄にビルド起動のパスワードを指定して、画面下「保存」ボタンで保存
  2. wgetcurlなどのHTTPリクエストツールで動作テスト
    • Jenkins登録ユーザーのBasic認証と認証トークンパラメータをつけて認証
  3. Gitリポジトリ(サーバー側)のhookにHTTPリクエスト設定
    • hooks/ディレクトリのpost-updateなど。ファイルオーナーやパーミッション設定に注意

wget利用時の動作するコマンド例は以下のとおりです。

wget --http-user={SOME_JENKINS_USER} --http-passwd={USER'S_PASSWORD} --auth-no-challenge --spider "https://{SOME_JENKINS_HOST}/{JENKINS_PATH}/job/{BUILD_JOB_NAME}/build?token={BUILD_TOKEN}"
  • –http-userと–http-passwdはBasic認証の設定です。対象ジョブのビルド権限を持つユーザーのログインIDとパスワードを指定します。ビルド専用のユーザーを用意しておくと良さそうです。また、–auth-no-challengeは認証プロセスの最初からID・パスワードを投げる設定です。
  • –spiderオプションはレスポンスのファイルを取得しない指定です。ビルドをトリガーできれば良いので指定しています
  • https://{SOME_JENKINS_HOST}/{JENKINS_PATH}/はJenkinsの設置アドレスです。リポジトリが別サーバーにある場合など、外部からアクセスできるアドレスである必要があると考えられます
  • BUILD_TOKENは管理画面で設定した文字列です。ジョブごとに設定できます
なお、Basic認証にしてもアクセストークンにしても平文で飛ぶので、Jenkins設置の際はSSLで通信保護すべきでしょう。

適切なリクエストコマンドができるまで手動でwgetコマンドを実行して動作確認します。ビルド・トリガーが動作するとHTTPのレスポンスコード201が返り、管理画面上でビルド動作の開始を確認できます。

また、Jenkinsはエラー状態によって、40xエラーを細かく返すのでwgetのエラー挙動から原因をある程度推定できます。

動作するコマンドを特定できたら、Gitのhookとして設定します。hookはサーバー(pushされるリポジトリの設置マシン)に設定します。–bareオプションで作成したリポジトリではhooksディレクトリにスクリプトがあります。

git push後に動作するフックの例として、post-updateという名前のスクリプトが挙げられます。

名前の規約以外は一般的なシェルスクリプトなので、動作しない場合にはファイルオーナーや実行属性など、スクリプト動作の前提が設定できているか確認してください。

中馬崇尋
Chuma Takahiro