はじめに
こんにちは。ニフティ株式会社の添野翔太です。
今回はモノレポ用のデプロイパイプラインを構築した話を共有します。
背景
現在、@niftyトップページではアプリケーション基盤の刷新を進めていますが、その過程で一部においてモノレポを採用しています。このリポジトリは、Web3層アーキテクチャにおけるWeb層にあたるもの、App層にあたるもの、およびその他のバッチ処理からなる構成です。
デプロイパイプラインの構築には、Github ActionsとCodeシリーズ(AWS CodePipeline、AWS CodeBuild、AWS CodeDeploy)を利用しています。
モノレポ用のデプロイパイプラインを作ってみる
Codeファミリーに関する問題として、一つのパイプラインに対応するブランチが一つしか設定できないという点が挙げられます。
そこで、Stack OverflowのQ&Aを参考にしながら、GitHub Actions上で特定のブランチに強制Pushする機構を作成しました。
まず、ディレクトリ構成を以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
(Gitリポジトリ) └─.github │ ├─actions │ │ └─applications │ │ └─sample │ │ └─deploy │ │ └─action.yaml │ └─workflows │ └─auto_push.yaml ├─buildspec_app.yaml ├─appspec_app.yaml ├─taskdef_app.json (以下略) |
次に、特定のブランチかつ特定のファイルで、Codeシリーズが監視するブランチに強制Pushするコード(.github/workflows/auto_push.yaml)を以下に示します。pathsキーには、主にCodeシリーズで使用するファイル類(BuildSpecやAppSpec、ECSタスク定義など)やデプロイ対象のソースコードを並べます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
name: sample_application_deploy on: # NOTE: PRがマージされた際に動くようにする push: branches: - develop - master paths: - 'buildspec_app.yaml' - 'appspec_app.yaml' - 'taskdef_app.json' (中略) jobs: development: if: github.ref == 'refs/heads/develop' runs-on: ubuntu-latest timeout-minutes: 30 steps: - name: Checkout uses: actions/checkout@v3 with: ref: develop - name: Deployment uses: ./.github/actions/applications/sample/deploy with: pipeline-branch: pipeline/dev/app production: if: github.ref == 'refs/heads/master' runs-on: ubuntu-latest timeout-minutes: 30 steps: - name: Checkout uses: actions/checkout@v3 with: ref: master - name: Deployment uses: ./.github/actions/applications/sample/deploy with: pipeline-branch: pipeline/prod/app |
そして、./.github/actions/applications/sample/deploy/action.yamlに共通処理である強制Pushを行う以下のコードを記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
name: auto_push_to_branch description: Auto push to branch inputs: pipeline-branch: required: true description: name of the codepipeline branch runs: using: "composite" steps: - name: Switch branch run: | git fetch --prune git switch -c ${{inputs.pipeline-branch}} shell: bash # NOTE: リポジトリ上でブランチが作られているとpush時にrejectされるためforce pushを実施する - name: Push changes run: | git push origin ${{inputs.pipeline-branch}} --force shell: bash |
上記コードのイメージを以下に示します。developブランチとmasterブランチはPRを使用して更新します。PRがマージされると、自動的に別のブランチに強制的にPushされます。強制Pushするブランチ先(pipeline/dev/appブランチとpipeline/prod/appブランチ)は、Codeシリーズを使用して作成するデプロイパイプラインとそれぞれ対応しています。
ここまでApp層のみをデプロイ対象として説明しましたが、Web層をデプロイしたい場合にも同様に展開できます。
おわりに
今回はモノレポ用のデプロイパイプラインを構築した話を紹介しました。何かの参考になれば幸いです。