GeNERACEではAndroidアプリ開発の継続的インテグレーションと企画側とのシームレスな連携の為にJenkinsを導入しています。
今回はその導入についてまとめます。
前提条件はJenkinsを導入するサーバに
- Java 1.6がインストールされていること(Androidのビルドの関係で1.7はおすすめしない)
- apacheがインストールされて起動していること
- gitがインストールされていること
- antがインストールされていること
- androidのkeystoreが作成済みでリポジトリにコミットされていること
とします。
AndroidSDKを導入する
まず、Jenkinsを導入するサーバ上にlinux用のAndroidSDKを導入します。
$ sudo cd /var/lib/ $ sudo wget http://dl.google.com/android/android-sdk_r13-linux_x86.tgz #SDK取得 $ sudo tar zxvf android-sdk_r13-linux_x86.tgz $ sudo mv android-sdk_r13-linux_x86 android-sdk-linux $ sudo export PATH=$PATH:/var/lib/android-sdk-linux/tools/ $ sudo android update sdk -u #sdkアップデート
これでSDKの導入は完了。
Jenkinsを導入する
$ 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 #jenkinsがアクセスするディレクトリにアクセス権を割り振る $ sudo chown -Rf jenkins /var/lib/jenkins/ $ sudo chgrp -Rf jenkins /var/lib/jenkins/ $ sudo chown -Rf jenkins /var/lib/android-sdk-linux $ sudo chgrp -Rf jenkins /var/lib/android-sdk-linux $ sudo service jenkins start #jenkins起動
通常はユーザー周りの設定を行ったり、セキュリティ周りの設定を行うのですが、今回は省略。
JenkinsにJenkins GIT pluginを入れる
Jenkinsを起動したら http://jenkins_hostname:8080/ にアクセス。
Jenkinsの管理>プラグインの管理>利用可能から”Jenkins GIT plugin”をインストールします。
これは、Jenkinsにデフォルトでインストールされている、”Git Client Plugin”とは別のgithubと連携する為のpluginです。
githubのリポジトリにhookの設定を行う
先ほどのJenkins GIT pluginとの連携設定をgithub上で行います。
これは、githubのリポジトリとjenkinsのジョブを繋ぐ為の設定です。
https://github.com/account_name/repository_name/settings/hooks/にアクセス。
Jenkins (Git plugin)という項目があるのでクリックし、Jenkins Urlという入力項目に以下のURLを入力します。
http://jenkins_hostname:8080/git/notifyCommit?url=git@github.com:account_name/repository_name.git
Activeにチェックを入れ、Update settingsをクリック。
以上でgithubのリポジトリとjenkinsのプロジェクトを繋ぐ設定がされます。
これで、このリポジトリに対してのプッシュやマージがあった場合、設定したURLをgithub側からキックしてくれます。
Jenkinsにプロジェクトの設定を行う
http://jenkins_hostname:8080/ にアクセス。
画像を参考にJenkinsにジョブを追加します。
- 新規ジョブ作成をクリック
- フリースタイル・プロジェクトのビルドを選択
- ジョブ名を入力
- OKをクリック。
- ソースコード管理システム>>Git>>Repository URLに先ほどhookの設定を行ったリポジトリを入力。Branches to build>>Brannch Specifierにブランチ名を入力
- ビルドトリガ>>SCMをポーリングにチェック
- ビルド>>シェルの実行>>シェルスクリプトにビルド時に実行するshellコマンドを入力
- ビルド後の処理>>Email通知>>宛先に開発全体に飛ぶメールなどを設定。不安定ビルドも逐一メールを送信、ビルドを壊した個人にも別途メールを送信にチェックを入れ、保存をクリックします
項目1のリポジトリがprivateリポジトリの場合、あらかじめ以下ディレクトリにgithub認証用の鍵を置いておきます。
/var/lib/jenkins/.ssh
項目3のshellコマンドですが、GeNERACEでは以下のように設定しています。
export PATH=$PATH:/usr/apache-ant-1.8.3/bin #antのパス追加 #Android関連のパスを追加 export PATH=$PATH:/var/lib/android-sdk-linux/tools export ANDROID_HOME=/var/lib/android-sdk-linux export PATH=$PATH:/var/lib/android-sdk-linux/platforms export PATH=$PATH:/var/lib/android-sdk-linux/platform-tools/ #androidアプリのプロジェクト初期設定 android update project -p /var/lib/jenkins/jobs/jenkins_job_name/workspace/ #jenkinsがgithubからcloneしたディレクトリに移動 cd /var/lib/jenkins/jobs/jenkins_job_name/workspace/ #ビルド用のantスクリプトを叩く(詳細は"アプリをAntでビルド出来るようにする"に記述) /bin/sh build.sh #成果物をWeb上から落とせる場所にコピーする cp -rf ./bin/appname.apk /www/jenkins/appname.apk
アプリをAntでビルド出来るようにする
JenkinsからAntを実行しアプリをビルドする為のシェルスクリプトを追加します。
$cd /var/lib/jenkins/jobs/jenkins_job_name/workspace/ $vi build.sh #viエディタ起動、以下の内容を入力し保存する -----ここから----- #!/bin/sh #リリース用ビルドを作成する echo "build for distribution" ant clean ant release cp ./bin/AppNameActivity-release-unsigned.apk ./bin/app_name.apk #アプリのデジタル署名を行う echo "sign apk" jarsigner -J-Dfile.encoding=UTF-8 -verbose -keystore ./app_name.keystore -storepass keystore_password ./bin/app_name.apk keystore_area #アプリのデジタル署名の確認を行う echo "verify apk" jarsigner -J-Dfile.encoding=UTF-8 -verify -verbose ./bin/app_name.apk #パッケージの最適化 echo "zipalign apk" zipalign -f -v 4 ./bin/app_name.apk ./bin/appname.apk #パッケージの最適化の確認 zipalign -c -v 4 appname.apk -----ここまで----- #ビルドしてみる $sh build.sh
ビルド完了後workspace/bin以下にappname.apkが出来ていることを確認します。
動作確認
設定したリポジトリ git@github.com:account_name/repository_name.gitにpushし、http://jenkins_hostname:8080/ にアクセス。
Jenkins上でビルドが実行されることを確認します。
ビルド結果確認
Jenkins上でビルド完了後、http://jenkins_hostname/appname.apk にAndroid端末でアクセス。
Android端末にダウンロードし、インストールを行い起動出来ることを確認します。
便利ツール導入
こちらのページで紹介されているJenkins Notifier for Chromeがビルド状態が分かり非常に便利なので導入します。
この時、企画側のChromeにもインストールしておくと更に良いです。
最後に
GeNERACEではこの仕組みを導入しているので、
- 企画側の改善提案を開発側が受ける
- 開発側が開発しリポジトリにpushする
- 企画側がjenkinsから落とし動作確認する
という流れで非常に良い連携が出来ています。
因みに、弊社アプリ宇宙上司をJenkinsでビルドした場合、EC2のt1.microだと14分、m1.smallで3分程度でした。
宇宙上司にはライブラリとしてAndEngine,AndEnginePhysicsBox2DExtension,FluctSDK,libGoogleAnalyticsV2を導入している為14分も掛かっていますが、普通のアプリであれば、恐らくt1.microで十分だと思います。
本当はAntからJUnitで行う単体テストの部分も書きたいのですが、また次の機会に書こうと思います。
ご覧いただきありがとうございました。