Slide 1

Slide 1 text

© LayerX Inc. GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る 2024/09/26 at 令和最新版 他人に自慢したいヤバいCI/CD LT会 @ yabaibuki.dev #2

Slide 2

Slide 2 text

© LayerX Inc. 2 今日の話について ● 個人的に Proof of Concept をしてみたやり方の共有 ○ 仕事では来月あたり動かしたい ● ツールよりは方法論について伝えたい ○ 別のツールにも置き換えられる話のつもりです ■ GitHub Actions -> GitLab CI/CD ■ Docker -> Lambda ■ Terraform -> CDK ■ Renovate -> (自作の何か?) ● 途中自作ツールの話も出てきますが、今日の話においては本質的に重要なもの ではありません GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る

Slide 3

Slide 3 text

© LayerX Inc. 3 ● CI/CDパイプラインを作るのが好きな人 ● そしてアプリケーションをどんどこデプロイして何らかの価値を実現したい人 ○ DevもOpsもやってこそDevOpsだと思う人! 想定する聞き手 GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る

Slide 4

Slide 4 text

© LayerX Inc. 4 自己紹介 竹山雄也 (@yuya-takeyama) ● 株式会社LayerX ● コーポレートエンジニアリング室 ● 2023年9月入社 ● 前職はSRE ● 浅草在住 ● 趣味: メタル、麻雀、飲み歩き、散歩、ランニング

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

© LayerX Inc. 6 要件 GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る ● Web アプリケーションもバッチジョブも両方できたい ● 同一アプリケーションを複数環境にリリースしたい ● 環境によってリリース戦略を分けたい ○ stg: main にマージしたら即リリース ○ prd: 任意のタイミングでリリース (stg での確認後とか) ● 今回は AWS を前提とする (メインで使ってるので) ● なるべく標準的なツールの組み合わせで実現する ○ 現チームでコードを書いているのは自分ぐらいなので、無理なく運用できて、採用でも苦労しな いものにしたい

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

© LayerX Inc. 8 作ったもの ● Docker イメージを並列にビルドして ECR に push ● Renovate で tf ファイル内の App Runner の ECR のイメージタグを書き換え ● これだけ!単純! GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る

Slide 9

Slide 9 text

© 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 パイプラインを作る

Slide 10

Slide 10 text

© LayerX Inc. 10 同一アプリケーションを複数環境に (Docker) GitHub Actions/Docker/Terraform/Renovate で最小限の Monorepo CD パイプラインを作る ● GitHub Actions の matrix build で複数環境向けにbuild and push ● そのための GitHub Action を作った

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

© 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 だね!

Slide 13

Slide 13 text

© 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 # <- コミット日時をベースにバージョンを生成

Slide 14

Slide 14 text

© 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 パイプラインを作る

Slide 15

Slide 15 text

© 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 も使える

Slide 16

Slide 16 text

© 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 パイプラインを作る

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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