Home
Product
Article
turborepoを使ったmonorepo構成でアプリを作っていて、その際に複数のフロントエンドのパッケージをcloud buildからそれぞれのvercelプロジェクトへデプロイしたかった。
一つのパッケージを変更した際に、他のパッケージのデプロイまで実行されると嫌なので、vercelのGithub連携はやめて、CI/CDからデプロイするようにした。
API側でGCP(compute engine)を使っている理由から、CI/CDでCloud Buildを採用した。
API側のデプロイの話
apps/
front/
package.json
...
admin/
package.json
...
package.json
monorepoを採用して複数個のフロントエンドアプリを一つのリポジトリで管理し、それぞれ別のサーバ(今回はvercel)へデプロイしています。
今回のアプリではサイトのUIを扱うfrontと管理画面のUIを扱うadminがあります。(実際には他にもapiなどのpackageがappsにある)
GithubとCloud Buildを連携すればpush/mergeが通知されるようになる
参考
Cloud Buildのトリガーの作成を作成する。
作成の際に「含まれるファイルフィルタ」にデプロイしたいパッケージのパスを追加する事で、対象のファイルに変更が加わった場合のみトリガーが実行されるようになる。
例) apps/frontのデプロイ用トリガーの場合
トリガーで実行するstepでvercel cliからプロジェクトへデプロイする。
この時に以下のVercelのsecret情報が必要になる。
secret情報
これらはyamlに直書きしたく無いので、GCPのSecret Managerを使ってセキュアに取得する。
Cloud Buildのyamlファイルは以下の通り。
steps:
- name: 'bash'
entrypoint: 'bash'
args:
- -c
- |
mkdir -p .vercel
touch .vercel/project.json
echo '{"orgId":"'$$VERCEL_ORG_ID'", "projectId":"'$$VERCEL_PROJECT_ID_FRONT'"}' >> .vercel/project.json
cat .vercel/project.json
secretEnv: ['VERCEL_PROJECT_ID_FRONT','VERCEL_ORG_ID']
- name: node:16.14.0
entrypoint: npx
args: ['npx','vercel','--prod','-t','$$VERCEL_TOKEN']
secretEnv: ['VERCEL_TOKEN']
availableSecrets:
secretManager:
- versionName: projects/{projectName}/secrets/VERCEL_PROJECT_ID_FRONT/versions/latest
env: VERCEL_PROJECT_ID_FRONT
- versionName: projects/{projectName}/secrets/VERCEL_ORG_ID/versions/latest
env: VERCEL_ORG_ID
- versionName: projects/{projectName}/secrets/VERCEL_TOKEN/versions/latest
env: VERCEL_TOKEN
options:
logging: CLOUD_LOGGING_ONLY
timeout: 1200s
まずstepの一つ目では、.vercel/project.json を作成し、SecretManagerから取得した ${VERCEL_ORG_ID} と ${VERCEL_PROJECT_ID} を書き込む。
二つ目では ${VERCEL_TOKEN} をvercel cliのオプションに渡してdeployを実行。
npx vercel --prod -t $$VERCEL_TOKEN
vercelの管理画面でデプロイがされていることを確認
かなり説明はしょったけど久しぶりに記事書けた.
7min