Jenkins + MavenでAndroid projectをbuild

割といたるところで実践されているネタだとおもうのでアレなのですが、まぁ色々とハマったところもあり、せっかくなのでメモっておこうかと。
Jenkinsを動かすremote serverは以下のとおり。

$ cat /etc/redhat-release 
CentOS release 6.2 (Final)
$ uname -a
Linux xxxxxx.com 2.6.32-220.7.1.el6.x86_64 #1 SMP Wed Mar 7 00:52:02 GMT 2012 x86_64 x86_64 x86_64 GNU/Linux
  • まずはMaven対応のAndroid projectを作成 (local PC)

最近は Eclipse上で、New -> Project -> Maven Project -> ArchType (https://github.com/akquinet/android-archetypes) が楽かなぁと思っています。

参考: http://d.hatena.ne.jp/komamitsu/20110923/1316787031

  • このProjectをGit管理下に (local PC)

ここでは仮に、git.yourgitrepo.com に git init --bare した remote repository があるものとします。あと都合上、余計なことをせず即効でpushする構えで。

$ git init 
Initialized empty Git repository in /home/komamitsu/workspace/hogedroid/.git/
$ cat <<EOF > .gitignore
> bin
> gen
> target
> EOF
$ git add .
$ git commit -m 'first import'
$ git remote add origin ssh://git.yourgitrepo.com/git/hogedroid.git
  • Jenkinsさんインストールと起動 (remote server)

http://pkg.jenkins-ci.org/redhat/ にあるとおり以下の手順で。JDKが入ってなければ、(Open|Oracle)JDKを適当に入れておく必要あり。

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins
sudo service jenkins start

起動させるとデフォルト設定で8080(多分)で起動する。今回は前にnginxを置いてreverse proxyさせたけれども、記事の内容的にあまり関係ないのでその辺は省略。

  • Android SDK のインストール (remote server)

http://developer.android.com/sdk/index.html からLinux (i386)版のtarballをwgetして展開。これを/usr/local/android-sdkとして置いておく。

$ wget http://dl.google.com/android/android-sdk_r18-linux.tgz
$ tar zxvf android-sdk_r18-linux.tgz
$ sudo mv android-sdk-linux /usr/local/android-sdk
$ cd /usr/local/android-sdk
$ sudo chgrp -R jenkins .  (これをやっておかないと後にbuild errorに...)

このままだと中身がスカスカなので、SDK Readme.txtに従って以下。

$ cd /usr/local/android-sdk
$ tools/android update sdk --no-ui

     : (結構時間かかるし、3rd partyっぽいコンポーネントについてinteractiveに聞かれるのでenter key連打が必要)

で、インストール後、試しにadbを叩いてみると失敗する。

$ /usr/local/android-sdk/platform-tools/adb
-bash: /usr/local/android-sdk-linux/platform-tools/adb: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

なので下記のように適当にi686版のものをインストールしておく(怒られる度にインストールすればOK)。

$ sudo yum install glibc.i686
$ sudo yum install ncurses-libs.i686
$ sudo yum install libstdc++.i686
$ sudo yum install libz.i686

2012-05-29 追記:debian系なら

apt-get install ia32-libs
  • Jenkinsさんの設定 (remote server via web browser)

Manage Jenkins -> Configure System にいって

辺りを設定。

  • JenkinsにJobを追加 (remote server via web browser)

New Jobから、適当にProject名を入力し、Build a maven2/3 projectを選択。
次の設定画面では、Source Code Management = Git、Git Repository = /git/hogedroid.git (今回同じサーバーだったのでこんな感じで)、を必須で設定。
その他はお好みで。
注意事項としては、filesystemのpermissionなどで、git repositoryにアクセスできないとBuild errorになるので、jenkinsユーザーでもアクセス可能にしておくこと。

  • JenkinsのJobを試しにBuild (remote server via web browser)

上記で追加したプロジェクトを選択するとBuild Nowというリンクがあるので、押すと非同期でBuildが行われます。失敗したらbuild logを眺めつつ対応することになるんだけども、今回ハマっていたのが、以下のエラー。

cause : Execution default-generate-sources of goal com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.2.0:generate-sources failed: Path "/usr/local/android-sdk/platforms" is not a directory. Please provide a proper Android SDK directory path as configuration parameter <sdk><path>...</path></sdk> in the plugin <configuration/>. As an alternative, you may add the parameter to commandline: -Dandroid.sdk.path=... or set environment variable ANDROID_HOME.

/usr/local/android-sdk/platformsは存在しているのに何でかなぁ、と思っていたけれど、filesystemのpermission的に、jenkins userでは/usr/local/android-sdkにアクセスできない状態になっていたため、chgrpして対応しました(前述)。


ということで、Jenkinsでbuildできるところまでつらつら書きましたが、テストやらデプロイやらがまだなので、後々付け足すかもです。