Jenkinsで行う並列テスト(公開用)
-
Upload
yamamoto-kazuhisa -
Category
Documents
-
view
2.002 -
download
3
Transcript of Jenkinsで行う並列テスト(公開用)
Jenkinsで行う並列テスト
岡山Ruby会議02
2013.07.06山本 和久
13年7月10日水曜日
自己紹介
• 山本 和久
• 岡山Ruby/Ruby on Rails勉強会
• @kazuhisa1976
• 株式会社リゾーム
13年7月10日水曜日
RubyGemsパッケージ
13年7月10日水曜日
need_label
• 必須項目にしるしを出力
13年7月10日水曜日
13年7月10日水曜日
13年7月10日水曜日
hashed-jasper-rails
• jasper-reportsをRailsから使う
13年7月10日水曜日
csv_combine
• 複数のCSVファイルをあたかも1つのファイルのように扱う
• 行のダブリを考慮
13年7月10日水曜日
ken_all
• 全国の郵便番号データをRailsで使う
• 半分ネタ
13年7月10日水曜日
pg_index_where
• PostgreSQLのユニークインデックスでWhereを指定
• acts_as_paranoidと併せて使うと良いよ
13年7月10日水曜日
勤務先
13年7月10日水曜日
勤務先
• 株式会社リゾーム
• ショッピングセンターのコンサル
• デベロッパーマネジメントシステム
• 顧客分析システム
13年7月10日水曜日
BOND GATE
• SC・専門店向けのコミュニケーションウェア
13年7月10日水曜日
私の役割
• テストフレームワーク
• 技術検証
• インフラ(AWS,Chef)
13年7月10日水曜日
テストの歴史• BGプロジェクト開始2011年1月
• 2011年4月 私が入社
• 2011年7月
• RubyKaigi2011
• いしきがたかくなった!
• 帰りの新幹線でテストフレームワークを設定
13年7月10日水曜日
テスト
• 2011年10月時点
• rspec
• 109ファイル
• cucumber
• 9ファイル
13年7月10日水曜日
ここで問題が
http://www.flickr.com/photos/morinkovo_fotky/4168850871
13年7月10日水曜日
Slow Tests
• RSpec + Cucumberの実行だけで30分位かかる
13年7月10日水曜日
Parallel Tests
13年7月10日水曜日
Slow Tests
• この時は一応解決した
13年7月10日水曜日
Slow Tests再び
• 2012年3月
• Parallel Testでも遅くなってきた
13年7月10日水曜日
Jenkinsの導入
• 岡山Javaユーザー会の@zephiransasさんの影響でJenkinsを導入
13年7月10日水曜日
Jenkinsとは?
• 継続的インテグレーション
• cronやタスクスケジューラと似てる
• 豊富なプラグイン
• Javaを知らなくても使える
• 豊富な通知(mail, growl)
13年7月10日水曜日
インストール方法
• Mac
• brew install jenkins
• Other
• Glassfish + jenkins.war
13年7月10日水曜日
Jenkins 黎明期
• 1台のマシン上で動かすJenkinsでParallel
Testを実行
• 自分のマシンがふさがらないので、それなりに便利だった
13年7月10日水曜日
Parallel Testsでも遅い
http://www.flickr.com/photos/66643556@N06/6065807649
13年7月10日水曜日
複数マシンでの並列実行
• ビルドパイプラインの構築
• テストの分割
• 全てのテストが成功した時のみリリース用ブランチにpush
13年7月10日水曜日
ビルドパイプラインの構築準備
spec 1 spec 2 spec 3 spec n...
後処理
13年7月10日水曜日
• Parameterized Trigger Pluginと組み合わせる
• (デモ)
• GitのコミットIDの引き継ぎ
• Parameterized TriggerでPass-through Git
Commit that was builtを指定
ビルドパイプラインの構築
13年7月10日水曜日
テストの分割• 行数で平均して分散化
20
10
40
50
30
60
80
15
36
22
11
8
13年7月10日水曜日
テストの分割• 行数で平均して分散化
20 10 40
5030 60
80 15
36
22
11
8
130
130
122
13年7月10日水曜日
テストの分割• Jenkins用のrake taskを作成
• rake jenkins:rspec
• rake jenkins:cucumber
export SPLIT=16export OF=4bundle exec rake jenkins:rspec
13年7月10日水曜日
リリース用ブランチにpush
• Join Trigger
• Parameterized Triggerで指定したJobが全て成功した時に走らせたいJobを指定
• テストが通ったものしかリリースできない
13年7月10日水曜日
13年7月10日水曜日
さらなる高速化http://www.flickr.com/photos/wheatfields/3938695154/
13年7月10日水曜日
コード量• Controller
• 125
• Model
• 304
• View
• 1104
13年7月10日水曜日
毎日増えるテスト
13年7月10日水曜日
LinuxよりMac• Capybara-webkitが高速
• Mac miniは省スペース
13年7月10日水曜日
Git Pullを高速化Github
git pull ...
各テストはローカルからpullする
git pull git pull git pull
git pull
The Internet
Local Net
13年7月10日水曜日
より便利にhttp://www.flickr.com/photos/75905404@N00/7126147125/
13年7月10日水曜日
任意のブランチでテスト
• ビルドのパラメータ化を利用
13年7月10日水曜日
任意のブランチでテスト
• rbenv or rvm pluginと組み合わせれば任意のrubyバージョンでテストすることも可能
13年7月10日水曜日
任意のブランチでテスト
• rbenv or rvm pluginと組み合わせれば任意のrubyバージョンでテストすることも可能
おーい。おじさん使うよ!
13年7月10日水曜日
テスト後にマージdevelop feature-foo
Github Jenkins local dev
feature-foofeature-foo
feature-foodevelop
13年7月10日水曜日
bundle update
• gemを取得する場所を指定
• bundle install --path vendor/bundle
• bundle update時のバッティングを防止
13年7月10日水曜日
今後やりたいこと• pull 方式のテスト
spec 1
spec 2
spec 3
spec 4
spec 5
spec 6
spec 7
...spec n
13年7月10日水曜日
今後やりたいこと• pull 方式のテスト
spec 2
spec 3
spec 4
spec 5
spec 6
spec 7
...spec n
13年7月10日水曜日
今後やりたいこと• pull 方式のテスト
spec 2
spec 3
spec 4
spec 5spec 6
spec 7
...spec n
13年7月10日水曜日
今後やりたいこと• pull 方式のテスト
spec 2
spec 3
spec 5spec 6
spec 7
...spec n
13年7月10日水曜日
今後やりたいこと• pull 方式のテスト
spec 2
spec 3
spec 5
spec 6
spec 7
...spec n
13年7月10日水曜日
今後やりたいこと
• RubyGemsのミラーで高速化
• 時々コケるテストのレスキュー
• テストが混線した時結果が分かりにくい
13年7月10日水曜日
おしまい
13年7月10日水曜日