Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
進行中の開発プロジェクトで増えていくテストを自動で回し続けるために行ったいくつかのこと
Search
KUROKI Shinsuke
June 18, 2013
Programming
45k
11
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
進行中の開発プロジェクトで増えていくテストを自動で回し続けるために行ったいくつかのこと
2013/6/18 第6回テックヒルズにて発表
KUROKI Shinsuke
June 18, 2013
More Decks by KUROKI Shinsuke
See All by KUROKI Shinsuke
冴えてるRailsエンジニアの育て方
skuroki
7
11k
伝わるコードレビューのために
skuroki
5
7.4k
ActiveAdmin Better Practices@関西Ruby会議06
skuroki
0
420
Refactoring Ruby Edition in-house reading
skuroki
0
230
ActiveDecorator導入の話
skuroki
5
260k
Other Decks in Programming
See All in Programming
Jetpack Compose Mechanisms
skydoves
3
870
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
590
phperだってパンチカードでコーディングしたい
o0h
PRO
0
460
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.4k
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
170
オーケストレーション記述言語 Katari
yukikurage
0
200
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
120
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
11
9.2k
JIS keyboard support in Omarchy
lef237
0
160
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.8k
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.2k
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
840
Featured
See All Featured
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
410
What does AI have to do with Human Rights?
axbom
PRO
1
2.5k
Building the Perfect Custom Keyboard
takai
2
920
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
460
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
HDC tutorial
michielstock
2
980
Thoughts on Productivity
jonyablonski
76
5.4k
Odyssey Design
rkendrick25
PRO
2
890
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
640
Marketing to machines
jonoalderson
1
5.9k
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))