前言
開發者可以將測試以及部署的腳本定義在 cloudbuild.yaml 的設定檔中, 讓 Cloud Build 照著腳本去執行指令
# Build the module.
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args: [
'run',
'deploy',
'myapp',
'--set-env-vars',
'SERVICE_ENV=stage',
'--image',
'gcr.io/build-prj/myapp',
'--platform',
'managed',
'--region',
'us-central1'
]
但預設 Cloud Build 的服務帳號只擁有當下專案的權限, 若想要做到跨專案部署應用程式的話, 就需要授予 Cloud Build 的服務帳號在另一個專案下的部署權限
本篇文章將會簡單的介紹如何跨專案部署服務
要實作這個機制, 首先
授予部署權限
需要授予在 Build Project (8750547431)下的 Cloud Build 的服務帳號能在 App Project (2498738606)下部署的相關權限 (如下)
- Service Account User
- Cloud Run Admin
APP_PRJ=app-prj
BUILD_PRJ_NUM=8750547431
# Cloud Run Admin: can deploy Cloud Run Service
gcloud projects add-iam-policy-binding $APP_PRJ \
--member serviceAccount:$BUILD_PRJ_NUM@cloudbuild.gserviceaccount.com \
--role=roles/run.admin
# Service Account User
gcloud projects add-iam-policy-binding $APP_PRJ \
--member serviceAccount:$BUILD_PRJ_NUM@cloudbuild.gserviceaccount.com \
--role=roles/iam.serviceAccountUser
授權讓 App Project 的 Cloud Run 可以從 Build Project 裡 Pull 欲部署服務的容器映像
因為 Google Container Registry 主要都是以 GCS 的儲存空間來存放容器映像檔, 所以如果欲部署的的容器映像來自 Build Project 的話, 就必須授權讓 App Project 下的 Cloud Run 的服務帳號可以存取 Build Project 用來存放映像的 GCS Bucket (gs://artifacts.$BUILD_PRJ.appspot.com)
APP_PRJ_NUM=2498738606
BUILD_PRJ=build-prj
gsutil acl ch -r -u service-$APP_PRJ_NUM@serverless-robot-prod.iam.gserviceaccount.com:R \
gs://artifacts.$BUILD_PRJ.appspot.com
gsutil acl ch -u service-$APP_PRJ_NUM@serverless-robot-prod.iam.gserviceaccount.com:R \
gs://artifacts.$BUILD_PRJ.appspot.com
gsutil defacl ch -u service-$APP_PRJ_NUM@serverless-robot-prod.iam.gserviceaccount.com:R \
gs://artifacts.$BUILD_PRJ.appspot.com
最後
修改一下 cloudbuild,yaml 加入欲部署的專案名稱 --project app-prj
# Build the module.
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args: [
'run',
'deploy',
'myapp',
'--set-env-vars',
'SERVICE_ENV=stage',
'--image',
'gcr.io/build-prj/myapp',
'--platform',
'managed',
'--region',
'us-central1'
'--project',
'app-prj'
]
留言
張貼留言