メモ

調べたり思いついたりしたことをメモします

Jenkinsによる自動ビルド

Androidでアプリなんかを開発するとき、gitリポジトリへコミットするだけで勝手にビルドしてくれるとありがたいものです。継続的インテグレーション(CI)というやつです。

習慣的にこれをやっておくと思う以上に効率が上がります。プログラミングに向かう集中力が途切れないためかもしれませんね。 割り込みで思考が中断された後の割り込み復帰後は「さて、なにをやってたっけかな?」から始まるわけです。アタマが別なスコープに切り替わってしまったら、元の状態へ復帰するにはそれなりの時間が掛かってしまうのだと思います。

その環境を構築したときの手順を書いておきます。

Jenkinsのインストールと初期設定

次のようにしてインストールしました。環境はubuntu12.04(64bit)を使用しています。
(https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu)

$ wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
$ sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
$ sudo apt-get update
$ sudo apt-get install jenkins

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  gir1.2-ubuntuoneui-3.0 lib32ncurses5 lib32tinfo5 libtinfo-dev
  libubuntuoneui-3.0-1 lib32tinfo-dev thunderbird-globalmenu
これらを削除するには 'apt-get autoremove' を利用してください。
以下の特別パッケージがインストールされます:
  daemon
以下のパッケージが新たにインストールされます:
  daemon jenkins
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
60.2 MB のアーカイブを取得する必要があります。
この操作後に追加で 66.5 MB のディスク容量が消費されます。
続行しますか [Y/n]? y
取得:1 http://jp.archive.ubuntu.com/ubuntu/ precise/universe daemon amd64 0.6.4-1 [98.2 kB]
取得:2 http://pkg.jenkins-ci.org/debian/ binary/ jenkins 1.544 [60.1 MB]
60.2 MB を 1分 7秒 で取得しました (890 kB/s)
以前に未選択のパッケージ daemon を選択しています。
(データベースを読み込んでいます ... 現在 215812 個のファイルとディレクトリがインストールされています。)
(.../daemon_0.6.4-1_amd64.deb から) daemon を展開しています...
以前に未選択のパッケージ jenkins を選択しています。
(.../archives/jenkins_1.544_all.deb から) jenkins を展開しています...
man-db のトリガを処理しています ...
ureadahead のトリガを処理しています ...
daemon (0.6.4-1) を設定しています ...
jenkins (1.544) を設定しています ...
システムユーザ `jenkins' (UID 116) を追加しています...
新しいユーザー `jenkins' (UID 116) をグループ `nogroup' に追加しています...
ホームディレクトリ `/var/lib/jenkins' を作成しません。
 * Starting Jenkins Continuous Integration Server jenkins                [ OK ]

これでデフォルトではブラウザからポート8080でJenkinsのダッシュボードへ行けると思います。ubuntuのIPが192.168.0.1だとしたら http://192.168.0.1:8080/ です。

ダッシュボードから git plugin をインストールしておきます。
Jenkinsの管理 > プラグインの管理 > 利用可能タブ と辿って「git plugin」にチェックを入れ、「再起動せずにインストール」ボタンを押します。

f:id:uenoshin:20131229222012p:plain

次にAndoridSDKへのパスを設定しておきます。
Jenkinsの管理 > システムの設定 > グローバル プロパティと辿って「環境変数」にチェックを入れるとキーと値のリストという入力フィールドが出てきますので設定してやります。

  • キー:PATH
  • 値:${PATH}:/path/to/sdk/tools:/path/to/sdk/platform-tools

ベアリポジトリ作成

Jenkinsをインストールしたのと同じマシン上にベアリポジトリを作ります。Jenkinsはこれを自らのワーク領域へgit cloneしてビルドします。

$ mkdir myapp.git
$ cd myapp.git
$ git init --bare --share

ベアリポジトリにフックを書く

ベアリポジトリに対してgit pushがあったらビルドします。それを自動化するためベアリポジトリ内にフックを書きましょう。

先ほど作ったベアリポジトリ内のhooksへ移動します。

$ cd hooks

この中へpost-updateというファイルを作成します。中身は下記のように書けばよいでしょう。testの箇所は後述するJenkinsのジョブ作成で作ったジョブの名前を入れてください。

#!/bin/sh
wget -q "http://localhost:8080/job/test/build?delay=0"

作成したら実行権を与えます。

$ chmod +x post-update

Jenkinsのジョブ作成

どうやってビルドするかをJenkinsへ設定します。

新規ジョブを作成し、フリースタイルのジョブを選びます。

f:id:uenoshin:20131229223256p:plain

次の画面がジョブ設定のメインです。まずソースコード管理にgitを選択し、ベアリポジトリのパスを記載します。

f:id:uenoshin:20131229223935p:plain

次にビルド手順の追加のところで「Antの呼び出し」を選びます。

f:id:uenoshin:20131229224013p:plain

「Antの呼び出し」を選ぶと入力フォームが現れるのでその中に clean debugとでも記載しましょう。

f:id:uenoshin:20131229224120p:plain

作業リポジトリから git push

ベアリポジトリからcloneして作業用リポジトリを作り、コミット、pushします。

$ git clone /path/to/myapp.git
$ cd myapp

・・・ソースコードを編集・・・

$ git add .
$ git commit -m "first commit"
$ git push origin

pushするとJenkinsが自動的にビルドまで行ってくれるはずです。