Masteries

技術的なことや仕事に関することを書いていきます.

JenkinsでBitbucketのコードをテストする

いろいろあって, 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の管理」をクリックし, 「プラグインの管理」ページに遷移します.

f:id:papix:20150808141640p:plain

「利用可能」タブからフィルターで「Git」などと入力すれば「GIT plugin」というのが出てきますので, 左のチェックボックスにチェックを入れて, 「再起動せずにインストール」か「ダウンロードして再起動後にインストール」を選択します.

これでGitプラグインのインストールは完了です.

ジョブの作成

それではJenkinsからジョブを作成していきましょう.

f:id:papix:20150808141647p:plain

まず, Jenkinsのトップページから「新規ジョブ作成」を選択します.

f:id:papix:20150808141654p:plain

ジョブの名前を入力し, 「フリースタイル・プロジェクトのビルド」をチェックして「OK」をクリックします.

f:id:papix:20150808141703p:plain

中盤, 「ソースコード管理」という部分で, どのリポジトリに対してジョブを実行するかを指定することができます. 「Repository URL」にリポジトリのURL(例えば, git@bitbucket.org:your/repository.gitなど)を入力します.

また, 「Branches to build」で, ジョブの実行対象となるブランチを設定することが出来ます. 例えば, ここを「master」にした場合, 「Repository URL」で指定したリポジトリの「master」ブランチに更新(push)があった場合のみにジョブを実行する, ということが可能です.

ちなみに, 「Branches to build」には正規表現を指定することも出来ます. 「masterproductionブランチ以外に更新(push)があった時にジョブを実行したい」という場合, :^(?!.*(master|production)).+$のように書くと良いです.

f:id:papix:20150808141712p:plain

ここは, 「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」を選択します.

f:id:papix:20150808141726p:plain

「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導入時の参考になれば幸いです.