iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0

在 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> ]]

目前使用上有以下三點特性:

  1. 目前只支援 GitLab 預定義的取值函式(predefined interpolation functions)。
  2. 在一個取值區段中,目前最多只能使用三個取值函式。
  3. 函式的執行,是依序執行的,由左而右執行。

目前官方支援哪些取值函式呢?

truncate 取特定區段

truncate 主要就是用來取得字串的特定範圍區段,其使用的語法如下:

  • truncate(<offset>,<length>)
    • offset: 開始取值得位置,由 0 開始計算
    • length: 從 offset 開始計算,總取值的長度
$[[ inputs.test | truncate(3,5) ]]

如上面這個範例,假設輸入 test 的數值為 0123456789,這邊最終會得到 34567

透過 expand_vars 來拓展 variablesinputs 中的使用

expand_vars 可以搭配 variablesinputs 的使用更有彈性,這邊直接舉一個簡單的 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 預設支援的函式,僅有 truncateexpand_vars 兩個,目前還不是非常豐富,雖然相關的功能也可以自行在 script 中透過自己的方法實作,但是如果搭配取值區段及取值函式的應用,則可以讓開發者更專注在使用傳入的變數,而減少手動變數的操作,是一個可以思考一下,要不要納入到自己的 CI/CD YAML 中使用的方法。我是墨嗓(陳佑竹),期待這次的內容能帶給你實用的啟發與幫助。

參考範例

參考連結


上一篇
Day05 - 深入 CI/CD Components 的 inputs
下一篇
Day07 - 初探 GitLab CI/CD Components
系列文
GitLab CI 2025:深入玩轉流水線與實戰紀錄11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言