SlideShare a Scribd company logo
1 of 52
Download to read offline
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=16
export OF=4
bundle 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 5
spec 6
spec 7
...
spec n
13年7月10日水曜日
今後やりたいこと
• pull 方式のテスト
spec 2
spec 3
spec 5
spec 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日水曜日

More Related Content

What's hot

僕はどうしてもLibsassが使いたかったんだ!
僕はどうしてもLibsassが使いたかったんだ!僕はどうしてもLibsassが使いたかったんだ!
僕はどうしてもLibsassが使いたかったんだ!Masato Noguchi
 
Ember コミュニティとわたし
Ember コミュニティとわたしEmber コミュニティとわたし
Ember コミュニティとわたしRyunosuke SATO
 
JavascriptでRubyの作り方
JavascriptでRubyの作り方JavascriptでRubyの作り方
JavascriptでRubyの作り方Shuyo Nakatani
 
Railsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてRailsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてHirata Tomoko
 
プロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリプロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリYusuke Muraoka
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionGoh Matsumoto
 
ぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュKenji Mori
 
RailsのRailから解放される始めの一歩
RailsのRailから解放される始めの一歩RailsのRailから解放される始めの一歩
RailsのRailから解放される始めの一歩Masato Noguchi
 
C#とRubyをつなぐ
C#とRubyをつなぐC#とRubyをつなぐ
C#とRubyをつなぐ107steps
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話nekogeruge_987
 
名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道Shigeru UCHIYAMA
 
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編Kazuya Numata
 
Reudy on Ruby1.9
Reudy on Ruby1.9Reudy on Ruby1.9
Reudy on Ruby1.9Glass_saga
 
Railsのフロントエンド開発を考える
Railsのフロントエンド開発を考えるRailsのフロントエンド開発を考える
Railsのフロントエンド開発を考えるHirata Tomoko
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 

What's hot (18)

read parse-css
read parse-cssread parse-css
read parse-css
 
僕はどうしてもLibsassが使いたかったんだ!
僕はどうしてもLibsassが使いたかったんだ!僕はどうしてもLibsassが使いたかったんだ!
僕はどうしてもLibsassが使いたかったんだ!
 
Ember コミュニティとわたし
Ember コミュニティとわたしEmber コミュニティとわたし
Ember コミュニティとわたし
 
JavascriptでRubyの作り方
JavascriptでRubyの作り方JavascriptでRubyの作り方
JavascriptでRubyの作り方
 
Railsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてRailsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えて
 
プロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリプロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリ
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
ぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュ
 
RailsのRailから解放される始めの一歩
RailsのRailから解放される始めの一歩RailsのRailから解放される始めの一歩
RailsのRailから解放される始めの一歩
 
C#とRubyをつなぐ
C#とRubyをつなぐC#とRubyをつなぐ
C#とRubyをつなぐ
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話
 
名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道
 
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編
 
Reudy on Ruby1.9
Reudy on Ruby1.9Reudy on Ruby1.9
Reudy on Ruby1.9
 
Railsのフロントエンド開発を考える
Railsのフロントエンド開発を考えるRailsのフロントエンド開発を考える
Railsのフロントエンド開発を考える
 
すこやかRails
すこやかRailsすこやかRails
すこやかRails
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 

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

Ruby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けてRuby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けてKoji SHIMADA
 
Hyper → Highspeed → Development
Hyper → Highspeed → DevelopmentHyper → Highspeed → Development
Hyper → Highspeed → Developmentaktsk
 
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室higaki
 
Rubotoを試してみた
Rubotoを試してみたRubotoを試してみた
Rubotoを試してみた豊明 尾古
 
Rails の自動読み込みを支える技術
Rails の自動読み込みを支える技術Rails の自動読み込みを支える技術
Rails の自動読み込みを支える技術Tomohiko Himura
 
#027 tddのさわり
#027 tddのさわり#027 tddのさわり
#027 tddのさわり森下 智裕
 

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

とあるApi
とあるApiとあるApi
とあるApi
 
Ruby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けてRuby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けて
 
Slimの紹介
Slimの紹介Slimの紹介
Slimの紹介
 
Hyper → Highspeed → Development
Hyper → Highspeed → DevelopmentHyper → Highspeed → Development
Hyper → Highspeed → Development
 
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室
 
Rubotoを試してみた
Rubotoを試してみたRubotoを試してみた
Rubotoを試してみた
 
Rails の自動読み込みを支える技術
Rails の自動読み込みを支える技術Rails の自動読み込みを支える技術
Rails の自動読み込みを支える技術
 
Ruby24
Ruby24Ruby24
Ruby24
 
RSpecしぐさ
RSpecしぐさRSpecしぐさ
RSpecしぐさ
 
#027 tddのさわり
#027 tddのさわり#027 tddのさわり
#027 tddのさわり
 

More from Yamamoto Kazuhisa

Railsらしい 1対多の画面作成
Railsらしい 1対多の画面作成Railsらしい 1対多の画面作成
Railsらしい 1対多の画面作成Yamamoto Kazuhisa
 
初心者の皆さんに伝えたいこと
初心者の皆さんに伝えたいこと初心者の皆さんに伝えたいこと
初心者の皆さんに伝えたいことYamamoto Kazuhisa
 
意外と知られていない AWSのメール配信 テクニック
意外と知られていない AWSのメール配信 テクニック意外と知られていない AWSのメール配信 テクニック
意外と知られていない AWSのメール配信 テクニックYamamoto Kazuhisa
 
ken_all.gem〜狂った世界にようこそ〜
ken_all.gem〜狂った世界にようこそ〜ken_all.gem〜狂った世界にようこそ〜
ken_all.gem〜狂った世界にようこそ〜Yamamoto Kazuhisa
 
Jenkins + awsで並列テスト
Jenkins + awsで並列テストJenkins + awsで並列テスト
Jenkins + awsで並列テストYamamoto Kazuhisa
 
JRubyで作るapiサーバー
JRubyで作るapiサーバーJRubyで作るapiサーバー
JRubyで作るapiサーバーYamamoto Kazuhisa
 
Ruby gemsパッケージの作り方
Ruby gemsパッケージの作り方Ruby gemsパッケージの作り方
Ruby gemsパッケージの作り方Yamamoto Kazuhisa
 
Railsで春から始めるtdd生活
Railsで春から始めるtdd生活Railsで春から始めるtdd生活
Railsで春から始めるtdd生活Yamamoto Kazuhisa
 
Iron rubyとsinatraで作るデスクトップアプリ
Iron rubyとsinatraで作るデスクトップアプリIron rubyとsinatraで作るデスクトップアプリ
Iron rubyとsinatraで作るデスクトップアプリYamamoto Kazuhisa
 

More from Yamamoto Kazuhisa (10)

Railsらしい 1対多の画面作成
Railsらしい 1対多の画面作成Railsらしい 1対多の画面作成
Railsらしい 1対多の画面作成
 
初心者の皆さんに伝えたいこと
初心者の皆さんに伝えたいこと初心者の皆さんに伝えたいこと
初心者の皆さんに伝えたいこと
 
Docker入門
Docker入門Docker入門
Docker入門
 
意外と知られていない AWSのメール配信 テクニック
意外と知られていない AWSのメール配信 テクニック意外と知られていない AWSのメール配信 テクニック
意外と知られていない AWSのメール配信 テクニック
 
ken_all.gem〜狂った世界にようこそ〜
ken_all.gem〜狂った世界にようこそ〜ken_all.gem〜狂った世界にようこそ〜
ken_all.gem〜狂った世界にようこそ〜
 
Jenkins + awsで並列テスト
Jenkins + awsで並列テストJenkins + awsで並列テスト
Jenkins + awsで並列テスト
 
JRubyで作るapiサーバー
JRubyで作るapiサーバーJRubyで作るapiサーバー
JRubyで作るapiサーバー
 
Ruby gemsパッケージの作り方
Ruby gemsパッケージの作り方Ruby gemsパッケージの作り方
Ruby gemsパッケージの作り方
 
Railsで春から始めるtdd生活
Railsで春から始めるtdd生活Railsで春から始めるtdd生活
Railsで春から始めるtdd生活
 
Iron rubyとsinatraで作るデスクトップアプリ
Iron rubyとsinatraで作るデスクトップアプリIron rubyとsinatraで作るデスクトップアプリ
Iron rubyとsinatraで作るデスクトップアプリ
 

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