いろいろあって, WebアプリケーションのテストにJenkinsを使うことになりました. というわけで, サーバにJenkinsをインストールしてBitbucket上にあるコードをテストする設定を行ったので, その手順をまとめておきます.
Jenkinsのインストール
Amazon Linux(CentOS)なら, こういう感じで頑張ってみましょう.
# wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo # rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key # yum install jenkins # service jenkins start
これで, デフォルトであれば8080番ポートでJenkinsが立ち上がるはずです.
Gitプラグインのインストール
JenkinsとGithubやBitbucketを連携してCIを回す場合, JenkinsのGitプラグインを利用するのが便利です. ということで, まずはJenkinsのGitプラグインをインストールしましょう.
トップページから「Jenkinsの管理」をクリックし, 「プラグインの管理」ページに遷移します.
「利用可能」タブからフィルターで「Git」などと入力すれば「GIT plugin」というのが出てきますので, 左のチェックボックスにチェックを入れて, 「再起動せずにインストール」か「ダウンロードして再起動後にインストール」を選択します.
これでGitプラグインのインストールは完了です.
ジョブの作成
それではJenkinsからジョブを作成していきましょう.
まず, Jenkinsのトップページから「新規ジョブ作成」を選択します.
ジョブの名前を入力し, 「フリースタイル・プロジェクトのビルド」をチェックして「OK」をクリックします.
中盤, 「ソースコード管理」という部分で, どのリポジトリに対してジョブを実行するかを指定することができます.
「Repository URL」にリポジトリのURL(例えば, git@bitbucket.org:your/repository.git
など)を入力します.
また, 「Branches to build」で, ジョブの実行対象となるブランチを設定することが出来ます. 例えば, ここを「master」にした場合, 「Repository URL」で指定したリポジトリの「master」ブランチに更新(push)があった場合のみにジョブを実行する, ということが可能です.
ちなみに, 「Branches to build」には正規表現を指定することも出来ます.
「master
とproduction
ブランチ以外に更新(push)があった時にジョブを実行したい」という場合, :^(?!.*(master|production)).+$
のように書くと良いです.
ここは, 「SCMをポーリング」のみチェックを入れておきます. これをチェックしておかないと, 後述のWebhookを有効にして, BitbucketからHookが飛んできてもジョブがスタートしないようです. ちなみにチェックを入れると, 「スケジュールされていないので起動しません。」という警告が出ますが, これはこのままでも大丈夫です.
ジョブの用意
後は, 「ビルド」の「ビルド手順の追加」で「シェルの実行」を選び, 実行したいスクリプト(コマンド)を書いていけばOKです.
ジョブが起動したタイミングで, 今回のジョブの対象となるリポジトリの対象となるブランチの最新のコードが取得された状態になっているので, 例えばPerlのアプリケーションのテストであれば,
carton install --deployment carton exec -- prove t
みたく書いておけばOKでしょう(なお, Jenkinsはjenkins
というユーザでこのスクリプトを実行するので, 予めcarton
へのパスを通しておきましょう. 或いはcarton
へのフルパスを書いておく, というやり方もアリです).
SSH秘密鍵
ジョブが対象とするGitリポジトリがPrivate Repositoryの場合, Jenkinsがあるサーバに秘密鍵を設置し, BitbucketやGithubに公開鍵を設置しなければなりません.
前述の通り, Jenkinsはjenkins
ユーザとしてジョブを実行するので, jenkins
ユーザの.ssh
ディレクトリに秘密鍵を設置するのが何だかんだで簡単です.
ちなみに, jenkins
ユーザのホームディレクトリは/var/lib/jenkins
になっているので, /var/lib/jenkins/.ssh
に秘密鍵を設置しましょう.
公開鍵については, Bitbucketの場合, リポジトリの設定画面(Settings)から「Deployment keys」を選択して, 登録してあげましょう.
WebHookの登録
Jenkinsが定期的にBitbucketを監視して, 更新があった場合にジョブを起動する... というやり方もできますが, 今回はBitbucket上のリポジトリにコミットがあった際にBitbucketからJenkinsへHookを飛ばし, これをフラグにしてジョブを起動する, という実装にします.
というわけで, リポジトリの設定画面(Settings)から, 「INTEGRATIONS」にある「Webhooks」を選択します.
「Add webhook」をクリックし, 「URL」を次のように設定します.
http://your-jenkins.com:8080/git/notifyCommit?url=git@bitbucket.org:your/repository.git
これでWebHookの設定は完了です.
リポジトリに適等なコミットをプッシュしてみると, 「Repository URL」にgit@bitbucket.org:your/repository.git
が設定してあるジョブが動く... はずです.
ちなみに, JenkinsをEC2上に置いている場合, BitbucketからのWebhookのアクセスを受け付けるようにセキュリティグループを設定しなければなりません.
この記事を書いている段階では, Bitbucketは131.103.20.160/27
, 165.254.145.0/26
, 104.192.143.0/24
からWebhookを飛ばすようになっているらしいので, これらのIPからのアクセスを受け付けるように設定してやりましょう.
まとめ
かなり駆け足ではありますが, Jenkinsの導入と, Bitbucketの任意のリポジトリに対してテストを行う方法についてまとめてみました.
最近は, Travis CIやWercker, CircleCIなど, CIを提供するSaaSが数多く登場していますが, 細かい設定をしたい場合などはまだまだJenkinsの方が便利な場面もあります. Jenkins導入時の参考になれば幸いです.