2022-02-21
turborepoを使ったmonorepo構成でアプリを作っていて、その際に複数のフロントエンドのパッケージをcloud buildからそれぞれのvercelプロジェクトへデプロイしたかった。
一つのパッケージを変更した際に、他のパッケージのデプロイまで実行されると嫌なので、vercelのGithub連携はやめて、CI/CDからデプロイするようにした。
API側でGCP(compute engine)を使っている理由から、CI/CDでCloud Buildを採用した。
API側のデプロイの話
Node.jsアプリをcloud buildからcompute engineへデプロイするNode.jsで作成したWebアプリケーションをcloud build上でビルドしてcompute engineへデプロイしたのでまとめました apps/
front/
package.json
...
admin/
package.json
...
package.json
monorepoを採用して複数個のフロントエンドアプリを一つのリポジトリで管理し、それぞれ別のサーバ(今回はvercel)へデプロイしています。
今回のアプリではサイトのUIを扱うfrontと管理画面のUIを扱うadminがあります。(実際には他にもapiなどのpackageがappsにある)
GithubとCloud Buildを連携すればpush/mergeが通知されるようになる
参考
GitHubとGoogle Cloud Build の連携を試してみた! | by Yuki Iwanari | google-cloud-jp | MediumCI/CDしてますか?. “GitHubとGoogle Cloud Build の連携を試してみた!” is published by Yuki Iwanari in google-cloud-jp.Cloud Buildのトリガーの作成を作成する。
作成の際に「含まれるファイルフィルタ」にデプロイしたいパッケージのパスを追加する事で、対象のファイルに変更が加わった場合のみトリガーが実行されるようになる。
例) apps/frontのデプロイ用トリガーの場合
トリガーで実行するstepでvercel cliからプロジェクトへデプロイする。
この時に以下のVercelのsecret情報が必要になる。
secret情報
これらはyamlに直書きしたく無いので、GCPのSecret Managerを使ってセキュアに取得する。
Secret Manager | Secret Manager | Google CloudSecret Manager de Google Cloud te permite almacenar claves de API, contraseñas, certificados y otros datos sensibles con total seguridad.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の管理画面でデプロイがされていることを確認
かなり説明はしょったけど久しぶりに記事書けた.