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
Docker時代の分散RSpec環境の作り方
Search
Tomohiro Hashidate
March 20, 2017
Programming
21
12k
Docker時代の分散RSpec環境の作り方
大江戸Ruby会議06 トーク資料
Tomohiro Hashidate
March 20, 2017
Tweet
Share
More Decks by Tomohiro Hashidate
See All by Tomohiro Hashidate
rubygem開発で鍛える設計力
joker1007
2
260
実践Kafka Streams 〜イベント駆動型アーキテクチャを添えて〜
joker1007
3
950
本番のトラフィック量でHudiを検証して見えてきた課題
joker1007
2
990
5分で分かった気になるDebezium
joker1007
1
110
Rustで作るtree-sitterパーサーのRubyバインディング
joker1007
5
1.2k
tree-sitter-rbsで作って学ぶRBSとパーサージェネレーター
joker1007
3
280
Kafka Streamsで作る10万rpsを支えるイベント駆動マイクロサービス
joker1007
7
4.7k
neovimで作る最新Ruby開発環境2023
joker1007
2
4.4k
ReproのImport/Exportを支えるサーバーレスアーキテクチャ
joker1007
1
1.3k
Other Decks in Programming
See All in Programming
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
240
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
1
590
童醫院敏捷轉型的實踐經驗
cclai999
0
200
GitHub Copilot and GitHub Codespaces Hands-on
ymd65536
1
130
#QiitaBash MCPのセキュリティ
ryosukedtomita
0
470
AIプログラマーDevinは PHPerの夢を見るか?
shinyasaita
1
180
#kanrk08 / 公開版 PicoRubyとマイコンでの自作トレーニング計測装置を用いたワークアウトの理想と現実
bash0c7
1
650
Flutterで備える!Accessibility Nutrition Labels完全ガイド
yuukiw00w
0
120
Railsアプリケーションと パフォーマンスチューニング ー 秒間5万リクエストの モバイルオーダーシステムを支える事例 ー Rubyセミナー 大阪
falcon8823
4
1k
ソフトウェア品質を数字で捉える技術。事業成長を支えるシステム品質の マネジメント
takuya542
0
250
WindowInsetsだってテストしたい
ryunen344
1
200
“いい感じ“な定量評価を求めて - Four Keysとアウトカムの間の探求 -
nealle
0
230
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
Making Projects Easy
brettharned
116
6.3k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
The Cult of Friendly URLs
andyhume
79
6.5k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
5
230
It's Worth the Effort
3n
185
28k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.8k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
Transcript
Docker時代の 分散RSpec環境の作り方 @joker1007
self.inspect @joker1007 Repro inc. CTO (要は色々やる人) Ruby/Rails uentd/embulk Docker/ECS ←
今日はこの辺 Bigquery/EMR/Hive/Presto
Reproのサービス モバイルアプリケーションの行動トラッキング 分析結果の提供と、それと連動したマーケティン グの提供 大体Ruby・RailsでほぼAWS上で稼動している Dockerやterraform等も活用している 会社規模の割にデータ量が多い。
フレンズ(エンジニア)を募集中です Railsがとくいなフレンズ Hadoopがとくいなフレンズ JavaScriptがとくいなフレンズ 等々、様々なフレンズを募集しております
なんちゃらRuby会議歴 東京Ruby会議スピーカー 関西Ruby会議スピーカー x2 (+CFP応募) TokyuRuby会議 LT王 RubyKaigi日本酒スーパーバイザー 東京Ruby会議日本酒仕入れ RubyKaigi
LT x3 名古屋Ruby会議スピーカー 大江戸Ruby会議Ninja (NEW!!)
本題へ
皆さんCI回してますか?
Docker使ってますか?
この2つに該当する人なら、 明日からでもRSpecを分散実行し 高速化できます (いや、もうちょいかかるかも)
RailsアプリケーションのCIに おける障壁 独立したDBの準備 テスト毎にクリーンな環境 関連ミドルウェアの準備 マルチコアを使えない parallel_test ? 中々辛いですね……。 Docker(コンテナ)と相性が良い
コンテナ化のメリット アプリケーション起動環境の再現性 一時利用のミドルウェアを簡単に用意できる mysql, postgresql redis elasticsearch uentd 複数プロセスでテスト範囲を分割しても、環境の 独立性が確保できる
コンテナでテストを実行でき ると、起動した時点で全ての ミドルウェアが揃っている しかもそれぞれが独立している
つまり spec_helper で子プロセスを起動 とかやらなくていい!
Railsコンテナ化Tips productiontとテストの共用は止めた方がいい 起動時に実行するprehookを用意する 環境変数を元にcon gを切り替える 本番環境での秘匿情報の取得・複合化等を行う シグナルハンドルに気を付けること 子プロセスまでシグナルが届かないと操作でき ない shellを噛ます場合はexecすること
ビルドサーバーはあった方が良い
RSpec分散実行に必要なもの 実行のキューイング ポーリングするワーカー テストレポートの収集と統合 レポートの表示
これらはほとんど 作る必要は無い
Amazon ECSの活用 ECSはEC2インスタンスをバックエンドにしたコンテ ナ管理サービス 複数のコンテナをセットにして1ノードで起動でき る。 各コンテナが利用するリソースの量を定義でき、空 いているインスタンスを自動的に検索してそこでコ ンテナを起動できる。 つまりAPIを叩くだけで、必要なノードで勝手にタス
クを実行して終わったら空けるということが簡単に 実現できる。 GKEやkubernetes、docker-swarm等でも可
CIサービスの部分的活用 PullReqのフック受信 JUnitフォーマットの結果表示
テストレポートの格納先 俺達にはS3(GCS)がある
作る必要があったもの RSpecのレポートをS3にストアするもの rspecの実行コマンドを渡すとECSのAPIに変換し て実行してくれるもの 作った rspec-storage wrapbox
rspec-storage -o オプションを拡張して任意のストレージに出力で きる用にした。 $ rspec -r rspec/storage spec/example_spec.rb \
-f doc \ -f json -o s3://your-bucket/spec_result.json URIのスキーマと表現により、アダプターを書けば何 にでも出力できる。 (rspec-coreの実装が行儀悪いので一部モンキーパッ チが……)
wrapbox コマンドを渡すとECSのAPIリクエストを構築して、 よしなにコンテナを起動してくれるヘルパー。 default: cluster: ecsr-test runner: ecs region: ap-northeast-1
container_definition: image: joker1007/wrapbox cpu: 512 memory: 1024 essential: true $ wrapbox ecs run_cmd -f config.yml -e RAILS_ENV=test \ "bundle exec rspec spec/models"
二つの簡単なgemを組み合わせる 1. specファイルを適当に分割してwrapboxに投げれ ば、勝手にECSがコンテナをEC2上で分散実行し てくれる。 2. wrapboxで実行したRSpecの出力はrspec-storage によってS3に収集される。 3. 終了した後でjsonを収集してjunit
format形式に変 換すれば良い。 簡単!しかもメンテフリー!
コンテナでテストを行うメリ ット リソースが抽象化される ノード毎のマシンスペックを気にしなくてよい テスト実行に必要なリソースを1ユニットとし て、一つのノード内に共存できる スポットインスタンスと相性が良い 特にスポットフリート
スポットフリート 複数のインスタンスタイプに対して、まとめてスポ ットインスタンスのリクエストを出せる。 リソースの割合を決めておけば、複数のインスタン スタイプの中で必要なリソースに対して最も安いイ ンスタンスを利用できる。 m4.large (weight 1): $0.03/1
= 0.03 c4.large (weight 1): $0.025/1 = 0.025 c4.xlarge (weight: 2): $0.04/2 = 0.02 ←Use もし必要なユニット数が8ならc4.xlargeが4台起動 c4.xlargeが高騰したら自動で変動する
スポットフリート (続き) 価格が高騰しても、別のインスタンスタイプからノ ードを起動して自動的に補充されるので計算リソー スを確保できる。 AutoScaleと大きく異なるのは複数のインスタンスタ イプを組み合わせて自動的に調節してくれる点。
スポットフリートでECSのクラスタ を構成する 常にスポットインスタンスの低価格を利用して、 一定の並列度でテスト実行できるクラスタが手に入 る。 複数のインスタンスタイプを組み合わせて、性能は 余り変わらないし並列度の調節もコンテナのリソー ス定義で自動的に行われる。 APIでリソース数を調節できるので、夜間だけ減ら す、とかも割と簡単。
コスト削減とテスト時間の短縮に成功 元々はCircleCIだったが、 並列度を3倍ぐらいまで上げて、 テスト実行時間を短縮 しかも、コストは月100$以上も安くなった
コンテナ化のメリットは環境再現性 だけではない 独立したミドルウェア環境 ミドルウェアや言語処理系のバージョン管理 計算リソースの抽象化 コンテナ化するにはある程度の手間と苦労が必 要だが、やる価値はある。
Let's containerize your app!! まずはテストから