iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
DevOps

用 GitLab CI 玩轉自動化測試與佈署系列 第 5

Day05 - GitLab CI 怎麼從外帶入參數到流水線中?談 GitLab 的變數 variable

在之前的幾天,談了怎麼設計 GitLab 的 Pipeline 流程,也談了如何建立各個工作的預設參數,那可以讓某些參數可以透過外部傳入到 Pipeline 裡頭,讓各個工作們使用嗎?

GitLab CI 變數的基本使用

在一般在 Script 的操作過程中,可能會有一些字串的組裝,會希望重複的部分變成一個變數供 Script 的過程中都可以使用,例如底下的範例,希望 Hello 後直接接各種字串,如果要把 Hello 改成 Hi 也只需要改動 PREFIX_VAR 這個變數的內容即可。

job_name:
  script:
    - PREFIX_VAR='Hello'
    - echo "${PREFIX_VAR} GitLab-CI"
    - echo "${PREFIX_VAR} GitLab-Runner"

但,如果在 after_script 段落的內容也要使用同一個變數,就會發現這個在 script 段落定義的變數,無法使用,如底下的 .gitlab-ci.yml執行結果

stages:
  - Verify
  - Package
  - Release

default:
  image: centos:7

Verify:CodeQuality:
  stage: Verify
  script:
    - PREFIX_VAR='Hello'
    - echo "${PREFIX_VAR} GitLab-CI"
    - echo "${PREFIX_VAR} GitLab-Runner"
  after_script:
    - echo "${PREFIX_VAR} After_Script"

可以看到如下圖的結果,原訂希望輸出 Hello After_Script 的地方,只輸出了  After_Script ,這時候該怎麼解決呢?

執行結果重點提示

在 GitLab CI 的過程中,可以透過 variables: 這個區段來定義一個工作中 before_scriptscriptafter_script 三個區段都可以使用的變數,如上面這個例子,僅需要把宣告 PREFIX_VAR 的地方改到 variables 的區段即可,如下。

stages:
  - Verify
  - Package
  - Release

default:
  image: centos:7

Verify:CodeQuality:
  stage: Verify
  variables:
    PREFIX_VAR: 'Hello'
  script:
    - echo "${PREFIX_VAR} GitLab-CI"
    - echo "${PREFIX_VAR} GitLab-Runner"
  after_script:
    - echo "${PREFIX_VAR} After_Script"

可以看到執行結果,如下圖:

執行結果重點提示

如何在 Pipeline 開始運作前就定義好變數

透過上面的方法,在 GitLab CI 的工作中,就可以透過 variables 區段來宣告及定義了,那如果變數需要從外界傳入呢?

在 GitLab CI 的環境中,對於已經建立 .gitlab-ci.yml 的 Repo,可以透過 GitLab 提供的三種方法直接執行當下 Git Repo 已經定義好的 .gitlab-ci.yml 的工作並且「設定」變數:

  1. 透過 GitLab API Trigger,如Trigger variables
  2. 透過定義固定排程,如scheduled pipeline variables
  3. 手動執行 Pipeline 如manual pipeline run variables
    在這邊僅 Demo 如何手動執行工作流程。在 GitLab CI/CD Pipelines 的介面右上角,有一個「Run Pipeline」的按鈕,此即為手動執行工作流程流水線的入口。

手動執行 Pipeline 流水線入口畫面

在介面中,可以看到設定變數,在這邊 GIT Repo 中已經存在的 .gitlib-ci.yml 內容同上,我們可以設定變數 PREFIX_VAR,將之改為 Hi,而後點選 「Run Pipeline」。

手動執行 Pipeline 流水線入口畫面

接著可以看到最終的執行結果原本 Hello 的部分已經改為 Hi

手動執行 Pipeline 流水線執行畫面

系統預設的環境變數 Predefined environment variables

GitLab 裡頭除了自己定義變數外,有沒有什麼系統預設提供的變數可以使用呢?答案是有的,而且還蠻多的,GitLab 目前提供的預設環境變數可以參考這邊。這邊舉幾個我個人比較常使用的變數:

  • CI_COMMIT_REF_NAME:工作目前取得的 Git Repo 所在的 Tag 或 Branch 名稱
  • CI_COMMIT_REF_SLUG:如上,但透過方法將名稱精簡至最長63個字元並調整為小寫等,使可用在 URL 使用或主機名稱使用
  • CI_COMMIT_SHA:Git Repo 目前所在的 Commit Hash Code
  • CI_COMMIT_SHORT_SHA:Git Repo 目前所在的 Commit Hash Code 的前 8 字元

如何進行變數的驗證與除錯

在使用系統預設變數或自行設定的變數時,可能因為變數在系統運作的過程,或操作的過程有部分修改而導致變數內容不如預期,GitLab 在這部分提供了 CI_DEBUG_TRACE 變數供除錯使用,其可以如下,在 .gitlab-ci.yml 如下設定,或直接在 trigger及手動執行等過程中設定。

job_name:
  variables:
    CI_DEBUG_TRACE: "true"

如下圖,在手動執行 Pipeline 的過程設定了 CI_DEBUG_TRACEtrue,並且設定了 PREFIX_VARHi,那執行的過程中,就可以看到變數 PREFIX_VAR 從原本的 Hello 改變為 Hi

插入執行結果 06

執行結果如下,細節如連結

執行結果

總結

今天的文章提到了:

  • 設定變數時,如需要讓變數可以在整個工作(Job)都可以使用,可以使用 variables 區段來設定共用的變數。
  • 變數除了從 .gitlab-ci.yml 設定外,還可以從外部傳入。
  • GitLab 提供了一些系統預設的「Predefined environment variables」。
  • 除錯可以透過設置 CI_DEBUG_TRACE 來進行除錯。

接下來,將繼續談變數,要談關於變數的優先權以及更多層級的變數關係。我是墨嗓(陳佑竹),期待這系列的文章能夠讓人有些幫助。


上一篇
Day04 - GitLab CI 設計出自己的工作流程 - 流水線分析建立 .gitlab-ci.yml 概述
下一篇
Day06 - GitLab CI 變數還可以怎麼定義?再談 GitLab 各層級變數
系列文
用 GitLab CI 玩轉自動化測試與佈署31

尚未有邦友留言

立即登入留言