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

GitHub Actions/Docker/Terraform/Renovate で最小限の ...

Yuya Takeyama
September 26, 2024

GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る / Minimalistic Monorepo CD Pipeline with GitHub Actions, Docker, Terraform and Renovate

2024/09/26 at 令和最新版 他人に自慢したいヤバいCI/CD LT会 @ yabaibuki.dev #2
https://livesense.connpass.com/event/328856/

Yuya Takeyama

September 26, 2024
Tweet

More Decks by Yuya Takeyama

Other Decks in Technology

Transcript

  1. © LayerX Inc. GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る 2024/09/26

    at 令和最新版 他人に自慢したいヤバいCI/CD LT会 @ yabaibuki.dev #2
  2. © LayerX Inc. 2 今日の話について • 個人的に Proof of Concept

    をしてみたやり方の共有 ◦ 仕事では来月あたり動かしたい • ツールよりは方法論について伝えたい ◦ 別のツールにも置き換えられる話のつもりです ▪ GitHub Actions -> GitLab CI/CD ▪ Docker -> Lambda ▪ Terraform -> CDK ▪ Renovate -> (自作の何か?) • 途中自作ツールの話も出てきますが、今日の話においては本質的に重要なもの ではありません GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る
  3. © LayerX Inc. 4 自己紹介 竹山雄也 (@yuya-takeyama) • 株式会社LayerX •

    コーポレートエンジニアリング室 • 2023年9月入社 • 前職はSRE • 浅草在住 • 趣味: メタル、麻雀、飲み歩き、散歩、ランニング
  4. © LayerX Inc. 5 • 自チーム (コーポレートエンジニアリング室) のための理想の CD パイプライン

    を作りたい ◦ コーポレートエンジニアリング室で作っているアプリケーション ▪ アカウント発行を予約実行するバッチジョブ (Step Functions x Lambda) ▪ セキュリティ・クリアランスの申請・承認のためのSlack bot (AWS App Runner) • 必要なアプリケーションを必要な時にシュシュッと作ってどんどこリリースしたい ◦ じゃあ Monorepo CD パイプラインだね! 解決したい問題 GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る
  5. © LayerX Inc. 6 要件 GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD

    パイプラインを作る • Web アプリケーションもバッチジョブも両方できたい • 同一アプリケーションを複数環境にリリースしたい • 環境によってリリース戦略を分けたい ◦ stg: main にマージしたら即リリース ◦ prd: 任意のタイミングでリリース (stg での確認後とか) • 今回は AWS を前提とする (メインで使ってるので) • なるべく標準的なツールの組み合わせで実現する ◦ 現チームでコードを書いているのは自分ぐらいなので、無理なく運用できて、採用でも苦労しな いものにしたい
  6. © LayerX Inc. 7 • アプリケーション間の複雑な依存関係は不要 ◦ 独立性の高いたくさんの小さなアプリケーション ◦ Bazel/Nx/Turborepo

    とかは不要なレベル • 複雑なコード生成 ◦ Nice to have だけど最初は考えない ◦ 大規模な開発組織のためのものではなく、とりあえず自分と半径10m以内ぐらいの人たちが快 適に開発できれば良い • 自動テスト周りの共通化 ◦ 一旦アプリケーションごとによしなにやれば十分 要件ではないこと GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る
  7. © LayerX Inc. 8 作ったもの • Docker イメージを並列にビルドして ECR に

    push • Renovate で tf ファイル内の App Runner の ECR のイメージタグを書き換え • これだけ!単純! GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る
  8. © LayerX Inc. 9 Web アプリケーションもバッチジョブも両方できたい • とりあえず安直に Docker を選択

    ◦ Web: AWS App Runner ◦ バッチ: Lambda (with Docker) x Step Functions ▪ 今のころ 15 分制限は問題なし ▪ ダメになったら ECS/Fargate とか AWS Batch とか • Dockerfile にさえできれば何でもデプロイできる、という汎用性 ◦ 一人暮らしで最初に買うべき家電はワインセラーではなく冷蔵庫、低温調理器ではなく電子レンジ GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る
  9. © LayerX Inc. 10 同一アプリケーションを複数環境に (Docker) GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo

    CD パイプラインを作る • GitHub Actions の matrix build で複数環境向けにbuild and push • そのための GitHub Action を作った
  10. © LayerX Inc. 11 • 複数環境に対応した Terraform パイプラインを用意 ◦ tfaction

    ですでに構築済みなので、それをそのまま使う ▪ 関連: コンパウンドスタートアップのためのスケーラブルでセキュアな Infrastructure as Code パイプラインを考える • 環境ごとに別ディレクトリ・別 tfstate として管理 ◦ コードの共有化とかは基本考えない ▪ resource ベタ書き・コピペで十分派 ▪ 頻出パターンは module 化なりコード生成スクリプトなり用意するもアリ 同一アプリケーションを複数環境に (Terraform) GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る
  11. © LayerX Inc. 12 環境によってリリース戦略を分けたい GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD

    パイプラインを作る • Docker イメージのタグ付け戦略により実現する ◦ stg: 常に latest で push ▪ App Runner: Automatic deployment を有効にする ▪ Lambda: aws_lambda_function の image_uri で latest を参照する ◦ prd: 毎回新しいタグを生成して push • Terraform でタグを書き換えることで新しいバージョンがリリースされる ◦ 手で書き換えるのは面倒... じゃあ Renovate だね!
  12. © LayerX Inc. 13 GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る

    # 自作 GitHub Action・modjo による設定 build: - on: push: branches: - main docker: registry: stg tagging: always_latest # <- 常に latest - on: push: branches: - main docker: registry: prd tagging: semver_datetime # <- コミット日時をベースにバージョンを生成
  13. © LayerX Inc. 14 • コミット日時をベースに SemVer に準拠したタグを生成 ◦ 例:

    0.0.20240926190000 • Renovate がバージョンの大小を正しく判定できるなら何でも良い ◦ https://github.com/renovatebot/renovate/tree/main/lib/modules/versioning 毎回新しいタグ生成 GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る
  14. © LayerX Inc. 15 Renovate で ECR のイメージタグを自動で書き換え GitHub Actions/Docker/Terraform/Renovate

    で最小限の Monorepo CD パイプラインを作る • GitHub Actions を使ってセルフホストする ◦ GitHub App と、ECR へのアクセス (read) ができる IAM Role が必要 • 設定で Renovate の Custom Manager に、イメージタグの所在とフォー マットを正規表現で教えてあげる ◦ docker データソースは実は ECR にも対応している ◦ https://docs.renovatebot.com/docker/#aws-ecr-amazon-web-services-elas tic-container-registry ▪ Access Key を使う例が載っているが、実際には IAM Role による OIDC も使える
  15. © LayerX Inc. 16 • Self-hosted Renovate の設定 ◦ https://github.com/yuya-takeyama/modjo-playground/blob/main/renovate-

    config.json • Repository の設定 (Custom Manager等) ◦ https://github.com/yuya-takeyama/modjo-playground/blob/main/renovate. json5 • GitHub Actions Workflow ◦ https://github.com/yuya-takeyama/modjo-playground/blob/main/.github/w orkflows/renovate.yaml Renovate セルフホストの設定例 GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る
  16. © LayerX Inc. 19 まとめ GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD

    パイプラインを作る • 普通のツールの組み合わせでも必要十分な Monorepo CD パイプラインが実 現できそうなことがわかりました • まずは冷蔵庫や電子レンジから始めて、それで満足できなくなったらワインセ ラーや低温調理器を買いましょう • バシバシ開発して様々な価値を実現していきましょう!