Cloud Build的CI/CD之旅

sasa :)
7 min readMay 5, 2020

--

#工作筆記

這是GCP官方推薦的ci/cd pipeline

source: https://www.slideshare.net/DevOpsIndonesia/cicd-on-google-cloud-platform

好多solution令人頭昏眼花

以前在AWS上,都是利用git/travisCI/code deploy來做ci/cd

現在在玩GCP,我覺得應該要從原生的先玩起,之後再來變形XD

這次想做到的是:推code後,可以直接更新GKE裡面的pod

所以流程應該是這樣

推code[1] → Source Repository[2] → trigger Cloud Build[3] → push to Container Registry[4] → kubectl set image(rolling update)[5]

以上若有不懂可以拉到最下面有名詞解釋

事前準備&環境說明

本篇用到的資訊都可以在
https://github.com/sasapan33/gcp-test/tree/master/CloudBuildNode 找到

環境

run一個node express的Hello World

用webpack Build

事前設定

請先確認你所在的環境可以使用gcloud指令。
若無法使用請參考 https://cloud.google.com/sdk/docs/initializing?hl=zh-tw 去做設定
或可以直接使用cloud shell做你的環境也可以。

須先開啟一個GKE cluster,可利用 deploy1.yaml直接作部署

參考語法(當然也可以直接到console去點點點做設定)

#create clustergcloud container clusters create "YOUR_CLUSTER_NAME" 
--region "YOUR_REGION"
--machine-type "g1-small" --num-nodes "1" --enable-ip-alias

完成後就可以透過 deploy1.yaml去部署pod

記得部署後要expose

參考語法

#grant權限後才能用kubectl指令gcloud container clusters get-credentials YOUR_CLUSTER_NAMEkubectl create -f deploy1.yamlkubectl expose deployment hello-cloud-build-1 
--type=LoadBalancer --port 3000 --target-port 3000

步驟說明

[1] 推code

將上方的source code clone下來後推進source repositories

#create repogcloud source repos create hello-cloudbuild-app#git initgit remote add google "https://source.developers.google.com/p/YOUR_PROJECT_ID/r/hello-cloudbuild-app"git add .git commit -m "xx"git push google master:master

[2] Source Repositories

到專案內的source repositories裡面看有沒有推上去

[3] trigger Cloud Build

到console的 Cloud Build > Triggers去create一個trigger

設定如下

create trigger1

Event:你什麼時候要觸發trigger

Source:若是直接使用source repositories,就可以直接從下拉式選單選

若要用github,則點選Connect new repository去做設定

Branch:針對哪個branch去做trigger

create trigger2

location:這裏要填的是你要cloud build的yaml的位址

因此如果你的yaml的位置跟我一樣不是在根目錄下的

則寫出整個路徑

ex: 以我的repo為例,就應該要寫成 /CloudBuildNode/CloudBuild.yaml

[4] push to Container Registry

https://github.com/sasapan33/gcp-test/blob/master/CloudBuildNode/cloudbuild.yaml

yaml檔參數的詳細說明可以看這裡
https://cloud.google.com/cloud-build/docs/build-config

來解釋一下 CloudBuild.yaml

主要有五個步驟:

  • npm install : 若跟我的repo一樣,package.json不是在根目錄的,必須設定 dir 屬性告訴Cloud Build你的設定檔放在哪個目錄裡面。
  • npm build
  • docker build (docker file在repo裡面有)
  • docker push : 這裡直接用docker push是因為我接下來還要做kubectl set image,否則可以直接宣告 images 這個屬性就可以做docker push。
  • kubectl set image:這裡有用到一個 waitFor 的屬性,意思是上面四個steps都做完後,這個steps才要做。

這個yaml檔滿容易理解的

比較困難的是找出每個step裡面正確的 name 來讓指令正確的跑

且這裡的step其實只要是bash的指令 Cloud Build都可以吃進去

算是十分強大 但沒有很好上手

[5] kubectl set image

最後就是透過kubectl set image來強制kubernetes刷新image

(其實這step不用做)

但提醒一個,node有一個權限要打開喲(如下圖)

這個設定在 Kubernetes Engine > Clusters > 點進去的 Node pool

Security > Access scopesservice control 請改為 Enabled

這個設定要打開後,才吃得到kubectl set image的異動唷~

然後更新pod囉~~~

使用心得

其實Cloud Build算是滿強大的

看起來是只要有辦法用指令去做的,都有辦法幫你build或deploy

但是有 先天上的硬限制,就是他的trigger機制

Cloud Build的trigger目前看起來只有三種:

  • Github
  • Bitbucket
  • 當然還有自己家的Source Repositories

所以如果你是自己架Gitlab等等的其他種source code control工具

很抱歉你必須另外想辦法

名詞解釋

Cloud Build

這是對應AWS的Code Build+Code Deploy

原先以為只有Build的功能(因為他就叫Cloud Build咩)

後來實際上進去玩了之後發現他其實也有Deploy的功能

但很陽春,他只能用yaml或json檔控制

並沒有圖形化介面給你操作

Source Repository

GCP上的git,對應AWS的Code Commit

Container Registry

GCP上的docker hub,對應AWS的ECR Registry

以上為學習筆記,若有誤刊,或觀念不清楚的地方,請通知我!

謝謝

--

--

sasa :)
sasa :)

Written by sasa :)

目標是做一個讓所有人都聽得懂技術語言的transfer person

No responses yet