---
title: Nagano.rb_18_2024忘年会_プロダクトの_CIにかかる時間を_1_3_にしてみた話
tags: 
author: [とらのあなラボ](https://www.docswell.com/user/toranoana_lab)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/V7N8WK4VE8.jpg?width=480
description: 「Nagano.rb #18 2024忘年会」の発表資料です。  ■イベント情報 https://naruby.connpass.com/event/336248/  ■虎の穴ラボ 採用サイト  https://toranoana-lab.co.jp/
published: December 18, 24
canonical: https://www.docswell.com/s/toranoana_lab/KYD8EE-2024-12-18-101001
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/V7N8WK4VE8.jpg)

TORANOANA Lab
プロダクトの CIにかかる時間を
⅓ にしてみた話
虎の穴ラボ awamo
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 2

![Page Image](https://bcdn.docswell.com/page/YJ9KXVQVJ3.jpg)

目次
1. 自己紹介
2. 自社プロダクト の CI
3. 重さのわけは
4. 1h → 22m
5. 落ちまくるSpec
6. ちょっと頑張ったこと
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 3

![Page Image](https://bcdn.docswell.com/page/GJ8R2PG47D.jpg)

自己紹介
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 4

![Page Image](https://bcdn.docswell.com/page/LJLK21GV7R.jpg)

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.


# Page. 5

![Page Image](https://bcdn.docswell.com/page/47M28WQN7W.jpg)

本題
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 6

![Page Image](https://bcdn.docswell.com/page/P7RM5Y84J9.jpg)

CI やっていますか
所属Tのプロダクトでは、Githubアクションでの CI を実施している
●
それなりの数のSpec → 大体 2000 と少し
●
8年じっくり煮込んだソース
●
右肩上がりで増えていくSpec
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 7

![Page Image](https://bcdn.docswell.com/page/PJXVKG8ZEX.jpg)

結果、１回の CIに1時間かかる …
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 8

![Page Image](https://bcdn.docswell.com/page/3JKQ54KVJD.jpg)

５月から 2つ機能開発しているうちに
（そんなに specを足していないのに）
さらに遅くなった（ 50m→70m）
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 9

![Page Image](https://bcdn.docswell.com/page/LE3PKL3QJ5.jpg)

マズイ...!
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 10

![Page Image](https://bcdn.docswell.com/page/8EDL3N4WJG.jpg)

原因に目星をつけてみる
何気なく 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.


# Page. 11

![Page Image](https://bcdn.docswell.com/page/V7P245MX78.jpg)

とりあえず消してみる
消す前
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.


# Page. 12

![Page Image](https://bcdn.docswell.com/page/2JVDXP93JQ.jpg)

ただし...?
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 13

![Page Image](https://bcdn.docswell.com/page/5EGYVPZYEL.jpg)

めちゃくちゃ 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.


# Page. 14

![Page Image](https://bcdn.docswell.com/page/4JQM62L67P.jpg)

エイヤッ！
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 15

![Page Image](https://bcdn.docswell.com/page/K74V4LDMJ1.jpg)

色々直しました
●
IDを固定値で決め打ちしているもの
●
IDを別テーブルの IDで検証しているもの
●
マスターデータを作成している箇所（一意制約を無視しているので落ちる）
●
seed 値が変わった結果、 spec が落ちているもの
●
connection の切り替えチェックを オブジェクトが同一かではなくロールが正しいかに変更
●
redis を内部で使用しているにも関わらず、 RedisCacheMock を利用していないもの
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 16

![Page Image](https://bcdn.docswell.com/page/LJ134LZY7G.jpg)

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.


# Page. 17

![Page Image](https://bcdn.docswell.com/page/GJWPXV9172.jpg)

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.


# Page. 18

![Page Image](https://bcdn.docswell.com/page/4EZK649XE3.jpg)

マスターデータを作成している箇所
●
毎回データを掃除していたため発生していなかったが、Seed でデータが投入されるため一意制約で落ちる
（個人的には、マスタデータはSpec での検証に向かず、git でのバージョン管理もできないのでmodule で
enum 定義して mixin でいいのでは、とも思う）
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 19

![Page Image](https://bcdn.docswell.com/page/Y76Q23KP7V.jpg)

seed 値が変わった結果、 specが落ちているもの
●
フラグが無効であることが前提になっている Spec があるものの、実際の Seed 値と齟齬が出て
いたため変更
●
データの掃除を毎回しているため発見が遅れたもの
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 20

![Page Image](https://bcdn.docswell.com/page/G75R2LPPE4.jpg)

connection の切り替えチェックを オブジェクトが同一かではなくロール
が正しいかに変更
●
Rspec と ActiveRecord のトランザクションの扱いによって、コネクションが同一かどうかといったテ
ストはうまく動かない
●
（むしろなぜ今まで動いていたのかがわからない ...）
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 21

![Page Image](https://bcdn.docswell.com/page/9J2D4L6ZJR.jpg)

redisを内部で使用しているにも関わらず、 RedisCacheMockを利用して
いないもの
●
作ってあるのに使われていないモックを使うように変更
●
問題の発生原因とは別の箇所で落ちていた ...
●
（むしろなぜ今まで動いていたのかがわからない ...）
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 22

![Page Image](https://bcdn.docswell.com/page/DEY2MQ9NEM.jpg)

Thread.new している箇所の前後で落ちる ...etc
●
Rspec と ActiveRecord のトランザクションの扱いが原因なので、 Configの設定を動的に変える
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 23

![Page Image](https://bcdn.docswell.com/page/VJN8WKLV78.jpg)

おわりに
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 24

![Page Image](https://bcdn.docswell.com/page/YE9KXV4VE3.jpg)

比較
修正前
修正後
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


# Page. 25

![Page Image](https://bcdn.docswell.com/page/GE8R2PQ4JD.jpg)

おわりに（感想）
●
DatabaseCleaner 便利だけど対価もそれなりに大きそう
●
環境をリセットしてくれるが故に検証したいはずのものが検証できてない場合が出てしまう
●
シンプルに時間がかかりすぎてしまう（数十のテストケースが増えるだけで 10m以上遅くなる
●
プロダクトコードも大事だけど、テストコードが正しいことも大事
●
Flaky に落ちてる箇所があるので、そこは継続してみていきたい
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.


