在 Day05 的時候提到,使用 inputs
可以透過正規表示式 regex
來規範使用者輸入的內容需要符合正規表示式的定義,另外,在 inputs
裡頭,還額外提供一個方式,讓開發者可以「操縱」傳入的數值,所謂的操縱,像是只取傳入字串的某個區段或跟之前 variables
使用 expand
功能。
假設,目前建立了一個參數,在使用者輸入參數後,只想取字串的特定範圍來使用,例如:使用者輸入台灣的身分證字號,GitLab 得到身分證字號後,在 GitLab Pipeline 中只取數字的部分使用,在 GitLab CI/CD YAML 中,可以怎麼實作呢?
spec:
inputs:
id_number:
regex: ^[A-Z][12]\d{8}$
default: A123456789
---
default:
image: ubuntu:24.04
demo-job:
script:
- echo "Your id is $[[ inputs.id_number ]]"
- echo "Your id number part is $[[ inputs.id_number | truncate(1,9) ]]"
這邊可以在 Pipeline 執行後看到以下結果:
$ echo "Your id is A123456789"
Your id is A123456789
$ echo "Your id number part is 123456789"
Your id number part is 123456789
可以看到 echo 的第二行,輸出呈現 Your id number part is 123456789
,身分證字號的部分,只取數字的部分。其中除了使用 inputs
搭配正規表示式 regex
限制身分證格式以外,最重要的部分是以下這段:
$[[ inputs.id_number | truncate(1,9) ]]
這就是只取特定範圍的關鍵。在這邊延伸自原本 inputs
的取值方法,在 [[]]
的中間增加了 |
及後面的 truncate
function。透過這樣的組合,開發者可以操縱使用者輸入的數值。
在上面的範例中,以往取值的方法有兩組中括弧組成 [[]]
我們叫他取值區段(interpolation block),在取值得區段中官方定義,他可以透過 |
搭配 function 來多層次的「過濾」出開發者要的數值。其格式如下:
$[[ input.input-id | <function1> | <function2> | ... <functionN> ]]
目前使用上有以下三點特性:
truncate
取特定區段truncate
主要就是用來取得字串的特定範圍區段,其使用的語法如下:
truncate(<offset>,<length>)
offset
: 開始取值得位置,由 0 開始計算length
: 從 offset 開始計算,總取值的長度$[[ inputs.test | truncate(3,5) ]]
如上面這個範例,假設輸入 test
的數值為 0123456789
,這邊最終會得到 34567
。
expand_vars
來拓展 variables
在 inputs
中的使用expand_vars
可以搭配 variables
讓 inputs
的使用更有彈性,這邊直接舉一個簡單的 Pipeline 範例做說明:
spec:
inputs:
commit_branch:
default: 'branch is $CI_COMMIT_BRANCH'
---
default:
image: ubuntu:24.04
demo_jog:
script:
- echo '1. $[[ inputs.commit_branch ]]'
- echo '2. $[[ inputs.commit_branch | expand_vars ]]'
- echo '---------------'
- echo "3. $[[ inputs.commit_branch ]]"
- echo "4. $[[ inputs.commit_branch | expand_vars ]]"
可以在 Pipeline 執行後看到以下結果
$ echo '1. branch is $CI_COMMIT_BRANCH'
1. branch is $CI_COMMIT_BRANCH
$ echo '2. branch is day06_02_inputs_expand_vars'
2. branch is day06_02_inputs_expand_vars
$ echo '---------------'
---------------
$ echo "3. branch is $CI_COMMIT_BRANCH"
3. branch is day06_02_inputs_expand_vars
$ echo "4. branch is day06_02_inputs_expand_vars"
4. branch is day06_02_inputs_expand_vars
在範例中,定義了 inputs
參數名稱 commit_branch
,其預設值使用'branch is $CI_COMMIT_BRANCH'
,搭配了 GitLab 的預載變數$CI_COMMIT_BRANCH
,這個變數,主要用來記錄當前 Pipeline 對應的 Git commit,其所在的分支名稱,以目前的範例來說,其對應的是 day06_02_inputs_expand_vars
分支。
並且在 script
總共有四個 echo
輸出的區段,第1及2,使用單引號'
,第 3 及 4 則使用雙引號"
,輸出的結果中,2, 3, 4 三個是相同的。
但從 script 中 1. 的輸出可以看到,其原始內容是:1. branch is $CI_COMMIT_BRANCH
,並不把變數轉換成其代表的數值。而 2. 搭配 expand_vars
後,同樣的輸出方法,就已經可以看到原始內容已經是 $CI_COMMIT_BRANCH
預載變數本身的數值 day06_02_inputs_expand_vars
,其透過 expand_vars
將變數轉化了。
而第 3, 4 的範例中,都使用雙引號"
但卻無法呈現出這樣的效果,是因為使用 "
看到 $
字號,會協助把變數直接轉換,因此無法看到 expand_vars
的效果,這部分也是使用上需要特別注意的地方。
目前 GitLab 預設支援的函式,僅有 truncate
及 expand_vars
兩個,目前還不是非常豐富,雖然相關的功能也可以自行在 script 中透過自己的方法實作,但是如果搭配取值區段及取值函式的應用,則可以讓開發者更專注在使用傳入的變數,而減少手動變數的操作,是一個可以思考一下,要不要納入到自己的 CI/CD YAML 中使用的方法。我是墨嗓(陳佑竹),期待這次的內容能帶給你實用的啟發與幫助。