Bescottee苦しいときは伸びてるとき、楽なときは伸びていないとき

8 自分専用執事で快適なAndroidアプリ開発を実現

admin to development — Tags: ,  


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-amazon-web-service

AWSのインスタンス作成

ログインできたら、ダッシュボード(dashboard)という AWS 管理画面が起動します。この画面は、ウェブページなはずなのにアプリのように軽快に動きます。Windowsのように右クリックして、やりたい操作を選択することもできます!(いまの時代は当たり前か!?)

amazon web service login

この管理画面から、Create Instance を選択して、クラウド上に自分専用のサーバを構築します。

AWS create instance

以下のAvailability zone は日本国内のある3つのデータセンターのどれを選ぶかですが、最近できた C を選択します。(特に意味はありませんが利用者がまだ少なそうなので。)

aws create instance detail

aws create instance storage

以下の Name には AWS コンソール上から一意に認識できる名前をつけます。今回は、「android_jenkins」という名前をつけておきます。この名前はあとからAWS console から変更可能です。

aws create instance add name

以下の公開鍵の作成についてです。以下の私の画面では既に作成済みの key を指定しましたが、まだ未作成の場合は、「Create new key pair」を選んで作成してください。なおこの鍵は、なくしてしまうと二度と同じものは作成できないため、create instance したサーバにアクセスすることができなくなり削除しかできなくなります。大事に保管しておきましょう。

次に Security Group についてです。これは、サーバのどのポートを空けるかどうかの設定です。今回の実験のために、8080を確実にあけておくようにしてください。

aws create instance final detail

aws create instalce final

上記でAWSの新規インスタンスが作成できました。AWS console から android_jenkins を選択してこのサーバの DNS Address を調達します。これがわからないとこれから何もできませんので。探し方は、以下の画像のような場所に表示されます。
aws console search 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 サーバにコピーしましょう。
oracle java download for linux 64bit

例えば、私の場合は、以下のコマンドで転送しました。

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 download

次に、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 のトップページが開きます。
jenkins first start
(以下のアドレスは、適時自分のアドレスに置き換えてください。もちろん今アクセスしても何も表示されません。)


http://ec2-54-248-187-221.ap-northeast-1.compute.amazonaws.com:8080/

Android SDKのインストール

以下のメインのAndroid SDK をダウンロードします。
android sdk cui download

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 を作成しておきます。
jenkins first start


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 add plugin
jenkins add git plugin

Jenkins の 新規ジョブ追加

git pluginインストール後に[New Job]を選択し、「Build a free-style software project」を選択して、「Job name」に今回は「HelloJenkins」という名前をつけてjobを作成します。

「Git Repositories」 の Repository URL に実験用のAndroid Projectファイルが置いている以下のgithubリポジトリを利用します。
jenkins test github repository


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から取得できるようにできます。
jenkins file to archive

「Files to archive」に「HelloJenkins/**/*.apk」を記載します。

保存結果は以下になります。
jenkins file to archive successful

雑感

自分のローカル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 です。

8件のコメント »

  1. tarotaro4 より:

    @youten_redo Advent Calender 12/21裏エントリーです。「自分専用執事で快適なAndroidアプリ開発を実現」http://t.co/OqylNuf5 ぎりぎりになって申し訳ありませんです。 m(_ _)m

  2. youten_redo より:

    @youten_redo Advent Calender 12/21裏エントリーです。「自分専用執事で快適なAndroidアプリ開発を実現」http://t.co/OqylNuf5 ぎりぎりになって申し訳ありませんです。 m(_ _)m

  3. realeyez77 より:

    @youten_redo Advent Calender 12/21裏エントリーです。「自分専用執事で快適なAndroidアプリ開発を実現」http://t.co/OqylNuf5 ぎりぎりになって申し訳ありませんです。 m(_ _)m

  4. youten_redo より:

    自分専用執事で快適なAndroidアプリ開発を実現 http://t.co/1dt6BcHO @tarotaro4 担当、12/21裏っ! #AndroidAdvent2012

  5. korodroid より:

    @youten_redo Advent Calender 12/21裏エントリーです。「自分専用執事で快適なAndroidアプリ開発を実現」http://t.co/OqylNuf5 ぎりぎりになって申し訳ありませんです。 m(_ _)m

  6. kkeisuke より:

    Jenkins で Androidアプリをビルド

  7. f97one より:

    開発ペースの速い人にはいいかも? > 自分専用執事で快適なAndroidアプリ開発を実現 http://t.co/GJ0avamm

  8. androidnewsjp より:

    #androidjp 自分専用執事で快適なAndroidアプリ開発を実現 – Bescottee http://t.co/J1HsW0d0

このコメント欄の RSS フィード トラックバック URL

コメントをどうぞ