前言
GCP 的 Cloud Build 是個非常好用的 DevOps 工具, 對於使用 Cloud Source Repository
的開發者來說, 不需要繁複的設定, 就能快速的建立 CI/CD Pipeline,
使推送到 Cloud Source Repository 的交付能自動觸發 Cloud Build
的事件執行測試與部署
除此之外無伺服器的平台, 不需要額外管理 CI/CD 的伺服器, 也不避擔心 Scale
的問題, 這也是許多開發者選擇 Cloud Build 的原因之一
以下就簡單的帶各位了解如何在 Cloud Build 上建立 Pipeline 跑 CI/CD 的流程
首先, 建立 Pipeline 腳本
由於 Cloud Build 是基於容器的服務, 腳本上的指令都必須跑在容器的環境內,
所以在建立腳本的時候, 需要特別地指定執行環境的容器映像( 即 Builder 的映像), 如下
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/myproject/myapp', '.']
目前 GCP 上已經內建了幾個常用的容器映像讓開發者使用, 所以想要實作 CI/CD 的 Pipeline 並不一定需要自己建立 Builder 的映像檔
預設所有要被執行的腳本都需要被定義在 cloudbuild.yaml 的檔案裡
內容如下
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/myproject/myapp', '.']
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/myproject/myapp']
- name: 'gcr.io/cloud-builders/gcloud'
args: ['run','deploy','myapp','--image','gcr.io/myproject/myapp','--platform','managed','--region','us-central1','--project', ${_PROJECT_NAME}]
基本上這個腳本做了三件事建立 docke image
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/myproject/myapp', '.']
推送 docker image 至 Google Container Registry (GCR)
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/myproject/myapp']
最後在 Cloud Run 上部署服務
- name: 'gcr.io/cloud-builders/gcloud'
args: ['run','deploy','myapp','--image','gcr.io/myproject/myapp','--platform','managed','--region','us-central1','--project', ${_PROJECT_NAME}]
建立觸發條件
腳本編寫完後, 下一件事就是建立觸發條件
在 Cloud Build 的頁面上選擇 Trigger 後, 可以在頁面上方的位置找到 Create Trigger 的選項
進入 Create Trigger 的頁面之後, 就可以設定要連結的 Repository, 以及設定該由哪個 Branch 來觸發事件
最後可以選擇是否要設定變數, 以下圖為例, 新增了一個變數 _PROJECT_NAME, 在 Cloud Build 執行腳本的時候, 就會將這個變數給帶進來
以上都設定完後, 只要做 git push <指定的分支>, Cloud Build 就會開始執行腳本
腳本包含邏輯判斷
如果腳本很複雜, 需要邏輯判斷的陳述式在裡頭, 這時可以將 entrypoint 預設執行的動作, 改成執行 bash 如下
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- name: 'gcr.io/cloud-builders/docker' | |
id: build | |
entrypoint: bash | |
args: | |
- "-c" | |
- | | |
docker run --net=cloudbuild -p 8080:8080 --name srv -d gcr.io/${_PROJECT_NAME}/myapp:${SHORT_SHA} | |
API_STATUS=$(curl --fail -i --retry 3 --retry-delay 2 --retry-connrefused 'http://srv:8080/api/status' | grep HTTP | cut -d' ' -f2) | |
echo "API Status: $$API_STATUS" | |
if [ "200" != "$$API_STATUS" ]; then | |
echo "Error [API status: $$API_STATUS]" | |
exit 1 | |
fi |
範例一開始會先起一個容器起來, 然後執行 CURL 的指令去打容器內的服務, 若最後回傳的 Status Code 不等於200, 就會丟出 exit 1 強制中斷整個 Pipeline 的流程
注意: 因為 Builder 用的網路預設是 cloudbuild, 所以要測試的容器也必須被放在 cloudbuild 的網路下, 這樣的話在 Builder 跟測試容器的網路才能相通
留言
張貼留言