photo credit: Hotelfotograf via photopin cc
Android Advent Calender 2012 向けのエントリを書かせて頂います。
昨日は、表が@stachibanaさんの 【AndEngine】30分でカジュアルゲームを作ってみよう!で、裏が @katsummyさんの CREADOR GRANOESTE: ViewHolderとValidatorForAndroid です。
12/21の表は、@out_of_kayaさんによる クズのクズによるクズの為のAndroid入門 – だらだらいこうぜ です。
現在のソフトウェア開発ではアジャイル、テスト駆動開発、リーンなどの概念が浸透し、様々な組織で活用されている状況になってきていますが、個人事業主やフリーランスやサンデープログラマーとして個人でソフトウェア開発を行っている方々はなかなか上記の環境を整えることが難しい状況にありました。しかしながら、様々なクラウドサービスなどが盛んになり、個人レベルでも組織に負けない環境が構築できるようになってきました。というわけで、今回はAndroidアプリ開発者向けに自分専用の継続的インテグレーション(CI:Continuous Integration) サーバを構築に挑戦してみます。
利用するクラウドサービスは、AWS(Amazon Web Service)を利用します。AWSの利点は、他のクラウドサービスと比べるとコストが最も安くて、1年間の無料利用枠があり簡単に利用開始できるところです。
AWSのインスタンス作成
ログインできたら、ダッシュボード(dashboard)という AWS 管理画面が起動します。この画面は、ウェブページなはずなのにアプリのように軽快に動きます。Windowsのように右クリックして、やりたい操作を選択することもできます!(いまの時代は当たり前か!?)
この管理画面から、Create Instance を選択して、クラウド上に自分専用のサーバを構築します。
以下のAvailability zone は日本国内のある3つのデータセンターのどれを選ぶかですが、最近できた C を選択します。(特に意味はありませんが利用者がまだ少なそうなので。)
以下の Name には AWS コンソール上から一意に認識できる名前をつけます。今回は、「android_jenkins」という名前をつけておきます。この名前はあとからAWS console から変更可能です。
以下の公開鍵の作成についてです。以下の私の画面では既に作成済みの key を指定しましたが、まだ未作成の場合は、「Create new key pair」を選んで作成してください。なおこの鍵は、なくしてしまうと二度と同じものは作成できないため、create instance したサーバにアクセスすることができなくなり削除しかできなくなります。大事に保管しておきましょう。
次に Security Group についてです。これは、サーバのどのポートを空けるかどうかの設定です。今回の実験のために、8080を確実にあけておくようにしてください。
上記でAWSの新規インスタンスが作成できました。AWS console から android_jenkins を選択してこのサーバの DNS Address を調達します。これがわからないとこれから何もできませんので。探し方は、以下の画像のような場所に表示されます。
上記で得たDNS address に対して、以下のコマンドでクラウド上の自分専用のサーバにログインします。key.pem というのはペア作成した暗号鍵のほうです。こちらがないとサーバにログインできないため、確実に指定します。
ssh -i key.pem ec2-user@[server.name.com]
[server.name.com]の部分は、各自自分の DNS name に変えてください。私が実験したときは以下の名前でした。
なお今回は Amazon linux を利用したので、ユーザ名が ec2-user ですが、他のOS( ubunto 11や ubuntu 12 )などを利用した場合は、ubuntu@ や root@ になるので注意が必要です。
(以下は例で示しているもので、実際にアクセスはできません。)
ssh -i key.pem ec2-user@ec2-54-248-187-221.ap-northeast-1.compute.amazonaws.com
Oracle Java のインストール
Amazon の標準OSからOSを作成すると、様々な環境が入っていますが、1つだけ注意点があります。それは、インストールされているjavaが OpenJDK なのです。
Androidは Oracle java を環境として指定しているので、これに変更しなければなりません。Oracle java development kit(JDK) ダウンロードサイトから jdk-6u38-linux-x64-rpm.bin をダウンロードします。以下の画像が参考になります。ダウンロード時に利用規約への合意が必要なため、wgetなどではダウンロードできません。自分のPCにダウンロードしてから、scp などのコマンドで aws サーバにコピーしましょう。
例えば、私の場合は、以下のコマンドで転送しました。
scp jdk-6u35-linux-x64-rpm.bin -i key.pem ec2-user@ec2-176-34-12-92.ap-northeast-1.compute.amazonaws.com:~/
転送できたら、以下のコマンドで実行してインストールします。
sudo ./jdk-6u35-linux-x64-rpm.bin
インストールしただけではまだ最初からインストールされている OpenJDK が利用されますので、それを Oracle Java に変更しましょう。
sudo alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_38/bin/java 200 sudo alternatives --install /usr/bin/javac javac /usr/java/jdk1.6.0_38/bin/javac 200
sudo alternatives --config java
を実行して、デフォルトのjavaコマンドにどれを利用するかを聞いてきますので、2を選びます。
[ec2-user@ip-10-120-18-224 ~]$ sudo alternatives --config java There are 2 programs which provide 'java'. Selection Command ----------------------------------------------- *+ 1 /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java 2 /usr/java/jdk1.6.0_38/bin/java Enter to keep the current selection[+], or type selection number:
以下のコマンドで正しく oracle java(旧 sun java) が利用できる状態になっていることを確認。
[ec2-user@ip-10-120-18-224 ~]$ java -version java version "1.6.0_38" Java(TM) SE Runtime Environment (build 1.6.0_38-b05) Java HotSpot(TM) 64-Bit Server VM (build 20.13-b02, mixed mode) [ec2-user@ip-10-120-18-224 ~]$
Jenkins のインストール
次に、jenkins のダウンロードを行います。
wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
以下のようにダウンロード完了を待つ。100%になれば完了です。
[ec2-user@ip-10-120-18-224 ~]$ wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war --2012-12-21 07:37:02-- http://mirrors.jenkins-ci.org/war/latest/jenkins.war Resolving mirrors.jenkins-ci.org... 63.246.20.93 Connecting to mirrors.jenkins-ci.org|63.246.20.93|:80... connected. HTTP request sent, awaiting response... 302 Found Location: http://ftp-nyc.osuosl.org/pub/jenkins/war/1.494/jenkins.war [following] --2012-12-21 07:37:03-- http://ftp-nyc.osuosl.org/pub/jenkins/war/1.494/jenkins.war Resolving ftp-nyc.osuosl.org... 64.50.233.100 Connecting to ftp-nyc.osuosl.org|64.50.233.100|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 48627163 (46M)[/text]Saving to: “jenkins.war”
100%[======================================>] 48,627,163 789K/s in 39s
2012-12-21 07:37:43 (1.19 MB/s) - “jenkins.war” saved [48627163/48627163]
[ec2-user@ip-10-120-18-224 ~]$
それでは、以下のコマンドで jenkins を起動します。OS起動時のサービスに登録すれば毎回以下のようなコマンドを撃ち込まなくてもよいのですが、今回はわかりやすくするためにあえて以下の方法で実行します。
java -jar jenkins.war
これで起動するとサーバのURLの8080ポートで起動します。そのため、以下のようにブラウザから 8080 ポートを指定してアクセスすると jenkins のトップページが開きます。
(以下のアドレスは、適時自分のアドレスに置き換えてください。もちろん今アクセスしても何も表示されません。)
http://ec2-54-248-187-221.ap-northeast-1.compute.amazonaws.com:8080/
Android SDKのインストール
以下のメインのAndroid SDK をダウンロードします。
wget http://dl.google.com/android/android-sdk_r21.0.1-linux.tgz
これを解凍します。
tar zxvf android-sdk_r21.0.1-linux.tgz
解凍すると、android-sdk-linux ディレクトリに android sdk が展開されます。
さらに、SDK tool をダウンロードする必要があります。通常は、GUI環境でインストールしますが、今回はCUI環境しかないため SDK tool をダウンロードするには以下のコマンドを利用します。
cd android-sdk-linux/tools/ ./android update sdk -u -t tool,platform-tool
あと、androidのバージョンごとのplatform ライブラリが必要なため、今回は以下のandroid-17のものをダウンロードしてきます。
wget http://dl.google.com/android/repository/android-17_r01.zip
これを解凍するとandroid-4.2/ ディレクトリが展開されるのでこれを android-sdk-linux/platforms/ に移動します。
なお、このandroid-4.2/ という名前の指定が間違っているようで、正しくは、android-17 に変更する必要があります。
これは作成時のミスのようで詳細は、この投稿に記載されています。
unzip android-17_r01.zip mv android-4.2 android-17 mv android-17 android-sdk-linux/platforms/
あと、ant もインストールされていないようなので、インストールします。
sudo yum install ant
Jenkins の 初期設定
サーバの8080ポートにアクセスすると、jenkins が起動している状態です。ここから 新規のjob を作成しておきます。
http://ec2-54-248-187-221.ap-northeast-1.compute.amazonaws.com:8080/
インストール直後では、git plugin がインストールされていないため、まずこれをダウンロードしてきます。(私の環境は英語版になっているのでメッセージが英語になっています。適時読み替えてください)
[ Manage Jenkins]->[Manage Plugins]の[Available]タブを選択し、Filterの中に「git plugin」を入力します。そうすると、git plugin がフィルターされるため、このチェックボックスを選択してインストールします。
Jenkins の 新規ジョブ追加
git pluginインストール後に[New Job]を選択し、「Build a free-style software project」を選択して、「Job name」に今回は「HelloJenkins」という名前をつけてjobを作成します。
「Git Repositories」 の Repository URL に実験用のAndroid Projectファイルが置いている以下のgithubリポジトリを利用します。
https://github.com/cafedeaqua/HelloJenkins.git
次に、「Build」の項目に追記を行います。
class=”aligncenter size-medium wp-image-1114″ />
「Target」に「clean debug」の2つを入力します。
続いて Advancesを開いて、「Build File」に「HelloJenkins/build.xml」を入力し、「Properties」に「sdk.dir=/home/ec2-user/android-sdk-linux」を入力します。
これで「save」を行って、「Build Now」でビルドを実行すればAndroudアプリのビルドができます。
といいたいところなのですが、実は今回のサーバは64bit環境で実施したため、以下のようなエラーが発生してしまい、今回は時間切れで解決できませんでした。
32bit環境ならこのエラーは起こらないようなのでもし同じことを試してみる方は32bit環境で環境構築をしていてください。
[aapt] /home/ec2-user/android-sdk-linux/platform-tools/aapt: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
上記のエラーですが、解決しました。以下のライブラリをインストールすればビルドが成功しました。
sudo yum install libstdc++47.i686
ビルド成果物の保存・取得
jenkinsのいいところは、ビルドのログや成果物を管理できることです。
以下の画像のような設定を追加しておくと、ビルドに成功したときに apk ファイルを保管して、jenkinsから取得できるようにできます。
「Files to archive」に「HelloJenkins/**/*.apk」を記載します。
雑感
自分のローカルPCで Jenkins で Androidアプリをビルドする例はありますが、クラウドのサーバを利用するパターンがあまりなかったたため、今回挑戦してみました。
今回の実験では、アクセス制限のようなセキュリティに関する施策はいれていないため、実際に自分のアプリ向けに構築する場合はこれらの仕組みも導入する必要があると思います。それでも月1000円~2000円ぐらいで簡単に冗長性の高いサーバを準備できることは大変良い時代になったと思いますし、その環境を利用しないをもったいないと思います。この記事が少しでの誰かのお役にたてればうれしく思います。
将来展開
今回の環境が構築できれば、さらに以下のようなこともチャレンジできると思います。
- release 版のビルド・secret.zipを利用した自動署名
- emulator を利用した自動テスト
- emmaを利用したコードカバレッジの調査
- deloygate への自動リリース
では、明日以降のAndroid Advent Calender 2012 に繋がっていってください!12/22表は@sobachankoさんの 全力少女の推し事 – そばとちゃんこの競演 で、12/22裏は@bols_blueさんの [android][hudson][jenkins] DeployGatePlugin です。
@youten_redo Advent Calender 12/21裏エントリーです。「自分専用執事で快適なAndroidアプリ開発を実現」http://t.co/OqylNuf5 ぎりぎりになって申し訳ありませんです。 m(_ _)m
@youten_redo Advent Calender 12/21裏エントリーです。「自分専用執事で快適なAndroidアプリ開発を実現」http://t.co/OqylNuf5 ぎりぎりになって申し訳ありませんです。 m(_ _)m
@youten_redo Advent Calender 12/21裏エントリーです。「自分専用執事で快適なAndroidアプリ開発を実現」http://t.co/OqylNuf5 ぎりぎりになって申し訳ありませんです。 m(_ _)m
自分専用執事で快適なAndroidアプリ開発を実現 http://t.co/1dt6BcHO @tarotaro4 担当、12/21裏っ! #AndroidAdvent2012
@youten_redo Advent Calender 12/21裏エントリーです。「自分専用執事で快適なAndroidアプリ開発を実現」http://t.co/OqylNuf5 ぎりぎりになって申し訳ありませんです。 m(_ _)m
Jenkins で Androidアプリをビルド
開発ペースの速い人にはいいかも? > 自分専用執事で快適なAndroidアプリ開発を実現 http://t.co/GJ0avamm
#androidjp 自分専用執事で快適なAndroidアプリ開発を実現 – Bescottee http://t.co/J1HsW0d0