ラベル Jenkins の投稿を表示しています。 すべての投稿を表示
ラベル Jenkins の投稿を表示しています。 すべての投稿を表示

2012年10月15日月曜日

WindowsPhoneとJenkinsの話 #sumaben

Jenkinsさんは良いんだよ!!

みんなも会社で使ってよ!!

WindowsPhoneも端末が増えてくるから、きっと今から準備しておくと役立つよ!!

という話をすまべんでやってきた。



やたらと強力なMsBuildの使い方は、@ITを参考にした。

MSBuild完全攻略(前編) .NETビルド・エンジン「MSBuild」使いこなし術

MSBuild完全攻略(後編) ビルド・エンジン「MSBuild」を思いのままに操る技

という訳で、お家Jenkinsをもっと進めていきます

じゃなくて、会社で導入してみたいです。

2012年10月8日月曜日

Jenkinsで、WindowsPhoneのリリースビルド+ユニットテストを自動化


1.目的

Jenkinsを利用してプロジェクトのビルド、テストを自動化し素早い問題対応と、
常にビルド可能、実行可能なソリューションが存在する状態を作る。

そうすることで、チーム開発の進捗の管理や、モチベーション維持へと繋がる。

2.導入

今回はWindowsPhoneアプリのプロジェクトを、Jenkinsを使ってビルド、ユニットテストを
行う。Androidやその他のJava、あるいはスクリプト言語系のプロジェクトで導入の実績を
よく聞くJenkinsだが、.Netなフレームワークでもできるんだよ。

3.準備

3-1実行対象のプロジェクトを作る

作りましょう

3-2テストプロジェクトを作る

作り方は、僕の以前のPost


@okazuki さんの

http://d.hatena.ne.jp/okazuki/20110911/1315724390

を参考にしましょう。

3-3自動ビルド、ユニットテストの環境を作る


MsBuildの設定をします。基本的に、一個前のPost

http://numa08.blogspot.jp/2012/10/msbuildwindows-phone.html

を使えば良いです。

でも、今回はMsBuildのタスクを一部変更しました。Clean,Releaseはやりたかったので、そこを追加。

コードは以下。




3-4ビルドサーバー、リポジトリの準備


ビルドサーバーを準備します。

当然、Windowsじゃないとだめです。

VisualStudioを設定し、Jenkinsをインストール。GitやSuvbersionなどのバージョン管理システムも導入。

バージョン管理システムとして、Team Foundation Serverも利用できるっぽいですが未確認です。
(ちなみに、僕自身はSuvbersionも使ったこと無い)

3-5 csproj参照のパスに注意する

Global Assembly Cacheに登録していないアセンブリをプロジェクトの参照に追加する場合、

csproj(vbproj)の参照のパスの設定で、

対象のアセンブリが、ローカルな保存領域にある場合は相対パスで、

ネットワーク上にある場合は絶対パスで記述されるらしいです。

http://msdn.microsoft.com/ja-jp/library/ms998208.aspx

これを知らなくて詰んでた。

今回、テストプロジェクトの生成のために
"Microsoft.Silverlight.Testing.dll"
 と
 "Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll"

の少なくとも2つを追加しているわけですが、ビルドサーバーからこのファイルが見える状態になるように

設定する必要があるわけです。

僕の場合、いつもネットワークドライブ上にプロジェクトのフォルダを作って作業をしていたので、見事にこれがハマった。

csprojを任意に設定するか、ビルドサーバーからもアクセスできる場所にファイルを置くか、まあその辺設定しましょう。

3-7Jenkinsの設定をする
わりと、酢酸先生( @ch3cooh )のこの投稿が便利です。

http://d.hatena.ne.jp/ch3cooh393/20120126/1327510696

Jenkinsの管理->プラグインの管理 と進みJenkins MsBuild Plugin を探し、インストールします。

Jenkinsの管理->システムの管理->MsBuild の中で、MsBuildのパスの設定を行います。

ジョブの生成から、フリースタイルのプロジェクトを選んでリポジトリの設定を行います。

ビルドトリガの設定をしたら、ビルド手順を次のように設定します

Build a Visual Stduio Project or solution using MSBuild

MSBuild Build File $(WORDKSPACE)\(your project)\msbuild.proj

Command Line Arguments /t:Clean,Teset,Release

成果物の保存
**\Bin\Release\*.xap,**\EmulatorTestResult*.txt

以上で設定終わり。

最後に、ビルドサーバーでWindowsPhoneのエミュレーターを立ちあげておきましょう。

4.所感

エミュレーター重いわ!!

こんなに重いと思ってなかった。いつも、メインマシンでやってたからわからなかった・・・

WindowsPhoneの開発でだってJenkinsが使えるんだよっ!! ってことが伝えられればそれで良いんです。

2012年9月10日月曜日

JenkinsでAndroidのユニットテスト+リリースビルドまで自動化


そういえば、LinuxでJenkinsを動かしてAndroidのビルドとかやってたけど、

記事にまとめて無かったや。

やったこと
・前準備色々
・Jenkinsの設定をする(OS:ScientificLinux)
・Androidのアプリのプロジェクトを複数のOS,ディスプレで自動でデバッグビルドする
・Androidのアプリのテストプロジェクトを自動でビルドし、実行する
・Androidのアプリのプロジェクトをリリースビルドして、回収する。
・テストのカバレッジを←文字化け発生する


前準備
・ライブラリ群のインストール
yum -y install glibs-devel.i686 zlib-devel.i686 libstdc++-devel.686

何よりもここが面倒くさかった。

・antのインストール
#wget http://archive.apache.org/dist/ant/binaries/apache-ant-1.8.3-bin.tar.gz
#tar xzf apache-ant-1.8.3-bin.tar.gz
#mv apache-ant-1.8.3 /usr/

・Androidプロジェクトを作る
ディレクトリの構成を
-Root--AppProject
--TestProject
--hoge.keystore

としておくと色々捗ります。

JenkinsやJDKのインストールは終わっているということにしましょう。

・Jenkinsの設定。
今回は、Gitのリポジトリをポーリングします。
・公開鍵の作成
#sudo -u jenkins ssh-keygen -t rsa
#sudo -u jenkins cat /var/lib/jenkins/.ssh/id_rsa.pub

こうして出来上がった公開鍵は、自分の環境に合わせて鍵の登録とかやっちゃってください。

・プラグインのインストール
Jenkins Gti Plugin
Android Emulator Plugin
をインストールします。

・AndroidSDKの設定
Jenkins→設定 から
プラグインがインストールされていると、現れる
Android
の項目。
AndroidSDK root:/var/lib/jenkins/tools/android-sdk を入力
Automatically install Android components when required にチェック





・antの設定
Ant項目の
名前:ant1.8.3
ANT_HOME:/usr/apache-ant-1.8.3

キャプチャは1.8.4

・プロジェクトを作る
新規ジョブの作成 から
ジョブ名:なんか適当
マルチ構成のビルド を選択

ソースコード管理システム
Git
Repository URL: git@hogehoge
Branches to build **
リポジトリブラウザ:自動

URL抜いたから赤字出てる。気にしないで。

ビルドトリガ
SCMをポーリング
スケジュール;1-59 * * * *

毎秒確認ってことですね。

マトリクスの設定
値の追加→ユーザ定義
名前:OS
値:2.3.3 3.0

名前:display
値:WVGA HVGA WXGA

名前:density
値:170 240



組み合わせフィルタ
フィルター:(!(OS!="3.0"&&display=="WXGA"))&&(!(OS!="2.3.3"&&display=="HVGA"))&&(!(density=="170"&&OS!="2.3.3"&&display!="HVGA"))&&(!(OS=="3.0"&&(display=="WVGA"||display=="HVGA")))







ビルド環境
Run an Android emulator during buildにチェック
Run emulator with properties にチェック

Android OS version:${OS}
Screen density:${density}
Screen resolation:${display}
Device locale:ja_JP


Common emulator options
Show emulator window のチェックを外す

これ付いてると詰むよ

ビルド
#アプリをサーバーのantでビルドできるように設定する。
ビルド手順の追加→シェルの実行
cd ${WORKSPACE}
export PATH=$PATH:/var/lib/jenkins/tools/android-sdk/tools:/usr/apache-ant-1.8.3/bin

echo Update Project
android update project -p ./ProjectName
echo Update Test Project
android update test-project -p ./ProjectName -m ${WORKSPACE}/Appname

echo Setting Release
cd ${WORKSPACE}/ProjectNamer
echo "key.store=${WORKSPACE}/hoge.keystore" >> ant.properties
echo "key.store.password=hogehoge" >> ant.properties
echo "key.alias=hoge" >> ant.properties
echo "key.alias.password=hogehoge" >> ant.properties

秘密の情報無いよな・・・

#アプリのデバッグビルドを行う
ビルド手順の追加→Antの呼び出し
使用するAnt:ant1.8.3
ターゲット:clean debug install
ビルドファイル:${WORKSPACE}/ProjectName/build.xml
#テストプロジェクトのビルドと実行を行う
使用するAnt:ant1.8.3
ターゲット:clean emma debug install test
ビルドファイル:${WORKSPACE}/TestPorject/build.xml
#リリースビルドを行う
使用するAnt:ant1.8.3
ターゲット:clean release
ビルドファイル:${WORKSPACE}/ProjectName/build.xml
ビルド後の処理
ビルド後の処理を追加→成果物を保存
保存するファイル:**/ProjectName/bin/*release.apk


うぉーなげぇ

プロジェクトのトップに戻ると、構成マトリクスができています。
フィルタの設定を確認するには、要素の上にマウス持って行ってリンクが貼られてたら、
フィルタされてない場所ってことみたいです。

さて、Android4.0.3からAPI(CPU?)を洗濯する必要があるわけですが、
エミュレーター設定のABIの項目に変数を入れても、
エミュレーター作成時にうまく読み込んでくれないみたいです。

というわけで、多分4.0系統は別のプロジェクトにしちゃうのが正解なんじゃないですかねぇ?

多分。


2012年6月16日土曜日

エミュレーターの画面を出力するディスプレイの設定

エミュレーターを実行するディスプレイを設定する。

Jenkinsの管理→Global properties
で、環境変数
DISPLAY=:0.0

に設定しておく。

とりあえず、こんだけ。これで、Jenkinsの動いているマシンで、エミュレーターを表示できる。


ローカルのマシンで、xhostを立ちあげてそこで表示できるようにしようかなとも思ったけど、常にxhost立ち上がっている訳でもないし、たぶんそれはやりすぎ。

確認したい時だけ、確認できるようになっていれば良いと思う。それが、Jenkinsの目指す所であるはずだし。

X Window System の設定は色々と面倒くさい。

Jenkinsを一般ユーザーで動かす

LinuxでJenkinsを動かすと、ユーザー jenkins が作成され、専用のホームディレクトリなどが生成されてその上で動作をする。

Linuxのデーモン達と同じ様な感じ。

ただ、今回は一般ユーザー numanuma08 で動作をさせたいと思う。

その目的は、Androidのエミュレーターの実行画面を見たいから。

ユーザー jenkins を一般ユーザーにするのもアリかもしれないけど、 なんかイヤなので。

以下、手順

/etc/sysconfig/jenkins の設定

JENKINS_USER="numanuma08"
JENKINS_PORT="8010"
JENKINS_ARGS="--prefix=/jenkins"


/etc/httpd/conf.d/jenkins.conf の設定


Order allow,deny
Allow from all
ProxyPass http://localhost:8010/jenkins
ProxyPassReverse http://localhost:8010/jenkins



パーミッションの変更

chown -R numanuma08 /var/lib/jenkins
chown -R numanuma08 /var/log/jenkins
chown -R numanuma08 /var/cache/jenkins

パスを通す

AndroidSDK


Jenkinsの管理→Global properties

からパスを通す必用あり。

Ant


自動インストールを選択しても実行されなかった。Antのパスを指定する必要あり。

一般ユーザーで動かしているからだろうか、様々な不具合が目に付く。

プラグイン関連がもう、火を拭きまくっていてヤバイ。

明日に続く。

2012年6月14日木曜日

テスト対象のデバイスを自動的に選択する 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年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時間くらいこれで詰まった・・・馬鹿らしい・・・。

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