Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
進行中の開発プロジェクトで増えていくテストを自動で回し続けるために行ったいくつかのこと
Search
KUROKI Shinsuke
June 18, 2013
Programming
11
45k
進行中の開発プロジェクトで増えていくテストを自動で回し続けるために行ったいくつかのこと
2013/6/18 第6回テックヒルズにて発表
KUROKI Shinsuke
June 18, 2013
Tweet
Share
More Decks by KUROKI Shinsuke
See All by KUROKI Shinsuke
冴えてるRailsエンジニアの育て方
skuroki
7
11k
伝わるコードレビューのために
skuroki
5
7.3k
ActiveAdmin Better Practices@関西Ruby会議06
skuroki
0
380
Refactoring Ruby Edition in-house reading
skuroki
0
190
ActiveDecorator導入の話
skuroki
5
260k
Other Decks in Programming
See All in Programming
How Software Deployment tools have changed in the past 20 years
geshan
0
16k
AWS CDKの推しポイントN選
akihisaikeda
1
210
AIを駆使して新しい技術を効率的に理解する方法
nogu66
1
670
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
140
イベントストーミングのはじめかた / Getting Started with Event Storming
nrslib
1
750
開発生産性が組織文化になるまでの軌跡
tonegawa07
0
200
Stay Hacker 〜九州で生まれ、Perlに出会い、コミュニティで育つ〜
pyama86
2
2.7k
複数チーム並行開発下でのコード移行アプローチ ~手動 Codemod から「生成AI 活用」への進化
andpad
0
190
Micro Frontendsで築いた 共通基盤と運用の試行錯誤 / Building a Shared Platform with Micro Frontends: Operational Learnings
kyntk
0
1.6k
Reactive Thinking with Signals and the new Resource API
manfredsteyer
PRO
0
120
競馬で学ぶ機械学習の基本と実践 / Machine Learning with Horse Racing
shoheimitani
14
14k
TVerのWeb内製化 - 開発スピードと品質を両立させるまでの道のり
techtver
PRO
3
1.2k
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
514
110k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
11
940
Into the Great Unknown - MozCon
thekraken
40
2.2k
It's Worth the Effort
3n
187
29k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Statistics for Hackers
jakevdp
799
230k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
How to train your dragon (web standard)
notwaldorf
97
6.4k
A designer walks into a library…
pauljervisheath
210
24k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Transcript
進行中の開発プロジェクトで 増えていくテストを自動で回し続けるために 行ったいくつかのこと 株式会社Aiming エンジニア 黒木 慎介
自己紹介 • 黒木 慎介 • Aimingのエンジニア(よくお昼寝している) • 主にRuby on Railsでお仕事
• Jenkins歴は3年くらい
今日話すこと • あるプロジェクトでのJenkins – 使い方 – 増えすぎたテスト件数≒実行時間との戦い – 増えすぎた実行頻度との戦い –
心構え • AimingでのJenkinsの使い方紹介
あるプロジェクト • PC向けブラウザゲーム • Ruby on Rails + CoffeeScript +
Backbone.js + α • 2011-12年にかけての約8ヶ月で開発 • 最初2人→最後10人で開発
Jenkinsの使い方 • テストの実行 – Rspec(Ruby on Railsのテスト) • ci_reporterを使用 –
Jasmine(JavaScriptのテスト)
ci_reporter • Rubyのgem • RSpecの実行結果をXML出力する • Jenkinsは、このXMLを読んで – テストの成功件数・失敗件数を表示できる –
ジョブのページで、失敗したテストの情報を表示 できる
増えすぎたテスト件数≒実行時間との戦い
増えるテスト件数 ※再現イメージです
増えるテスト件数 ※再現イメージです
増えるテスト件数 ※再現イメージです
増えるテスト件数 ※再現イメージです
増えるテスト件数 ※再現イメージです
地獄 • テスト7000件越え • 実行時間1時間越え • 手元でのテスト全件実行が困難→自動テスト の重要性は増す
地獄 • テスト7000件越え • 実行時間1時間越え • 手元でのテスト全件実行が困難→自動テスト の重要性は増す – 引き下がるわけには行かない!!
対策 • 分割して並行に実行 – スレーブ(VM上)を2台から6台に増設 – テストをカテゴリ別に分割して実行
分割に便利なもの(1):ラベル付け テスト全件 60分
分割に便利なもの(1):ラベル付け カテゴリA 20分 カテゴリB カテゴリC D 20分 15分 5分
分割に便利なもの(1):ラベル付け カテゴリA 20分 カテゴリB カテゴリC D 20分 15分 5分
分割に便利なもの(1):ラベル付け ノードの設定画面で:
分割に便利なもの(1):ラベル付け ノードの設定画面で:
分割に便利なもの(1):ラベル付け ジョブの設定画面で:
分割に便利なもの(1):ラベル付け ジョブの設定画面で:
分割に便利なもの(1):ラベル付け
分割に便利なもの(2):Join Plugin • Aが成功したら、BとCを実行して、両方成功し たらDを実行する • 最後にメトリクス計測とか
分割に便利なもの(2):Join Plugin
分割に便利なもの(2):Join Plugin
分割に便利なもの(3):Build Pipeline Plugin
増えすぎた実行頻度との戦い
Gerrit • レビューシステム • ある変更がレビューを経てどう変化したかを 差分として見ることができる
Gerrit Trigger Plugin • Gerritのレビュー依頼が提出されたら、 Jenkinsのジョブを実行 • 提出された全ての変更が対象
Gerritレビューの流れ
Gerritレビューの流れ
Gerritレビューの流れ
Gerritレビューの流れ
Gerritレビューの流れ
Gerrit Trigger Plugin • Gerritのレビュー依頼が提出されたら、 Jenkinsのジョブを実行 • 提出された全ての変更が対象
そのとき、Gerrit Triggerは
そのとき、Gerrit Triggerは
そのとき、Gerrit Triggerは
そのとき、Gerrit Triggerは
そのとき、Gerrit Triggerは
地獄 • Jenkinsの実行が開発のペースに追いつかな い – 1回のレビュー提出で変更10個以上とか普通 – 増える開発人数 – 提出された差分のテストが終わらないうちに修正
再提出された差分のテストが積まれたり – 朝来てもビルドキューが空になってない
地獄 • Jenkinsの実行が開発のペースに追いつかな い – 1回のレビュー提出で変更10個以上とか普通 – 増える開発人数 – 提出された差分のテストが終わらないうちに修正
再提出された差分のテストが積まれたり – 朝来てもビルドキューが空になってない • Jenkinsの完了を待たずにマージ
地獄、しかし • 開発人員が増え、ペースが上がっていた • その分、テストが壊れる頻度もあがっていた
地獄、しかし • 開発人員が増え、ペースが上がっていた • その分、テストが壊れる頻度もあがっていた – 引き下がるわけには行かない!!
無駄なテスト実行を減らしたい • 既にマージされてる変更のテスト • 既に修正再提出されている変更の元のテスト • テストは成功終了でも失敗終了でもなく中断 させたい – テストしてないのに青や赤をつけたくないので
Jenkinsのジョブを中断 % exit 0 % exit 1 ? → →
→
普段我々はどうやって Jenkinsのジョブを中断しているだろうか?
普段我々はどうやって Jenkinsのジョブを中断しているだろうか?
Webから止めればいいじゃない!! • JenkinsのWebから中断ボタンを押した時には、 所定のURLにgetしているだけだった • 同じurlをcurlで叩く • そのあとsleepすることで次の処理の開始を抑 止する %
curl http://jenkins/job/my_project_a/$BUILD_NUMBER/stop && sleep 60
心構え
心構え(1) • Jenkinsがやってくれるのは自動化だけ – 自動化する処理は自前 – だからこそ頑張り次第でいろいろできる
心構え(2) • Pluginのドキュメントをちゃんと読む – Jenkins Wiki – 必要な情報はだいたい変数に入れてある – それでも挙動がよくわからんときはある、が…
心構え(3) • なんだったらコードも読む – だいたいGithubにある ここからレポジトリへ
今日話すこと • あるプロジェクトでのJenkins – 使い方 – 増えすぎたテスト件数≒実行時間との戦い – 増えすぎた実行頻度との戦い –
心構え • AimingでのJenkinsの使い方紹介
今日話すこと • あるプロジェクトでのJenkins – 使い方 – 増えすぎたテスト件数≒実行時間との戦い – 増えすぎた実行頻度との戦い –
心構え • AimingでのJenkinsの使い方紹介
AimingでのJenkinsの使い方 • ビルド – Android, iOS – ゲームサーバー(C++) • テスト実行
• デプロイ • サーバー再起動 • データチェック
結果の通知
データチェックをJenkinsで • 企画の人が作ったマスターデータ(Excelとcsv で、svnで管理)を、取り込んでデプロイ • データにミスがあるとデプロイが止まって困る • 取り込み部分だけをジョブ化 →ミスがあっても事前にわかる!
提供 ご清聴ありがとうございました!
時間が余った時用
分割に便利なもの(4):rakeのオプション • Ruby on Rails固有 • modelsだけで1時間かかるようになり、さらな る分割を行う方法として導入 • コマンドラインオプションで、実行するテストの
ファイル名をパターン指定できる % rake spec SPEC='spec/models/**/[a-l]*_spec.rb‘
分割に便利なもの(4):rakeのオプション • コマンドラインオプションで、rspecに渡すオプ ションを指定できる • テスト項目にタグをつけておいて、tオプション でそれだけ流す/除外して流す % rake spec
SPEC_OPTS=‘-t debt‘ % rake spec SPEC_OPTS=‘-t ~debt‘
既にマージされているか • Gerritのqueryコマンドを使う • status: mergedの結果の中に同じchange numberのものがあれば、マージされていると 判断できる % ssh
-p 29418 -l s-kuroki gerrit_host ‘gerrit query project:my_project status:merged’ |grep "number: $GERRIT_CHANGE_NUMBER"
次のパッチセットが提出されているか • git ls-remoteで確認 f4a80a6171d8287 refs/changes/96/2996/3 →change number2996のPatch set 3
% git ls-remote |grep $GERRIT_CHANGE_NUMBER/$((GERRIT_PATCHSET_NUMBER + 1))