Jenkinsを使ってAndroidアプリのテスト環境を構築する。今更感がある内容だけど、ひとまとめになった情報がなかったので、メモも兼ねてココにまとめておく。構築した感想としては、Jenkinsにまともに触るのがはじめてな上に、Androidアプリ開発の事情も加わって、知識ゼロから構築するのは意外と大変だったということ。
前提条件
前提条件は次のとおり。
- Jenkinsサーバはローカルネットワークに用意
- ソースコードは git & bitbucket.orgのプライベートリポジトリで管理
- EclipseでのAndroidアプリのプロジェクトは、アプリ本体とテストコードの2つを用意
- Jenkinsでのビルド&テストは、Androidのバージョンや解像度別に行う
構築環境環境
主なソフトウェアの種類とバージョンは次の通り。
- Ubuntu 12.04(64bit) Desktop
- Jenkins 1.514
- Android SDK r21
- Oracle JDK6
Androidアプリのプロジェクトの下準備
アプリ開発は、通常ローカルPCで行っているはず。で、Jenkinsのサーバーを立ち上げる前に、まずローカルで設定しておかなきゃいけないことがあるので、まずはそれから。
今回は、以下のようなフォルダ構成で行う。Eclipseでプロジェクト&テストを生成した際の構成そのまま。つまり、同一ディレクトリに、アプリケーションのプロジェクトと、アプリテストのプロジェクトがある。
- foo/jenkins_smpapp1
- foo/jenkins_smpapp1test
Jenkinsは、antを使ってビルドする。そのため、antのビルドで必要なbuild.xmlファイルが必要となるのだけど、そのファイルはandroid sdkのツールで生成可能。では、さっそく作ってみる。
$ android update project -p ./jenkins_smpapp1
$ android update test-project -m ../jenkins_smpapp1/ -p jenkins_smpapp1test
らくちんですな。これでbuild.xmlファイルができたので、早速ターミナルからビルドする。
$ cd jenkins_smpapp1
$ ant clean debug install
つづいてテストを実行してみる。実行する前には、実機の接続 or エミュレータ起動をお忘れ無く。
$ cd ../jenkins_smpapp1test
$ ant clean debug install test
これでテストが動作したらOK。動作が確認できればbitbucket.orgのプライベートリポジトリにgitを使って登録しておく。なお、このサンプルは、jenkins_smpapp1、jenkins_smpapp1testで公開しているので、気軽に試したい方は、そちらをforkしてもらうとよいかと。
jenkinsサーバーを構築する
ここからJenkinsサーバーを構築していく。Ubuntu 12.04 Desktopのインストール直後の状態からはじめる。
Oracle JDK6をインストールする
(OpenJDKではなく)Oracle JDK6をインストールする。インストールする方法はいくつかあるけど、一例としてOracleが配布してるJDK6をUbuntuにインストールする方法を紹介しておく。
Jenkinsをインストール
JenkinsはUbuntuの標準パッケージではなく、Jenkinsの運営団体(と呼べばいいのか?)から提供されているUbuntuのパッケージをインストールしてみた。Ubuntuで管理されているものよりは新しいものが来るはずなので。以下の手順はInstalling Jenkins on Ubuntu - Jenkins - Jenkins Wikiより。
$ 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
jenkinsにアクセスは、http://localhost:8080/ でアクセス可能。
インストール後、ユーザー"jenkins"が追加される(ホームディレクトリは/var/lib/jenkins)。この後、SSHの設定やAndroid SDKのインストールするんだけど、そういったjenkinsが関係するソフトウェアや設定は、ユーザー"jenkins"に対して行うということは忘れないように。
Javaの切り替え
Jenkinsをインストールすると、Jenkinsの他にOpenJDK 7やOpenJREがインストールされ、デフォルトで使用する設定となる。これだとAndroidアプリ開発ではトラブルの元となりがちなので、Oracle JDKがデフォルトとなるよう設定しておく。切り替えには、update-alternativesコマンドを利用する。
$ sudo update-alternatives --config java
選択肢 パス 優先度 状態
------------------------------------------------------------
* 0 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 自動モード
1 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 手動モード
2 /usr/lib/jvm/java-6-oracle/bin/java 1 手動モード
現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください: <- ここで2をOracle JDKを選択する
Android SDKのインストール
Android SDKをインストールする。ユーザー"jenkins"がアクセスできるディレクトリなら、どこにインストールしてもよい。ここでは、Jenkinsのホーム以下にインストールした(つまり/var/lib/jenkins/android-sdkにAndroid SDKをインストールした)
インストール方法の詳細については省略ということで。
必要なパッケージをインストールする
Ubuntuのパッケージからgitとantをインストールする。本来は環境変数ANT_HOMEの設定が必要だが、Jenkinsの設定でも指定できるので、ここでは設定しない。
$ sudo apt-get install git-core ant
sshの設定
つぎにsshの設定を行う。これは、jenkinsがbitbucket.orgのプライベートリポジトリにアセクスため。ま、bitbucket.orgに限らず、リモートでgitのリポジトリを制御するには必須の設定となる。
ここでは、SSHの基本的な話は省略するので、詳しく知りたい人はSSHでググってくださいませ。これらSSHの設定や鍵は、ユーザー"jenkins"でログインした際に有効になっている必要がある。まず、ユーザー"jenkins"で利用する鍵を生成する。
$ sudo -u jenkins ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/jenkins/.ssh/id_rsa):
Created directory '/var/lib/jenkins/.ssh'.
Enter passphrase (empty for no passphrase): <-パスフレーズを聞かれるが、Enterを押してスキップする
Enter same passphrase again:
Your identification has been saved in /var/lib/jenkins/.ssh/id_rsa.
Your public key has been saved in /var/lib/jenkins/.ssh/id_rsa.pub.
ちなみに、"sudo -u jenkins"ってのは、jenkinsの権限でコマンドを実行するための方法。こうすることで、jenkinsアカウントにログインせずに処理できるので、何かと便利。
鍵が生成された直後は、次のファイル構成になっているはず。
$ sudo -u jenkins ls -la /var/lib/jenkins/.ssh
total 16
drwx------ 2 jenkins nogroup 4096 May 9 11:20 .
drwxr-xr-x 9 jenkins adm 4096 May 9 11:20 ..
-rw------- 1 jenkins nogroup 1679 May 9 11:20 id_rsa
-rw-r--r-- 1 jenkins nogroup 396 May 9 11:20 id_rsa.pub
この鍵を使って、bitbucket.orgのリポジトリにアクセスするためには、この公開鍵(id_rsa.pub)は、bitbucket.orgに登録しなきゃいけない。ということで、登録しておく。
公開鍵を設定したあとは、一度bitbucket.orgにアセクスして、サイトを認証(.ssh/known_hostファイルを生成)する必要がある。この時点ではファイルの取得までする必要はない(といいつつ、git cloneしちゃってるけど)
$ sudo -u jenkins git clone git@bitbucket.org:demuyan/jenkins_smpapp1.git /var/lib/jenkins/tmp
Cloning into '/var/lib/jenkins/tmp'...
The authenticity of host 'bitbucket.org (207.223.240.181)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)? yes <- ここで yes と入れる
Warning: Permanently added 'bitbucket.org,207.223.240.181' (RSA) to the list of known hosts.
続きは、Jenkins設定編へ