Jenkinsで行う並列テスト(公開用)

52
Jenkinsで行う 並列テスト 岡山Ruby会議02 2013.07.06 山本 和久 13710日水曜日

Transcript of Jenkinsで行う並列テスト(公開用)

Page 1: Jenkinsで行う並列テスト(公開用)

Jenkinsで行う並列テスト

岡山Ruby会議02

2013.07.06山本 和久

13年7月10日水曜日

Page 2: Jenkinsで行う並列テスト(公開用)

自己紹介

• 山本 和久

• 岡山Ruby/Ruby on Rails勉強会

• @kazuhisa1976

• 株式会社リゾーム

13年7月10日水曜日

Page 3: Jenkinsで行う並列テスト(公開用)

RubyGemsパッケージ

13年7月10日水曜日

Page 4: Jenkinsで行う並列テスト(公開用)

need_label

• 必須項目にしるしを出力

13年7月10日水曜日

Page 5: Jenkinsで行う並列テスト(公開用)

13年7月10日水曜日

Page 6: Jenkinsで行う並列テスト(公開用)

13年7月10日水曜日

Page 7: Jenkinsで行う並列テスト(公開用)

hashed-jasper-rails

• jasper-reportsをRailsから使う

13年7月10日水曜日

Page 8: Jenkinsで行う並列テスト(公開用)

csv_combine

• 複数のCSVファイルをあたかも1つのファイルのように扱う

• 行のダブリを考慮

13年7月10日水曜日

Page 9: Jenkinsで行う並列テスト(公開用)

ken_all

• 全国の郵便番号データをRailsで使う

• 半分ネタ

13年7月10日水曜日

Page 10: Jenkinsで行う並列テスト(公開用)

pg_index_where

• PostgreSQLのユニークインデックスでWhereを指定

• acts_as_paranoidと併せて使うと良いよ

13年7月10日水曜日

Page 11: Jenkinsで行う並列テスト(公開用)

勤務先

13年7月10日水曜日

Page 12: Jenkinsで行う並列テスト(公開用)

勤務先

• 株式会社リゾーム

• ショッピングセンターのコンサル

• デベロッパーマネジメントシステム

• 顧客分析システム

13年7月10日水曜日

Page 13: Jenkinsで行う並列テスト(公開用)

BOND GATE

• SC・専門店向けのコミュニケーションウェア

13年7月10日水曜日

Page 14: Jenkinsで行う並列テスト(公開用)

私の役割

• テストフレームワーク

• 技術検証

• インフラ(AWS,Chef)

13年7月10日水曜日

Page 15: Jenkinsで行う並列テスト(公開用)

テストの歴史• BGプロジェクト開始2011年1月

• 2011年4月 私が入社

• 2011年7月

• RubyKaigi2011

• いしきがたかくなった!

• 帰りの新幹線でテストフレームワークを設定

13年7月10日水曜日

Page 16: Jenkinsで行う並列テスト(公開用)

テスト

• 2011年10月時点

• rspec

• 109ファイル

• cucumber

• 9ファイル

13年7月10日水曜日

Page 17: Jenkinsで行う並列テスト(公開用)

ここで問題が

http://www.flickr.com/photos/morinkovo_fotky/4168850871

13年7月10日水曜日

Page 18: Jenkinsで行う並列テスト(公開用)

Slow Tests

• RSpec + Cucumberの実行だけで30分位かかる

13年7月10日水曜日

Page 19: Jenkinsで行う並列テスト(公開用)

Parallel Tests

13年7月10日水曜日

Page 20: Jenkinsで行う並列テスト(公開用)

Slow Tests

• この時は一応解決した

13年7月10日水曜日

Page 21: Jenkinsで行う並列テスト(公開用)

Slow Tests再び

• 2012年3月

• Parallel Testでも遅くなってきた

13年7月10日水曜日

Page 22: Jenkinsで行う並列テスト(公開用)

Jenkinsの導入

• 岡山Javaユーザー会の@zephiransasさんの影響でJenkinsを導入

13年7月10日水曜日

Page 23: Jenkinsで行う並列テスト(公開用)

Jenkinsとは?

• 継続的インテグレーション

• cronやタスクスケジューラと似てる

• 豊富なプラグイン

• Javaを知らなくても使える

• 豊富な通知(mail, growl)

13年7月10日水曜日

Page 24: Jenkinsで行う並列テスト(公開用)

インストール方法

• Mac

• brew install jenkins

• Other

• Glassfish + jenkins.war

13年7月10日水曜日

Page 25: Jenkinsで行う並列テスト(公開用)

Jenkins 黎明期

• 1台のマシン上で動かすJenkinsでParallel

Testを実行

• 自分のマシンがふさがらないので、それなりに便利だった

13年7月10日水曜日

Page 26: Jenkinsで行う並列テスト(公開用)

Parallel Testsでも遅い

http://www.flickr.com/photos/66643556@N06/6065807649

13年7月10日水曜日

Page 27: Jenkinsで行う並列テスト(公開用)

複数マシンでの並列実行

• ビルドパイプラインの構築

• テストの分割

• 全てのテストが成功した時のみリリース用ブランチにpush

13年7月10日水曜日

Page 28: Jenkinsで行う並列テスト(公開用)

ビルドパイプラインの構築準備

spec 1 spec 2 spec 3 spec n...

後処理

13年7月10日水曜日

Page 29: Jenkinsで行う並列テスト(公開用)

• Parameterized Trigger Pluginと組み合わせる

• (デモ)

• GitのコミットIDの引き継ぎ

• Parameterized TriggerでPass-through Git

Commit that was builtを指定

ビルドパイプラインの構築

13年7月10日水曜日

Page 30: Jenkinsで行う並列テスト(公開用)

テストの分割• 行数で平均して分散化

20

10

40

50

30

60

80

15

36

22

11

8

13年7月10日水曜日

Page 31: Jenkinsで行う並列テスト(公開用)

テストの分割• 行数で平均して分散化

20 10 40

5030 60

80 15

36

22

11

8

130

130

122

13年7月10日水曜日

Page 32: Jenkinsで行う並列テスト(公開用)

テストの分割• Jenkins用のrake taskを作成

• rake jenkins:rspec

• rake jenkins:cucumber

export SPLIT=16export OF=4bundle exec rake jenkins:rspec

13年7月10日水曜日

Page 33: Jenkinsで行う並列テスト(公開用)

リリース用ブランチにpush

• Join Trigger

• Parameterized Triggerで指定したJobが全て成功した時に走らせたいJobを指定

• テストが通ったものしかリリースできない

13年7月10日水曜日

Page 34: Jenkinsで行う並列テスト(公開用)

13年7月10日水曜日

Page 35: Jenkinsで行う並列テスト(公開用)

さらなる高速化http://www.flickr.com/photos/wheatfields/3938695154/

13年7月10日水曜日

Page 36: Jenkinsで行う並列テスト(公開用)

コード量• Controller

• 125

• Model

• 304

• View

• 1104

13年7月10日水曜日

Page 37: Jenkinsで行う並列テスト(公開用)

毎日増えるテスト

13年7月10日水曜日

Page 38: Jenkinsで行う並列テスト(公開用)

LinuxよりMac• Capybara-webkitが高速

• Mac miniは省スペース

13年7月10日水曜日

Page 39: Jenkinsで行う並列テスト(公開用)

Git Pullを高速化Github

git pull ...

各テストはローカルからpullする

git pull git pull git pull

git pull

The Internet

Local Net

13年7月10日水曜日

Page 40: Jenkinsで行う並列テスト(公開用)

より便利にhttp://www.flickr.com/photos/75905404@N00/7126147125/

13年7月10日水曜日

Page 41: Jenkinsで行う並列テスト(公開用)

任意のブランチでテスト

• ビルドのパラメータ化を利用

13年7月10日水曜日

Page 42: Jenkinsで行う並列テスト(公開用)

任意のブランチでテスト

• rbenv or rvm pluginと組み合わせれば任意のrubyバージョンでテストすることも可能

13年7月10日水曜日

Page 43: Jenkinsで行う並列テスト(公開用)

任意のブランチでテスト

• rbenv or rvm pluginと組み合わせれば任意のrubyバージョンでテストすることも可能

おーい。おじさん使うよ!

13年7月10日水曜日

Page 44: Jenkinsで行う並列テスト(公開用)

テスト後にマージdevelop feature-foo

Github Jenkins local dev

feature-foofeature-foo

feature-foodevelop

13年7月10日水曜日

Page 45: Jenkinsで行う並列テスト(公開用)

bundle update

• gemを取得する場所を指定

• bundle install --path vendor/bundle

• bundle update時のバッティングを防止

13年7月10日水曜日

Page 46: Jenkinsで行う並列テスト(公開用)

今後やりたいこと• pull 方式のテスト

spec 1

spec 2

spec 3

spec 4

spec 5

spec 6

spec 7

...spec n

13年7月10日水曜日

Page 47: Jenkinsで行う並列テスト(公開用)

今後やりたいこと• pull 方式のテスト

spec 2

spec 3

spec 4

spec 5

spec 6

spec 7

...spec n

13年7月10日水曜日

Page 48: Jenkinsで行う並列テスト(公開用)

今後やりたいこと• pull 方式のテスト

spec 2

spec 3

spec 4

spec 5spec 6

spec 7

...spec n

13年7月10日水曜日

Page 49: Jenkinsで行う並列テスト(公開用)

今後やりたいこと• pull 方式のテスト

spec 2

spec 3

spec 5spec 6

spec 7

...spec n

13年7月10日水曜日

Page 50: Jenkinsで行う並列テスト(公開用)

今後やりたいこと• pull 方式のテスト

spec 2

spec 3

spec 5

spec 6

spec 7

...spec n

13年7月10日水曜日

Page 51: Jenkinsで行う並列テスト(公開用)

今後やりたいこと

• RubyGemsのミラーで高速化

• 時々コケるテストのレスキュー

• テストが混線した時結果が分かりにくい

13年7月10日水曜日

Page 52: Jenkinsで行う並列テスト(公開用)

おしまい

13年7月10日水曜日