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
新しい職場の CI が 20 分かかっていたらあなたならどうする?
Search
Kazuhiko Yamashita
June 18, 2025
1
1.3k
新しい職場の CI が 20 分かかっていたらあなたならどうする?
golang.tokyo #39でお話してきました。
Kazuhiko Yamashita
June 18, 2025
Tweet
Share
More Decks by Kazuhiko Yamashita
See All by Kazuhiko Yamashita
事業を差別化する技術を生み出す技術
pyama86
4
1.7k
Re:Define 可用性を支える モニタリング、パフォーマンス最適化、そしてセキュリティ
pyama86
9
8.3k
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.7k
Tuning GraphQL on Rails
pyama86
2
2k
ttlcacheのここがスゴい
pyama86
1
160
クラウドサービスの 利用コストを削減する技術 - 円安の真南風を感じて -
pyama86
3
620
実践ARMアーキテクチャ移行
pyama86
2
2.5k
リモートワーク時代の守護神 PHP開発者のためのセキュリティ強化術
pyama86
3
1.3k
実践DevSecOps~クラウドネイティブとオンプレミスの間から~
pyama86
1
160
Featured
See All Featured
Gamification - CAS2011
davidbonilla
81
5.4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
138
34k
Agile that works and the tools we love
rasmusluckow
329
21k
We Have a Design System, Now What?
morganepeng
53
7.7k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.4k
How to Ace a Technical Interview
jacobian
277
23k
Scaling GitHub
holman
459
140k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Facilitating Awesome Meetings
lara
54
6.4k
Code Review Best Practice
trishagee
69
18k
Transcript
新しい職場の CI が 20 分かかっていたら あなたならどうする? 2025.01.26 P山@GO株式会社
© GO Inc. 文章・画像等の内容の無断転載及び複製等の行為はご遠慮ください
© GO Inc. 3 GO株式会社 山下 和彦 所属 開発本部 ソフトウェア開発統括部
バックエンド開発部 バックエンド1グループ @pyama86
© GO Inc. 4 バックエンドAPIの概要 『GO』アプリのメイン処理を担当する巨大モノリス テストはhandlerパッケージとそれ以外で実行環境を分離 - handlerテストは4つのワーカで分割してそれぞれ20分 handler配下のファイル数は1500個程度
© GO Inc. 5 なぜテストが遅い? 1. ファイル数やコード数が単純に多い 2. handler配下がほぼ単一パッケージ 3.
go test -p 1がついてる a. こういうのがいっぱいあるから、並列でテストするとエラー test.CreateUser(User{ID: 1})
© GO Inc. 6 早くするには? 1. ファイル数やコード数が単純に多い → 減らす 2.
handler配下がほぼ単一パッケージ → 分割する 3. go test -p 1がついてる -> 並列で実行する
© GO Inc. 7 パッケージ 分割
© GO Inc. 8 パッケージの分割 パッケージ分割のメリット - ビルドキャッシュの再利用性が高まりビルドが早くなる - テストプロセスが分離する
- 並列性が上がり、テスト実行時間が短縮される - 環境変数の適用範囲が限定される(例えばDBの接続先とかプロセ スごとに分けられる) - でも1500ファイルある・・・
© GO Inc. 9 pachanger作った GoのCLIコマンド - pachangerの機能 1. パッケージのリネーム
a. foo.Hogeからfuga.Hogeのように書き換えて、利用箇所も全部 書き換える 2. シンボルのスコープの変更 a. パッケージのリネームに伴い、エクスポートが必要なシンボルは 小文字から大文字へ 3. 構造体のメンバーのスコープ変更 https://pyama.fun/archives/6463
© GO Inc. 10 パッケージのリネーム ファイル単位でパッケージをリネームする before/something.go after/something.go package before
func something() string { return Export() } func Export() { return “export” } package after func something() string { return before.Export() } func Export() { return “export” }
© GO Inc. 11 シンボルのスコープの変更 パッケージが変わると、プライベートな関数に アクセスできなくなる package after #
beforeからafterパッケージに書き換えられたファイル func something() { return before.hoge() }
© GO Inc. 12 gopls便利 renameサブコマンドを利用すると、呼び出し元含めて 書き換えてくれるのでsedより安全 # gopls [flags]
rename [rename-flags] <position> <name> $ gopls rename before.go:2:6 Hoge package before func hoge() { return “hoge” } package before func Hoge() { return “hoge” }
© GO Inc. 13 構造体のメンバーのスコープ変更 package after # # beforeからafterパッケージに書き換えられたファイル
bar = before.Bar { example: 1, } パッケージ分割後、異なるパッケージの構造体のメンバーに アクセスできない package before type Bar struct { example int }
© GO Inc. 14 構造体のメンバーのスコープ変更 package before type Bar struct
{ example int } type BarParamsForMigrate { Example int } func NewBarForMigrete(params *BarParamsForMigrate) * Bar { return &Bar{ example: params.Example } } こういうコードを自動生成する
© GO Inc. 15 構造体のメンバーのスコープ変更 package after bar = before.NewBarForMigrate(before.BarParamsForMigrate{
Example: 1, }) さらに呼び出し側も書き換える package after bar = before.Bar { example: 1, }
© GO Inc. 16 並列化
© GO Inc. 17 パッケージ分割で並列化したが DBを共有してるとレコードは重複する DB package before package
after Insert user id = 1 Insert user id = 1 Duplicate Entry
© GO Inc. 18 マネーフォワード、大好きです!!! https://tech.mfkessai.co.jp/2019/11/parallel-go-test/ DB1 package before DB2
DB3 try lock try lock try lock ロックを使って他のプロセスが使ってない DBを使う
© GO Inc. 19 DBを分離すると嬉しいこと 1. データが重複しなくなる 2. Truncate /
ALTER でのReset Auto Incrementの 待ち時間は馬鹿にならない
© GO Inc. 20 最後に 1. 現在は、20分→10分かかったりかからなかったり 2. パッケージを分割するとビルドもテストも早くなる 3.
既存の資産をある程度大胆に書き換えても、型があると 安心安全 4. 今日話してないことはGoConにCfP通ったら話す…
© GO Inc. モビリティまじで良くしたいと思ってます!! 21 私たちと一緒に 未来を作っていきませんか?