>100 Views
December 18, 24
スライド概要
「Nagano.rb #18 2024忘年会」の発表資料です。
■イベント情報
https://naruby.connpass.com/event/336248/
■虎の穴ラボ 採用サイト
https://toranoana-lab.co.jp/
虎の穴ラボ株式会社は、主にとらのあな関連サービスのシステム開発を専門に担う、エンジニアの会社です。
TORANOANA Lab プロダクトの CIにかかる時間を ⅓ にしてみた話 虎の穴ラボ awamo Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
目次 1. 自己紹介 2. 自社プロダクト の CI 3. 重さのわけは 4. 1h → 22m 5. 落ちまくるSpec 6. ちょっと頑張ったこと Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
自己紹介 Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
awamo#description name: awamo age: 30 address: 佐久市協和(大体立科町の横) skill: Ruby, C#.net, VB.net, PHP, Java, JavaScript … etc →最近はRails, React belongs_to: 虎の穴ラボ length_of_service: 今年の5月〜 https://toranoana-lab.co.jp/interview/1215 Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
本題 Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
CI やっていますか 所属Tのプロダクトでは、Githubアクションでの CI を実施している ● それなりの数のSpec → 大体 2000 と少し ● 8年じっくり煮込んだソース ● 右肩上がりで増えていくSpec Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
結果、1回の CIに1時間かかる … Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
5月から 2つ機能開発しているうちに (そんなに specを足していないのに) さらに遅くなった( 50m→70m) Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
マズイ...! Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
原因に目星をつけてみる 何気なく spec/rails_helper.rb をみたところ、怪しい奴がいる config.before(:suite) do DatabaseCleaner.clean_with :truncation DatabaseCleaner.strategy = :truncation end config.before do DatabaseCleaner.start end config.after do DatabaseCleaner.clean end Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
とりあえず消してみる 消す前 Finished in 66 minutes 20 seconds (files took 5.64 seconds to load) 2115 examples, 0 failures, 72 pending 消した後 Finished in 13 minutes 47 seconds (files took 4.63 seconds to load) 2044 examples, 0 failures, 72 pending 実行時間はおよそ 1 / 5 !!! Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
ただし...? Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
めちゃくちゃ Specが落ちる (Flakyも込み Finished in 10 minutes 55 seconds (files took 10.17 seconds to load) 2120 examples, 158 failures, 73 pending Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
エイヤッ! Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
色々直しました ● IDを固定値で決め打ちしているもの ● IDを別テーブルの IDで検証しているもの ● マスターデータを作成している箇所(一意制約を無視しているので落ちる) ● seed 値が変わった結果、 spec が落ちているもの ● connection の切り替えチェックを オブジェクトが同一かではなくロールが正しいかに変更 ● redis を内部で使用しているにも関わらず、 RedisCacheMock を利用していないもの Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
IDを固定値で決め打ちしているもの ● it { expect(user.id).to eq 1 } → it { expect(user.id).to eq user.id } ● 毎回データベースがトランケートされるから、処理順とそれによって作成されるシーケンスに依 存した spec になる ● その結果、動作は意図通りなのに、シーケンスの割り振られ方が変わっただけで fail するように なる Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
IDを別テーブルの IDで検証しているもの ● it { expect(user.id).to eq user_xxx.id } → it { expect(user.id).to eq user.id } ● 毎回データベースがトランケートされるから、処理順とそれによって作成されるシーケンスに依 存した Spec になる ● さらに、偶然一致する ID でとおる Spec ができうる ● その結果、意図した仕様を記載できていない(用をなしていない) Spec が出来上がる Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
マスターデータを作成している箇所 ● 毎回データを掃除していたため発生していなかったが、Seed でデータが投入されるため一意制約で落ちる (個人的には、マスタデータはSpec での検証に向かず、git でのバージョン管理もできないのでmodule で enum 定義して mixin でいいのでは、とも思う) Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
seed 値が変わった結果、 specが落ちているもの ● フラグが無効であることが前提になっている Spec があるものの、実際の Seed 値と齟齬が出て いたため変更 ● データの掃除を毎回しているため発見が遅れたもの Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
connection の切り替えチェックを オブジェクトが同一かではなくロール が正しいかに変更 ● Rspec と ActiveRecord のトランザクションの扱いによって、コネクションが同一かどうかといったテ ストはうまく動かない ● (むしろなぜ今まで動いていたのかがわからない ...) Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
redisを内部で使用しているにも関わらず、 RedisCacheMockを利用して いないもの ● 作ってあるのに使われていないモックを使うように変更 ● 問題の発生原因とは別の箇所で落ちていた ... ● (むしろなぜ今まで動いていたのかがわからない ...) Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
Thread.new している箇所の前後で落ちる ...etc ● Rspec と ActiveRecord のトランザクションの扱いが原因なので、 Configの設定を動的に変える Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
おわりに Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
比較 修正前 修正後 Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
おわりに(感想) ● DatabaseCleaner 便利だけど対価もそれなりに大きそう ● 環境をリセットしてくれるが故に検証したいはずのものが検証できてない場合が出てしまう ● シンプルに時間がかかりすぎてしまう(数十のテストケースが増えるだけで 10m以上遅くなる ● プロダクトコードも大事だけど、テストコードが正しいことも大事 ● Flaky に落ちてる箇所があるので、そこは継続してみていきたい Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.