JenkinsにAndroidアプリのテスト環境を構築する　その１

Jenkinsを使ってAndroidアプリのテスト環境を構築する。今更感がある内容だけど、ひとまとめになった情報がなかったので、メモも兼ねてココにまとめておく。構築した感想としては、Jenkinsにまともに触るのがはじめてな上に、Androidアプリ開発の事情も加わって、知識ゼロから構築するのは意外と大変だったということ。

# 前提条件

前提条件は次のとおり。

 - Jenkinsサーバはローカルネットワークに用意
 - ソースコードは git & [bitbucket.org](https://bitbucket.org)のプライベートリポジトリで管理
 - EclipseでのAndroidアプリのプロジェクトは、アプリ本体とテストコードの２つを用意
 - 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](https://bitbucket.org/demuyan/jenkins_smpapp1)、[jenkins_smpapp1test](https://bitbucket.org/demuyan/jenkins_smpapp1test)で公開しているので、気軽に試したい方は、そちらをforkしてもらうとよいかと。

# jenkinsサーバーを構築する

ここからJenkinsサーバーを構築していく。Ubuntu 12.04 Desktopのインストール直後の状態からはじめる。

## Oracle JDK6をインストールする

(OpenJDKではなく)Oracle JDK6をインストールする。インストールする方法はいくつかあるけど、一例として[Oracleが配布してるJDK6をUbuntuにインストールする方法](http://blog.cnu.jp/2012/03/18/install-jdk6-oracle/)を紹介しておく。

## Jenkinsをインストール

JenkinsはUbuntuの標準パッケージではなく、Jenkinsの運営団体（と呼べばいいのか？）から提供されているUbuntuのパッケージをインストールしてみた。Ubuntuで管理されているものよりは新しいものが来るはずなので。以下の手順は[Installing Jenkins on Ubuntu - Jenkins - Jenkins Wiki](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

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に公開鍵を設定](https://dl.dropboxusercontent.com/u/60614469/qiita/qiita-jenkins-01.png)

公開鍵を設定したあとは、一度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設定編](http://qiita.com/items/366734f7e893ea6d0ab4)へ