GitLab CI/CD YAML 在 13.x 版本的年代,如果要與團隊或甚至是 Open Source 讓社群都可以一起共享整個流水線的規劃,大概只能透過 include
的方法來達成。但對於使用端來說,很容易因為 YAML 提供者的版本變更,造成使用端發生問題,因此可以流水線有版本規劃的概念CI/CD components概念就此成形。
CI/CD Components 從 GitLab 16 開始實驗性質的開放,到 GitLab 17.0 版本後,列為正式版本,開發者可以透過 CI/CD Component 建立可以與社群共享的 CI/CD Catalog,並且在 Catalog 裡對於 Component 也提供版本發布的機制,對於使用者而言,只要在引用的時候,限定好要使用的版本範圍,基本就可以不太需要擔心大版本變更的問題。
談論 CI/CD Components 系列不容易在一篇的篇幅裡頭完成,因此,接下來這幾天將會談論關於 CI/CD Components 相關的議題。首先談談 inputs
,在過去,使用讓使用者以 include 的方法重複使用開發者提供的 CI/CD YAML 的時候,使用者需要透過手冊詳閱使用的流水線相關的參數及接受的規格,如果,讓使用者在引用之後,馬上就可以透過 YAML 上的「定義、規範」就可以知道是否正確引用,似乎會方便一些。因此 GitLab 17.0 開始正式地提供了 CI/CD inputs
的功能。
inputs
如何使用首先,以 GitLab 官方手冊 (CI/CD input examples) 中的第一個範例為基底做些微的調整。假設,目前系統提供一個很厲害的原始碼格式檢核工具「Super Linter」,它可以為多種原始碼做檢核,其使用的語法第一個參數是要監控的格式參數名稱為「linter」,第二個參數是需要做 linter 的路徑,參數名稱為「target-path」,假如要針對 data/yaml
這個路徑做 yaml 格式的檢查,我們可能會如執行指令:
./lint yaml --path=data/yaml
現在要把這樣的工具要以 inputs
包裝成一個可以反覆被使用,可以如下包裝。
my-super-linter.yml
檔案,內容如下(Source Code):spec:
inputs:
linter:
target-path:
---
"run-$[[ inputs.linter ]]-lint":
script:
- echo "lint $[[ inputs.linter ]] --path=$[[ inputs.target-path ]]"
.gitlab-ci.yml
中使用它,內容如下:default:
image: ubuntu:24.04
include:
- local: my-super-linter.yml
inputs:
linter: docs
target-path: "doc/"
- local: my-super-linter.yml
inputs:
linter: yaml
target-path: "data/yaml/"
在 GitLab 的 Pipeline 中建立了兩個 Job,分別為:run-docs-lint
、run-yaml-lint
。
以 run-yaml-lint
為例,其執行的主要內容如下:
$ echo "lint yaml --path=data/yaml/"
lint yaml --path=data/yaml/
在範例 my-super-linter.yml
檔案中,先定義了 inputs
需要有 linter
及 target-path
兩個參數,並且在 ---
底下,定義了使用這些參數的 Job
,可以發現,在 GitLab Components 下,連 Job 的名稱都可以使用 inputs
定義的參數作為命名。
在 .gitlab-ci.yml
檔案中,透過 include 的方式引入這個 component,並且宣告 linter
及 target-path
這兩個參數確切要使用的數值。
這邊可以透過 GitLab 的 Pipeline editor 來檢驗 inputs
提供的驗證檢核功能,如下,我在 linter
這個參數刻意輸入錯的參數名稱,在 GitLab CI/CD 做語法檢核時,馬上會顯示以下檢核失敗:
錯誤訊息如下:
This GitLab CI configuration is invalid: `my-super-linter.yml`: unknown input arguments: linterx, `linter` input: required value has not been provided.
輸入的未知的參數 linterx
且 inputs
定義需要的參數 linter
為提供數值。
GitLab Components 有很多執得深入討論的細節,但它有別於以往習慣的 .gitlab-ci.yml
的編輯習慣,因此今天先以初探的形式,淺嚐一下,接下來會帶入關於 inputs
更多細節的說明。我是墨嗓(陳佑竹),期待這次的內容能帶給你實用的啟發與幫助。