iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0

在上一篇中談到關於 GitLab 的 CI/CD Components 及一些 inputs 的初步體驗,在今天的內容,我們會談到更多關於使用 inputs 的細節。

首先,在初探 inputs 之後,可能會對於 inputsvariables 有什麼樣的差異有所疑問?在 GitLab 手冊中有提到關於 inputsvariables 的比較,這邊基於原始文字作部分調整,並以表格呈現。

Inputs CI/CD Variables
Purpose 目的 為讓 CI/CD 可客製化重複使用而生。在 CI 配置(Template、Component 或 .gitlab-ci.yml)中定義可在觸發 pipeline 時賦值的參數。 使用在環境變數,在 job 執行期間或 pipeline 過程中用來傳遞資料給不同 job 或 Script 中使用。
Modification 什麼時候賦值、及修改數值 在 pipeline 初始化階段傳入,一旦賦值後在整個 pipeline 執行期間固定不變。 可以在 pipeline 執行過程中被動態產生/修改,例如透過 dotenv artifacts、條件 rules,或在 job script 中修改。
Scope 作用範圍 僅在定義它的那個配置檔案中有效(無論是 .gitlab-ci.yml 或被 include 的檔案)。可以透過 include:inputstrigger:inputs 遞到其他檔案或子 pipeline pipeline。 可以在多種層級上定義:全域 (整個 project)、job 層級、以及在專案設定或群組中透過 UI 定義。
Validation 驗證 提供較強的內建驗證機制:型別 (type)、正則 (regex)、預定義選項列表 (options)、description 等。 pipeline 建立時就會進行這些檢查。 驗證比較簡單,多是 key-value 配對;可以透過 UI 為專案變數設定保護 / 隱藏 / 遮蔽等,但變數在執行時動態性強,較少在 pipeline manifest 階段做嚴格型別/options 檢查。

從表格中可以看到,inputs 就是為了讓 CI/CD 可以重複使用而生,讓開發者可以透過 inputs 把 CI/CD 的「輸入規格」定義好,避免使用者因為不熟悉規格而誤用。而 variables 還是有存在的意義,方便在工作間傳遞或變更,只是對於設計給使用者輸入參數的 Pipeline 而言,會更建議改用 inputs

如何使用

1. 在 Pipeline 怎麼直接使用 inputs 呢?

這邊以 Day04的例子調整,改為直接在 Pipeline 中宣告,首先,在 .gitlab-ci.yml 的「header」區域做宣告,GitLab CI/CD 中的 header 區段是從 GitLab 15.11 版開始支援的,主要就是為了定義好 Pipeline 的「規格」,因此 inputs 前面需要有一個 spce,header 的區段與其他內容,則以 --- 作為區隔。整個範例修改後如下:

spec:
  inputs:
    linter:
      default: "yaml"
    target-path:
      default: './'
---
default:
  image: ubuntu:24.04

"run-$[[ inputs.linter ]]-lint":
  script: 
    - echo "lint $[[ inputs.linter ]] --path=$[[ inputs.target-path ]]"

--- 區段之後,使用的方法就跟以往寫 GitLab CI/CD 的方法一樣。引用 inputs 的方法也跟 Day04 中提到的方法一致。唯一不一樣的地方在於,在 inputs 裡定義的參數,都增加了 default 的宣告,這是必要,因為 Pipeline 可以透過各種方式觸發,如果沒有設置預設值,會造成底下使用 inputs 無法決定參數而無法執行,因此 GitLab 官方定義,在 Pipeline 中直接使用 inputs必須 定義預設值 default

2. 有使用 inputs 定義的輸入參數的 Pipeline,當需要手動觸發時:

實際於 Pipeline 準備觸發的畫面

從圖上可以看到,因為使用 inputs 定義了兩個參數linter 及 target-path,所以在畫面中 inputs 的區域,顯示了這兩個參數,並且後方對應顯示了這兩個參數應輸入的參數型別,以畫面上兩個參數來說,預設為 STRING。這邊也把預設值直接帶入。

另外如果想沿用預設值,不額外輸入,則可以選擇右上角的下拉選單,把不想額外設定的參數移除。

畫面上也有一個「Preview inputs」 的按鈕,點入後,會呈現目前輸入的數值,與預設值的差異。

畫面中呈現出目前輸入的數值與預設值的比較差異

inputs 的細部規格

  • spec:inputs 中,如果inputs 沒有設定預設值,則使用這個 component 的使用者,就一定要為這個參數設置對應的數值或預設值。如在 .gitlab-ci.yml 中直接定義 inputs 就必須要設置 default
  • inputsvariables 除了 default 參數,外,還有其它相同的參數,如:descriptionoptions 。使用方法跟注意事項也是一樣的。
  • inputs 支援的型別,可以使用參數 type 來定義,目前支援 array、boolean、number 及預設的 string,四種型別。
  • 可以使用正規表示式 regex 來更明確的定義輸入的參數的形式,例如,如果需要輸入版本號,則可以如以下範例定義這個 inputs
spec:
  inputs:
    version:
      regex: ^v\d\.\d+(\.\d+)?$
      default: v1.0
---
default:
  image: ubuntu:24.04

default-job:
  script: 
    - echo "Your version is $[[ inputs.version ]]"
  • 當透過 regex 定義參數格式後,在手動觸發時,如使用者未輸入定義的格式時,就會出現警告,並告知應符合的正規表示式。

使用正規表示式當輸入錯誤格式時的畫面

總結

在今天的內容中,更深入了解 GitLab CI/CD 中 inputs 的應用,並與傳統的 variables 進行比較。透過 inputs,開發者可以在 Pipeline 中定義更明確的輸入規格,並提供型別、選項及驗證機制,避免使用者因不熟悉設定而輸入錯誤。相較於 variables,inputs 更適合設計給使用者操作的 Pipeline,因為其值在初始化時即固定,並具備更完善的驗證能力。
不過目前 GitLab CI/CD 為 inputs 提供的驗證方法不止有 regex,還可以透過 function 來進行檢驗,這部分將在明天的內容中呈現。我是墨嗓(陳佑竹),期待這次的內容能帶給你實用的啟發與幫助。

參考範例

參考連結


上一篇
Day04 - 初探 CI/CD Components 及其 inputs
下一篇
Day06 - 用 GitLab 取值函式 操縱 input 的輸入值
系列文
GitLab CI 2025:深入玩轉流水線與實戰紀錄11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言