Android アプリケーションを Jenkins でビルドしてテストする件.

スポンサーリンク

Eclipse + EGit で作って GitLab で管理している Android アプリケーションを Jenkins でビルドしてテストしてみます.
ちょっと面倒でした.

環境

Jenkins
GitLab 6.1
Android SDK r22.3
Ubuntu 12.04.3 (64bit)

内容

Android SDK

Jenkins を動かしているサーバに Android SDK をインストールします.
モニタの無いヘッドレスの場合,例えば,下記のようにオプションを付けてインストールします.

android update sdk --no-ui
Is there a way to automate the android sdk installation? - Stack Overflow

Jenkins のプラグイン

Manage Jenkins – Manage Plugins で,3 つのプラグインを入れておきます.

Git Plugin
Android Emulator Plugin
Multiple SCMs Plugin 

特に,Multiple SCMs Plugin を入れておかないと,1 つのジョブ内で,アプリケーションプロジェクトとそのテストプロジェクトの両方を同時に扱うことができないので注意です.

プラグインインストール後は,Jenkins を再起動させておきます.

Restart Jenkins when installation is complete and no jobs are running

Jenkins の設定

Manage Jenkins – Configure System で,Android,JDK,Git,Ant の設定を行います.

Android
Android SDK root – /usr/local/android-sdk-linux
 Automatically install Android components when required にはデフォルトでチェックが入っています.
 Keep emulators in the job workspace, in the .android subdirectory, to isolate them as much as possible にはデフォルトではチェックが入っていません.

JDK
 JDK installations
  Add JDK
   Name 任意(JDK7u45)
   Install automatically にはデフォルトでチェックが入っています.
   Install from java.sun.com の Version では Java SE Developement Kit 7u45 がデフォルトで設定されていました.
   I agree to the Java SE Development Kit License Agreement に対する同意が必要です.
   JDK のダウンロードには Oracle account が必要になります.

Git
 Git installations
  Git
   Name Default
   Path to Git executable /usr/bin/git または /usr/local/bin/git
   Install automatically にはデフォルトでチェックは入っていません.

Ant
 Ant installations
  Add Ant
   Name 任意(Ant1.9.2)
   Install automatically にはデフォルトでチェックが入っています.
   Install from Apache の Version はデフォルトで 1.9.2 が設定されていました.

Jenkins のジョブの設定

Welcome to Jenkins! Please create new jobs to get started.

ジョブを作成します.

Job name 任意 (job_example)
Build a free-style software project
Source Code Management
 Git
  Repositories
   Repository URL – /path/to/my_project.git
   Credentials – none
  Branches to build */master
  Repository browser (Auto)
  Add で Additional Behaviours を追加します.
   Check out to a sub-directory
    Local subdirectory for repo … 例えば,app
   Custom SCM name
    Unique SCM name … 例えば,app

Add SCM で,テストプロジェクトも追加しておきます.

  Repositories
   Repository URL – /path/to/my_project_test.git
   Credentials – none
  Branches to build */master
  Repository browser (Auto)
  Add で Additional Behaviours を追加します.
   Check out to a sub-directory
    Local subdirectory for repo … 例えば,test
   Custom SCM name
    Unique SCM name … 例えば,test

メモ
Jenkins を動かしているユーザ名を user,Jenkins のジョブ名を job_example とすると,ジョブのディレクトリは

/home/user/.jenkins/workspace/job_example

となります.

Android のアプリケーションプロジェクトとそのテストプロジェクトのように,1 つのジョブに複数のプロジェクトを置く場合,Multiple SCMs Plugin をインストールした上で各々に sub-directory を割り当て,かつ,Unique SCM name を割り当てる必要があるようです.

この場合,アプリケーションのプロジェクトは,

/home/user/.jenkins/workspace/job_example/app/

そのテストプロジェクトは,

/home/user/.jenkins/workspace/job_example/test/

に位置することになります.

この設定をしないと,/home/user/.jenkins/workspace/job_example の下に両方のプロジェクトが混在し,ジョブが失敗します.

また,リポジトリ設定時に下記のようなエラーとなる場合,Jenkins を動かしているユーザに GitLab のリポジトリを読む権限がありません.
Jenkins を動かしているユーザを /etc/group の git グループに加えて,その内容を反映させておきます.

Failed to connect to repository : Command "ls-remote -h /home/git/repositories/user/project.git HEAD" returned status code 128:
stdout: 
stderr: fatal: '/home/git/repositories/user/project.git' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

まずは 1 条件でビルド,テストさせてみます.

Build Environment
 Run an Android emulator during build にチェックを入れておきます.
  Run emulator with properties を選択します.
   Android OS version 4.2
   Screen density 320
   Screen resolution 1280×720
   Device locale はブランクだと en_US になるようです.
   Target ABI armeabi-v7a
  Common emulator options
   Reset emulator state at start-up にはデフォルトではチェックが入っていません.
   Show emulator window にはデフォルトでチェックが入っていますが,モニタが無いヘッドレスの場合,チェックを外しておきます.
   Use emulator snapshots にはデフォルトでチェックが入っています.
 
Build
 Add build step
  Execute shell

まず,シェルを実行するように,Add build step で Execute shell を追加します.
ジョブのディレクトリに移動し,アプリケーションプロジェクトとそのテストプロジェクトの両方に対して,ビルド用のファイルを作成しています.

echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
cd ${WORKSPACE}
export PATH=$PATH:/usr/local/android-sdk-linux/tools:/usr/bin
android update project -p ./app/
android update test-project -m ../app/ -p ./test/

Invoke Ant で Target を設定します.
アプリケーションのプロジェクトをビルドし,そのテストプロジェクトをビルドするようにします.

アプリのビルドは例えば下記の通り.

clean debug install -f /home/user/.jenkins/workspace/job_example/app/build.xml

テストのビルドは例えば下記の通り.

clean debug install test -f /home/user/.jenkins/workspace/job_example/test/build.xml

ジョブを実行し,晴れマークになっていることを確認します.
Console を確認し,アプリケーションがビルドされた後,そのテストプロジェクトによりテストが実行されていることを確認します.