Upgrade to Pro — share decks privately, control downloads, hide ads and more …

新しい職場の CI が 20 分かかっていたらあなたならどうする?

Avatar for Kazuhiko Yamashita Kazuhiko Yamashita
June 18, 2025
900

新しい職場の CI が 20 分かかっていたらあなたならどうする?

golang.tokyo #39でお話してきました。

Avatar for Kazuhiko Yamashita

Kazuhiko Yamashita

June 18, 2025
Tweet

More Decks by Kazuhiko Yamashita

Transcript

  1. © GO Inc. 3 GO株式会社 山下 和彦 所属 開発本部 ソフトウェア開発統括部

     バックエンド開発部   バックエンド1グループ @pyama86
  2. © GO Inc. 5 なぜテストが遅い? 1. ファイル数やコード数が単純に多い 2. handler配下がほぼ単一パッケージ 3.

    go test -p 1がついてる a. こういうのがいっぱいあるから、並列でテストするとエラー test.CreateUser(User{ID: 1})
  3. © GO Inc. 6 早くするには? 1. ファイル数やコード数が単純に多い → 減らす 2.

    handler配下がほぼ単一パッケージ → 分割する 3. go test -p 1がついてる -> 並列で実行する
  4. © GO Inc. 8 パッケージの分割 パッケージ分割のメリット - ビルドキャッシュの再利用性が高まりビルドが早くなる - テストプロセスが分離する

    - 並列性が上がり、テスト実行時間が短縮される - 環境変数の適用範囲が限定される(例えばDBの接続先とかプロセ スごとに分けられる) - でも1500ファイルある・・・
  5. © GO Inc. 9 pachanger作った GoのCLIコマンド - pachangerの機能 1. パッケージのリネーム

    a. foo.Hogeからfuga.Hogeのように書き換えて、利用箇所も全部 書き換える 2. シンボルのスコープの変更 a. パッケージのリネームに伴い、エクスポートが必要なシンボルは 小文字から大文字へ 3. 構造体のメンバーのスコープ変更 https://pyama.fun/archives/6463
  6. © 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” }
  7. © GO Inc. 11 シンボルのスコープの変更 パッケージが変わると、プライベートな関数に アクセスできなくなる package after #

    beforeからafterパッケージに書き換えられたファイル func something() { return before.hoge() } 󰢃
  8. © 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” }
  9. © GO Inc. 13 構造体のメンバーのスコープ変更 package after # # beforeからafterパッケージに書き換えられたファイル

    bar = before.Bar { example: 1,   } パッケージ分割後、異なるパッケージの構造体のメンバーに アクセスできない package before type Bar struct { example int } 󰢃
  10. © GO Inc. 14 構造体のメンバーのスコープ変更 package before type Bar struct

    { example int } type BarParamsForMigrate { Example int } func NewBarForMigrete(params *BarParamsForMigrate) * Bar { return &Bar{ example: params.Example } } こういうコードを自動生成する
  11. © GO Inc. 15 構造体のメンバーのスコープ変更 package after bar = before.NewBarForMigrate(before.BarParamsForMigrate{

    Example: 1,   }) さらに呼び出し側も書き換える package after bar = before.Bar { example: 1,   }
  12. © 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を使う
  13. © GO Inc. 19 DBを分離すると嬉しいこと 1. データが重複しなくなる 2. Truncate /

    ALTER でのReset Auto Incrementの 待ち時間は馬鹿にならない
  14. © GO Inc. 20 最後に 1. 現在は、20分→10分かかったりかからなかったり 2. パッケージを分割するとビルドもテストも早くなる 3.

    既存の資産をある程度大胆に書き換えても、型があると 安心安全 4. 今日話してないことはGoConにCfP通ったら話す…