GoのCICDを少しでも早くしたい¶
チェック¶
- [ ] 本文を確認した
- [ ] 概要を確認した
- [ ] タグを確認した
- [ ]
inbox/直下へ移行した
概要¶
Go API server の CI/CD を高速化した every Tech Blog の事例。
AWS CodeBuild で deploy、GitHub Actions で test を回しており、CodeBuild が 15 分、GitHub Actions が 10 分程度かかっていた。
不要 code の削除、Docker build cache、go mod download、.dockerignore、GitHub Actions cache の見直しなどが改善ポイント。
本文¶
CI/CD pipeline の数分の遅延は、開発チーム全体の生産性低下や cost 増加につながる。 対象の API server は Go で書かれ、AWS CodeBuild で ECS deploy、GitHub Actions で test を実行していた。
現状把握では、CodeBuild が約 15 分、GitHub Actions が約 10 分。 ものすごく長いわけではないが、日常的に回る pipeline では数分が効く。
CodeBuild 側では、ECR image build / push / ECS deploy の過程で cache が活用されていなかった。
Dockerfile では go mod download がなく、build stage で毎回依存解決をしていた。
.dockerignore も十分に効いておらず、build に関係ない差分が copy 対象になっていた。
改善観点は次の通り。
- 不要 code や dead code の削除
- Docker layer cache を効かせる
go mod downloadを依存 file copy 後に分離する.dockerignoreを整える- GitHub Actions の cache を適切に使う
- pipeline のどこが遅いかをまず測る
要点¶
- CI/CD 高速化はまず現状の時間内訳を測る。
- Docker build は layer cache と
.dockerignoreが効く。 - Go では
go mod downloadを build 前に分離すると依存 cache を使いやすい。 - 数分の削減でも、チーム全体では大きな開発体験改善になる。