【Jenkinsを使った自動テスト環境を作る】パイプラインを使ったビルド/テストの自動化 3ページ
シェル経由でコマンドを実行する
正しく実行できることが確認できたら、続けて残りの「ビルド」および「アップロード」を行うstageについても同様に記述していく。
今回サンプルに使用したソフトウェアでは、「dist」というディレクトリ内にMakefileが用意されており、そのディレクトリ内でmakeコマンドを実行することでパッケージを生成できるようになっている。スクリプト内で任意のコマンドを実行するには「sh」というコマンドを使用する。このコマンドは引数として与えた文字列をシェル経由で実行するというものだ。今回はこれを利用してmakeコマンドを実行する。また、makeコマンドを実行する前に、不要なファイルをクリーンする「Build-prep」ステージも用意した。これらを追加したスクリプトは下記のようになる。
node { stage 'Checkout' checkout([$class: 'GitSCM', branches: [[name: '*/release']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/hylom/grrreader']] ]) stage 'Build-prep' sh "cd dist && make clean" stage 'Build' sh "cd dist && make" }
プラグインを導入してSCPでファイルをアップロードする
最後の「SCPで成果物をアップロード」するというステージはやや面倒だ。scpコマンドでアップロードを行う際にパスワードやパスフレーズの入力が必要となるためだ。これらをスクリプト内に直で書き込んでおくことも可能ではあるが、「SSH Agent Plugin」というプラグインを利用することで、SSHで使用するアカウントの管理をJenkinsに任せることができるようになる。今回はこれを利用してみよう。
SSH Agent Pluginは標準ではインストールされないので、まずはこのプラグインをインストールする必要がある。プラグインのインストールは、Jenkinsトップページから「Jenkinsの管理」→「プラグインの管理」を順にクリックして表示される「プラグインマネージャー」で行える(図20)
プラグインマネージャで「利用可能」タブをクリックして選択し、続いて「フィルター」欄に「ssh」と入力すると、SSHに関連するプラグインが表示される。ここで「SSH Agent Plugin」にチェックを入れ、「ダウンロードして再起動後にインストール」をクリックするとインストールが行われる(図21)。
SSH向けの認証情報を追加する
Jenkinsには各種認証に使用する情報を一元管理する機構があり、今回はこれを利用してSSH Agent Pluginに認証情報を渡すことにする。まずJenkinsのインストール時に自動的に作成される「jenkins」ユーザーのホームディレクトリ(通常は/var/lib/jenkins)内の.sshディレクトリ(~/.ssh)内にSSH公開鍵および秘密鍵を作成しておく。
# sudo -u jenkins ssh-keygen 鍵の作成に必要な情報を入力する : :
Jenkinsトップページ右メニュー内の「認証情報」→「System」→「グローバルドメイン」を順にクリックして「グローバルドメイン」画面を開き、ここで「認証情報の追加」をクリックすることで認証情報を追加できる(図22)。
認証情報の追加画面では、「種類」として「SSHユーザー名と秘密鍵」を選択する。ここでは秘密鍵として先ほど作成したものを利用するので、「jenkinsマスター上の~/.sshから」を選択する。続いてパスフレーズや適切なID、説明などを入力し、最後に「保存」をクリックする(図23)。
SSH Agent Pluginを利用する
SSH Agent Pluginをインストールすると、Snippet Generatorで新たに「sshagent: SSH Agent」が利用できるようになる(図24)。ここではパラメータとして使用する認証情報が選択できるので、先ほど作成した認証情報を選択して「Generate Groovy」をクリックし、コードを生成しよう。
ここで生成される「sshagent([‘jenkins’]) {}」というコードでは、中括弧で囲まれた部分でSSH Agentが有効になり、SSHやSCPを利用した場合に自動的に指定した認証情報が使われるようになる。これを利用して以下のように記述することで、指定した認証情報を使ってSCPでファイルをコピーできる。
sshagent(['jenkins']) { sh 'scp <コピー元ファイル> <ユーザー>@<コピー先ホスト>:<コピー先>' }
これを追加したスクリプトは下記のようになる。
node { stage 'Checkout' checkout([$class: 'GitSCM', branches: [[name: '*/release']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/hylom/grrreader']] ]) stage 'Build-prep' sh "cd dist && make clean" stage 'Build' sh "cd dist && make" stage 'upload' sshagent(['jenkins']) { sh 'scp dist/*.rpm foo@exmaple.net:~/rpms/' } }
最後にSCPでファイルをアップロードできるよう、jenkinsユーザーの公開鍵(~/.ssh/id_rsa.pub)をアップロード先マシンの対応するユーザーの「~/.ssh/authorized_keys」ファイルに追加しておこう。
この状態でビルドを実行すると、次のように4つのステージが順に実行されるようになる(図25)。
トリガ設定を利用する
さて、以上でJenkinsを使ってソフトウェアのビルド作業を自動化できたわけだが、ここまでの設定ではビルドを実行する際に手動で「ビルド実行」をクリックしなければならなかった。Jenkinsでは自動的にビルドを実行させるための設定が用意されており、これらを利用することで設定したタイミングで自動的にビルドを実行させることができる。
ビルドを自動実行させるには、ジョブの設定内にある「ビルド・トリガ」で設定を行えば良い(図26)。
Jenkinsの初期設定で「Install suggested plugins」を選択した場合、ここには表1の5つが表示されるはずだ。
設定名 | 説明 |
---|---|
リモートからビルド (例: スクリプトから) | 「<JenkinsをインストールしたサーバーのURL>/job/<ジョブ名>/build?token=<設定したトークン>」などのURLにアクセスが発生するとビルドを開始する |
Build when a change is pushed to GitHub | GitHubが提供するフック機能を利用してビルドを開始させる |
SCMをポーリング | 定期的にリポジトリにアクセスし、変更があったらビルドを開始する |
他プロジェクトの後にビルド | 指定したほかのジョブが完了したらビルドを開始する |
定期的に実行 | 指定した曜日や時刻など、あらかじめ指定した感覚でビルドを自動実行する |
「リモートからビルド」はやや分かりにくいかもしれないが、ビルドを実行したいタイミングでcurlやwgetのようなコマンドラインクライアントから指定したURLにアクセスさせることでビルドを開始させる、といった使い方ができる。
今回はリポジトリとしてGitHubを使っているので、「Build when a change is pushed to GitHub」を利用し、GitHub上のリポジトリに変更が加えられたらビルドを実行するように設定を行う方法を紹介する。この場合、インターネットからJenkinsがインストールされたサーバーにアクセスできるようになっている必要がある点には注意したい。
Jenkins側で必要な設定は、上記の「ビルド・トリガ」内で「Build when a change is pushed to GitHub」にチェックを入れ、「保存」をクリックして設定を保存しておくだけだ(図27)。
また、GitHub側での設定も必要だ。まず、対象とするリポジトリの「Settings」画面を開き、「Webhooks & services」をクリックする。続いて表示される画面内にある「Services」横の「Add service」をクリックし、「Jenkins (GitHub plugin)」を選択する(図28)。
するとURL等の設定を行う画面が表示されるので、「Jenkins hook url」内に「http://<Jenkinsが稼動しているURL>/github-webhook/」と入力する(図29)。最後に「Add service」をクリックして設定を保存すれば、設定完了だ。
これでGitHubの対象リポジトリにプッシュやコミットが行われると、そのタイミングでジョブが実行されるようになる。
Dockerと組み合わせて利用することでより柔軟な設定が可能に
ここまでは、Jenkinsがインストールされたサーバー内でビルドなどの各種ジョブを実行することを前提に説明を行っていた。これは分かりやすいいっぽう、Jenkinsを動かすサーバー上にソフトウェアをビルド・テストする環境を構築しておかなければならないという問題がある。そのため、異なるプラットフォーム向けのソフトウェアを同一のサーバー上でJenkinsを使ってビルド/テストしたい、といったケースにはこれでは対応できない。この場合、JenkinsとDockerを連携させて利用することで、より容易に異なる環境向けのビルドやテストが実行できるようになる。
後編では、こういったJenkinsとDockerの連携について紹介する。