前面幾天我們介紹了 Auto DevOps 的 CI/CD Pipeline 其中的每個 Stage,但就如其名這些 Stage 都是 Auto 自動產生的,萬一它自動產生的 CI/CD Pipeline 不是我們想要的模樣時,該怎麼辦才好?
對此,GitLab 也有提出客製化的空間,我們是可以根據 Auto DevOps 的 CI/CD Pipeline 進行自己想要的客製微調。
其實 Auto DevOps 的 CI/CD Pipeline 也是根據一個特定的 .gitlab-ci.yml 而產生的,官方有將這個 Auto-DevOps.gitlab-ci.yml 公開,檔案存放在 GitLab 官方的 Project 內。

如上圖,可以看見這個 .gitlab-ci.yml 使用了 include:,因此如果要查看詳細每一個 CI Job 做了哪些事情,還要更進一步開啟上圖 template: 後方的每個網址。

有了這些詳細資料,我們就能夠客製化自己 CI/CD Pipeline 了。說是客製化,其實也就是回歸 GitLab CI 原本的做法,我們要在 Project 根目錄下新增 .gitlab-ci.yml,而檔案內容則是以上面的 Auto-DevOps.gitlab-ci.yml 為基礎,再做出我們想要的修改。
當 project 的根目錄有 .gitlab-ci.yml 檔案時,GitLab CI 會優先根據檔案內容來產生 CI/CD Pipeline。因此我們先來做一個簡單的實驗,複製 Auto-DevOps.gitlab-ci.yml 的內容,並建立一個 .gitlab-ci.yml 但只留下 Stage: build,看看我們的 CI/CD Pipeline 會變成什麼模樣。
image: alpine:latest
variables:
POSTGRES_USER: user
POSTGRES_PASSWORD: testing-password
POSTGRES_ENABLED: "true"
POSTGRES_DB: $CI_ENVIRONMENT_SLUG
POSTGRES_VERSION: 9.6.2
DOCKER_DRIVER: overlay2
ROLLOUT_RESOURCE_TYPE: deployment
DOCKER_TLS_CERTDIR: ""
stages:
- build
include:
- template: Jobs/Build.gitlab-ci.yml
結果如我們預期的,真的只剩下 Stage: Build。
接著第二個實驗,我們要取代 build 這個 CI Job 的內容。這裡我們一樣可以利用 include:,先將我們想要的 build 執行的動作建立成一個範本,再透過 include: 引用。
include: 接受的檔案來源有很多種,包含 local、remote、template 與 file,這邊我們就用 local 的方式來存放我們的範本。
首先在 Project 內新增一個 Build.gitlab-ci.yml,裡面放上一段裝傻的內容。
接著要修改 .gitlab-ci.yml。
image: alpine:latest
variables:
POSTGRES_USER: user
POSTGRES_PASSWORD: testing-password
POSTGRES_ENABLED: "true"
POSTGRES_DB: $CI_ENVIRONMENT_SLUG
POSTGRES_VERSION: 9.6.2
DOCKER_DRIVER: overlay2
ROLLOUT_RESOURCE_TYPE: deployment
DOCKER_TLS_CERTDIR: ""
stages:
- build
include:
- local: 'Build.gitlab-ci.yml'
結果,還真的成功了,build 被替換成我們改寫後的動作。

有了上面的基礎,基本上 CI/CD Pipeline 已經是隨便你改了,能客製到何種程度,就看個人的功力了。
從今天的分享我們得知 Auto DevOps 其實一點也不神奇,說穿了它依舊是原本的 GitLab CI,仰賴於某個 .gitlab-ci.yml,只不過是 GitLab 官方作出了一個可以自動因應各種常見狀況的 template。
但我們也可以反過來思考,官方維護的這一份 Auto-DevOps.gitlab-ci.yml 與 templates 其實是非常有參考價值的,如果你決定要大力擁抱 GitLab CI 作為你團隊的 CI Service,那麼它正是一份有著一定複雜度的 CI/CD Pipeline 範本,值得詳閱學習。
Auto DevOps 的內容到今天為止就算是告一個段落,鐵人賽還剩下兩天,最後我們會分享 GitLab Workflow 的最後一關 Feedback。鐵人賽,我們明天見~
自 2021 年 12 月 12 日開始,我就一直想要將原發佈在 iT 邦幫忙的鐵人賽系列文章搬移至 https://gitlab-book.tw 並補充說明文章內容已有過期之處。
因為當初參加 iThome 鐵人賽時,GitLab 仍在 12 版,但如今 GitLab 已更新好幾版了,需要提醒大家注意一下。
本文已完成搬遷