Cloud Run規則 - mahudas-tw/hive GitHub Wiki

發佈到Cloud Run上的話,開發時基本上是以Tag的規則為依據。
Cloud Run的環境分成「開發(dev)」、「測試(stage)」、以及「正式(production)」三種環境。

注意:

  • 使用SourceTree或其他UI進行git管理時,請不要將Tag拉回local。
  • 請定期清理remote過期許久的Tag。

dev

dev環境的觸發條件設定:^\d+\.\d+\.\d+(a|b)\d+$
意思就是 版本號+(a或b)+流水號

a代表的是alpha,b代表的是beta。
只要是符合這個條件的Tag都會被發佈到dev環境裡。
在Cloud Run的設定中,alpha會被build但不導流量,開發者需要自己去Cloud Run介面設定網址進行測試。
beta的話被build完成後就會接管目前所有流量。

stage

stage環境的觸發條件設定:^\d+\.\d+\.\d+s\d+$
意思就是 版本號+s+流水號

只要符合這個條件的Tag就會被發佈到stage環境裡。

production

production環境的觸發條件為:^\d+\.\d+\.\d+$
意思就是 版本號

cloudbuild.yaml範例

CloudBuild設定時可以建立替代變數,這個範例裡的 _SERVICE_NAME、_APP_ENV 皆是帶入的替代變數。
$PROJECT_ID、$TAG_NAME則是CloudBuild的內建變數。

steps:
  # 建立一個${_SERVICE_NAME}-${_APP_ENV}:$TAG_NAME的image,最後一個參數指向的是Dockerfile存在的目錄
  - name: 'gcr.io/cloud-builders/docker'
    args:
      [
        'build',
        '-t',
        'gcr.io/$PROJECT_ID/${_SERVICE_NAME}-${_APP_ENV}:$TAG_NAME',
        '.',
      ]

  # 將image推倒Container Registry
  - name: 'gcr.io/cloud-builders/docker'
    args: ['push', 'gcr.io/$PROJECT_ID/${_SERVICE_NAME}-${_APP_ENV}:$TAG_NAME']

  # 部署到Cloud Run
  # 以TAG_NAME以及_APP_ENV用來判斷是否需要導流
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: bash
    args:
      - '-c'
      - |
        tag=$TAG_NAME
        gcloud run deploy ${_SERVICE_NAME}-${_APP_ENV} --image=gcr.io/$PROJECT_ID/${_SERVICE_NAME}-${_APP_ENV}:$TAG_NAME --revision-suffix=v${tag//./-} --set-env-vars "APP_ENV=${_APP_ENV}" --region=asia-east1 --platform=managed --allow-unauthenticated --no-traffic
        if [ "$TAG_NAME" =~ ^[0-9]+\.[0-9]+\.[0-9]+(s](/mahudas-tw/hive/wiki/b)[0-9]+$-||-"${_APP_ENV}"-==-"production"-); then 
          gcloud run services update-traffic ${_SERVICE_NAME}-${_APP_ENV} --region=asia-east1 --to-latest
        fi
timeout: 3000s
images:
  - 'gcr.io/$PROJECT_ID/${_SERVICE_NAME}-${_APP_ENV}:$TAG_NAME'