iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
1
DevOps

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

Day13 - GitLab CI 流水線工作中重複的變數,可以怎麼統一?談 default、inherit

之前的內容,主要針對 GitLab CI 的基本語法做描述,接下來的內容則主要會針對整理 .gitlab-ci.yml 的內容作討論。今天主要要談的就是變數怎麼整理。

在之前 Day05 的章節曾經提過關於變數的使用,也有稍微提到 default 這個可以設定預設關卡內容的應用,供流水線上所有工作使用。那麼它有哪些限制呢?

全域預設值 global default

在整理 .gitlab-ci.yml 的時候,如果有發現絕大部分的工作都有固定的行為時,就可以考慮把這些工作或這些動作放置到 default 預設工作的內容裡頭,而預設工作中,目前支援底下的幾個參數:

舉例來說,如果大部分的流水線使用的 docker image 都是固定的,那麼就可以在 default 內把 image 設定成該 image。而如果其中一個工作並非使用該預設的 image 那麼,也只需要在工作裡頭重新宣告一次 image 就可以將 default 的設定值覆寫。

default:
  image: ubuntu:20.04

default_test:
  stage: test
  script:
    - echo 'test default on ubuntu'

centos_test:
  stage: test
  image: centos:7
  script:
    - echo 'test on centos'

如上面的範例,其中 default_test 這個工作,因為預設值設定了 image 的關係,期使用的 docker image 就是 ubuntu:20.04,而 centos_test 這個工作,因為重新宣告 image 為 centos:7 因此使用的就會覆寫 default,改變為 centos:7

另外,如果想使用建立全流水線的變數預設值,也可以直接在 .gitlab-ci.yml 設定,如底下的例子:

variables:
  BUILD_OS: 'ubuntu'
  BUILD_VER: 'v1.0'

job:
  script:
    - echo "build ${BUILD_VER} on ${BUILD_OS}"

job 中,其變數就會取得 v1.0ubuntu

如果想要部分使用,部分不使用呢?

在 GitLab 12.9 之後,增加了新的設定方法 inherit 這參數主要就是在解決部分這種想繼承,但又不想全部繼承的情境。

inherit 這個參數中,可以針對 defaultvariables 兩種 global 參數作繼承與否的選擇。

inherit 參數底下,可以針對 defaultvariables 設定 true 或 false,如:

job:
  inherit:
    default: true
    variables: true

job:
  inherit:
    default: false
    variables: false

也可以只選擇想要的參數,其可以使用 YAML 的陣列語法,如:

job:
  inherit:
    default: [image, before_script]
    variables: [variable1, variable2]

job:
  inherit:
    default:
      - image
      - before_script
    variables:
      - variable1
      - variable2

接下來針對 inherit 的這些參數做一些範例實驗:

default:
  image: 'ubuntu:20.04'
  before_script:
    - echo 'echo by default'

variables:
  BUILD_OS: 'ubuntu'
  BUILD_VER: 'v1.0'

all_default:
  script:
    - echo "build ${BUILD_VER} on ${BUILD_OS}"

all_setfalse:
  inherit:
    default: false
    variables: false
  script:
    - echo "build ${BUILD_VER} on ${BUILD_OS}"

default_setone_variables_setone:
  inherit:
    default: [image]
    variables: [BUILD_OS]
  script:
    - echo "build ${BUILD_VER} on ${BUILD_OS}"

default_ontset_variables_setfalse:
  inherit:
    variables: false
  script:
    - echo "build ${BUILD_VER} on ${BUILD_OS}"

default_settrue_variables_one:
  inherit:
    default: true
    variables: [BUILD_OS]
  script:
    - echo "build ${BUILD_VER} on ${BUILD_OS}"

在上面這個範例中 default 設定了 imagebefore_script 兩個參數,如工作中沒有使用到繼承,以 image 來說,會取到 runner 本身的預設值,而 before_script 則預設為空。variables 則預設為沒有該變數值。細節執行結果可以查看這邊

因此在第一個工作執行結果中,因為無論有沒有設定 inherit 都是預計繼承的,因此 all_default 這個工作,引用了 defaultvariables 兩個參數內的設定值。使用了 ubuntu:20.04 這個 image,透過 before_script 印出了預設印出的內容,也順利在 script 中印出參數。

第二個工作 all_setfalse,因為全數設定為 false,因此從執行結果中可以看到使用了 gitlab 官方預設的 image ruby:2.5 沒能印出 before_script 中的內容,且 script 的兩個變數都沒印出。

第三個工作 default_setone_variables_setone 都僅取一個參數,因此從執行結果中可以看到:維持使用 default 中設定的 image ubuntu:20.04,但沒有 before_script 的輸出,script 的輸出也僅印出 BUILD_OS 的數值。

第四個工作 default_no_set_variables_setfalse執行結果可以看到:引用了 default 中的所有參數,但 variables 的部分在 script 中都沒有印出來,因為其設定了 false

最後,第五個工作 default_settrue_variables_one執行結果可以看到:使用了 default 中的所有參數,而 variables 僅取 BUILD_OS 因此 script 中僅印出了 ubuntu 字樣。

總結:

從上面的實驗中可以看到,無論是 default 或者是 variables 兩者在工作中預設都是 true 預設繼承的。而 inherit 參數,可以選擇需要的預設值,因此解決了某些狀況下有預設值的困擾。

這是關於參數預設值的使用,接下來將繼續介紹關於內容的重複利用。我是墨嗓(陳佑竹),期待這系列的文章能夠讓人有些幫助。


上一篇
Day12 - GitLab CI 工作與工作間的關聯與互動?談工作相依 dependencies 參數
下一篇
Day14 - GitLab CI 流水線工作中重複的內容,可以怎麼整理利用?談 hide job、anchor
系列文
用 GitLab CI 玩轉自動化測試與佈署31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言