2012年6月14日木曜日

さようなら、VMWareServer

節電の夏がやって来くる。

 正直な話、昨年の我が家の9月の電気代は結構酷かった。

ほぼ1か月間アメリカに旅行に行っていて家に居ないにもかかわらず、 請求された電気代が、家に居る時とほぼ同じだった。

 理由は明快で
  •  メインサーバー 
  • メディアサーバー 
  • サーキュレーター 
  • 換気扇
が、常時稼動していたためだ。

今年は、夏の間も家にいる。となると、対策を講じるべきかと思う。電気代も値上がるみたいだし。

という訳で、サーバーの一本化を行おうと考えた。メディアサーバーは、テレビ番組の録画を行うサーバーで、Windowsが動いている。

こいつに一本化するのが早道かな、と。

メインサーバーは、VMWareESXiを利用していくつかのLinuxが動いている。これらを、VMWare Vsphere Converter を利用して再利用可能な形に変換する必要がある。

とは言え、大した手間でもない。

変換対象の仮想マシンの電源を切り(!)、件のツールを動かすだけだ。

ただ、変換後にどのVMWareソリューションで動かすのかは大事なところだ。


最初は、VMWareServer2で動かすことを考えていた。しかし、もう随分前に更新もストップしたこれは、対応しているOSも時代遅れのもの。

案の定、ScientificLinux6 64bitの動作は不可能だった。

結局、VMwarePlayerでその場しのぎ。

管理が面倒であるが、仕方ないのかなぁ。

テスト対象のデバイスを自動的に選択する Jenkins

先日から困っている、JenkinsのAndroid Emulator Pluginの不具合。

原因の特定もできず、解消の見込みも無いまますでに3日くらい経過してしまった。

このままうなり続けていても、ただいたずらに時間が経過するだけなので、別の手段を用いることにする。

そもそも、Jenkinsを利用する理由の一つは、自動的に様々な端末(エミュレーター)での動作をさせることが可能であるからである。

自動化大事だよ、自動化って話。

で、自動化したい項目をまとめると次の2点。

  1. エミュレーターの作成
  2. テストの実行
どちらも、簡単なスクリプトで実現できそうである。

一つ目に関しては。マルチ構成のプロジェクト設定にすれば、OSのバージョン、画面のサイズなどを変数として宣言することが出来る。バッチファイルの中で呼び出してあげればそれで終わり。

 二つ目も、

adb devices


コマンドから、動作中のエミュレーター、デバイスの一覧を取得できることから

adb devices | awk 'NR>1 {print $1}'


なんて やれば(多分)デバイスの一覧を取得できるのでうまう使ってやればいい。

結局、既存の問題はプラグインが悪いのか俺が悪いのかは不明。

しかし、どうも動いている人もいるから、なんともなぁ・・・。


プラグインのソースコードを眺めることも含めて検証を行いたいけど、まあこれで上手く行きそうなのでいいかな?って。

まあ、そんな分けでCIを周りに勧めていきたいとは思うけど、Androidの開発やってるの俺くらいだしなぁ・・・。

2012年6月12日火曜日

JennkinsOnWindowsでAndroid #Jenkins









昨日に引き続きJenkinsの設定。Linuxの時と違う部分が割りとあって、案外キツイ。

まず、そもそもエミュレーターが起動しない。コレに関しては未だに原因不明。コンソールの出力を見るに


$ "F:\Program Files\Android\android-sdk/platform-tools/adb.exe" start-server
$ "F:\Program Files\Android\android-sdk/tools/emulator.exe" -snapshot-list -no-window -avd hudson_ja-JP_240_WVGA_android-10
[android] Starting Android emulator and creating initial snapshot
[android] Erasing existing emulator data...
$ "F:\Program Files\Android\android-sdk/tools/emulator.exe" -no-boot-anim -ports 57373,57374 -prop persist.sys.language=ja -prop persist.sys.country=JP -avd hudson_ja-JP_240_WVGA_android-10 -no-snapshot-load -no-snapshot-save -wipe-data -no-window
WARNING: Data partition already in use. Changes will not persist!
WARNING: SD Card image already in use: C:\Users\numanuma08\.android\avd\hudson_ja-JP_240_WVGA_android-10.avd/sdcard.img
ko:Snapshot storage already in use: C:\Users\numanuma08\.android\avd\hudson_ja-JP_240_WVGA_android-10.avd/snapshots.img
* daemon not running. starting it now on port 57206 *
* daemon started successfully

どうも、"emulator.exe"が二回呼び出されてエミュレーターが起動していなような?

とりあえず、エミュレーターの起動は置いておいて、apkファイルを吐き出すため、デバッグビルドとテストのビルドの設定を先に。


antの設定


どうやら、antの自動インストールはうまく起動しないみたい。公式サイト(http://ant.apache.org/) からant.1.8.3をダウンロードして、適当なフォルダに解凍。
Jenkinsの管理→システム設定→ant から、ANT_HOMEを設定。

バージョンがちょっと古いのは、開発機のantのバージョンに合わせているため。まあ、開発機のバージョン上げてもいいんだけども・・・。


JAVA_HOMEの設定


Windowsの環境変数%JAVA_HOME%を読みこんでくれるものと思っていたけど、どうやらそうでもないみたい。Linuxでは勝手に読み込んでくれたんだけどなぁ?

antと同じく
Jenkinsの管理→システム設定→JDK からJAVA_HOMEを設定

環境変数に注意


さて、各プロジェクトの設定に移るわけだけど、androidプロジェクトなので

android update project -p %WORKSPACE%\ProjectPath


の様に環境変数を使って、プロジェクトのパスを指定する必要がある。ただ、この時の環境変数けど

 バッチファイル:%WORKSPACE%

Jenkinsの設定:$WORKSPACE

と、Jenkinsの方はLinux,ライクな設定方法になっていた。だが、フォルダの区切り文字は\(バックスラッシュ)なので

ant でビルド の項目で、build.xml のパスを

$WORKSPACE\ProjectPath\build.xml

とする必要がある。面倒くさい...

Windowsバッチファイルのあれこれ


AndroidプロジェクトとAndroidTestプロジェクトを同じバッチファイル内でUpdateしようとするとなぜか失敗する。



これは落ちる


  • AndroidプロジェクトのUdate
  • 何か処理
  • AndroidTestプロジェクトのUpdate

としないと通らなかった。
これは通る



とは言え、まだまだ問題は残っていて、そもそもテストの実行ができないとかもう色々と・・・。

エミュレーターの実行ができない件に関しては、原因が分からない・・・。

環境完成の先は長いです・・・。

2012年6月11日月曜日

WindowsにJenkinsを入れてCI #Jenkns

散歩していたら思いついた。

非力なメインサーバーでJenkinsを入れて、ビルドをするよりも実はCorei7-2600Kなメディアサーバーさんでビルドすればいいんじゃね?

Windowsに入れることが、なんか色々とハードル高そうだけど、わりとやってる人がいるっぽいので挑戦。

Windows上でJenkinsを動作、Linuxで動いているGitリポジトリからプロジェクトをクローンし、antでビルドする感じ。

インストール

インストール自体は簡単。公式サイト(http://jenkins-ci.org/)から、インストール用のファイルをダウンロードしてきて、実行するだけ。

色々と設定

とりあえず、URLを変更。ちなみに、今回は
F:\/Program Files/

にインストールしたので。

F:\Program Files\Jenkins\jenkis.xml

を開いて

 <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>



  <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --prefix=/jenkins --httpPort=80</arguments>

これで http://localhost/jenkins でアクセスできるようになる。

次いで、実行ユーザーの変更。

タスクマネージャー→サービス→サービス から Jenkins を選び プロパティ

ログオンタブで アカウント を設定する。


Gitと言うか、SSHでリポジトリにアクセスするためのユーザに設定。

ちなみに、gitはCygwinのgitを使っています。

 この辺まで来たら再起動。サービス画面から停止、開始でも良いけどコマンドでやるなら

NET STOP Jenkins

NET START Jenkins

とする。

次に、Jenkinsの設定をブラウザから行う。

JenkinsのWorkspaceはデフォルトでは

インストールしたフォルダ\jobs 以下に作られるらしい。Program File なんてスペースの入ったフォルダの下で作業しようものなら、何が起こるか分からんので変更。

システムの管理→高度な設定


から、適当な場所を選択する。

プラグイン

使っているプラグインは

Jenkins git plugin : https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

android emulator plugin : https://wiki.jenkins-ci.org/display/JENKINS/Android+Emulator+Plugin

それぞれインストールしたら、パスの設定なんかをやっておく。Android SDK や Gitのインストールは省略。

とりあえずこんなもん。

現状

残念ながらこれでビルドをしようとすると失敗する。エミュレーターの立ちあげでコケてる感じがする。

スペック不足はたぶん無いので、プロジェクトの設定かなと疑ってみる。

まあ、気長にやっていきましょうかね。

2012年6月10日日曜日

WordPressのパーマリンク

Wordpressでパーマリンク設定時に詰まったことをチョット。

どうも、.htaccessが無視されてるなー、と思ったらどうやらAllowOverrideが無効だった模様。

<Directory /var/www/html>
 AllowOverrited All
</Directory>

で解決。

メモ程度と言うことで。

2012年5月31日木曜日

[Jenkins]Androidのエミュレータが動かない[iptables]

JenkinsのAndroid Emulator Plugin を利用して、CIをしているが

今日、なぜかエミュレータが立ち上がらない不具合が発生した。


$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb start-server
[android] Starting Android emulator
[android] Erasing existing emulator data...
$ /var/lib/jenkins/tools/android-sdk/tools/emulator -no-boot-anim -ports 47334,36406 -prop persist.sys.language=en -prop persist.sys.country=US -avd hudson_en-US_800_WVGA_android-8 -no-snapshot-load -no-snapshot-save -wipe-data -no-window
WARNING: Cache partition already in use. Changes will not persist!
emulator: warning: opening audio output failed

ERROR: Timeout after 5 seconds
[android] Emulator did not appear to start; giving up
$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb disconnect localhost:36406
[android] Stopping Android emulator
$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb kill-server
Archiving artifacts
Finished: NOT_BUILT

結局、原因はiiptablesの設定だった。

adb の待ちポートへのアクセスをlocalhostを含めて全て遮断していたためだった。

3時間くらいこれで詰まった・・・馬鹿らしい・・・。

まあ、今後同じ様な問題に出会った際の対応はこれでできたと、そうしておこう。

2012年5月27日日曜日

【Android】BluetoothChatをAndroid4.0で試す【Bluetooth】

テスト用端末はNexus S (Android4.0.4)

接続先のPC(bluecove)をサーバーに、NexsusSをクライアントとして試します。

そのままのコードを動かすと下記のような問題が発生した。

  •     ActionBarのテキストを変更できない。
  •     UUIDの初期設定が異なっている
   
そのため、コードの修正を行う。とは言え、ちょっとコメントアウトするだけだけど。

ActionBarの設定
BluetoothChat.java(252行目あたり)

 private final void setStatus(int resId) {
  final ActionBar actionBar = getActionBar();
  // actionBar.setSubtitle("un connect");
 }

 private final void setStatus(CharSequence subTitle) {
  final ActionBar actionBar = getActionBar();
  // actionBar.setSubtitle(subTitle);
 }



レイアウトのxmlを見てないからアレだけど、ActionBarが表示されてない? まあ、面倒なので出さないことにします。

UUIDの設定

 // private static final UUID MY_UUID_SECURE =
 // UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");
 private static final UUID MY_UUID_SECURE = UUID
   .fromString("00001101-0000-1000-8000-00805F9B34FB");


今回はSECUREの方を変更しましたが、場合によってはINSECUREを変更かも。

サーバーのコードは、サンプルで公開されている、SPP Server Source Codeそのまま。

以上の設定でどうにか動きました。ただ、サーバーは接続が切れるまで待ち状態なのでそのへん適当に弄る必要があります。

結構面倒くさいなぁ。手持ちの端末が無いので、4.x以上でしかテストできないからアプリ作ってもほぼ自分用かな。

ゆっくりソースを読んでいきます。