iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
DevOps

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

Day14 - GitLab CI 流水線工作中重複的內容,可以怎麼整理利用?談 hide job、anchor

上一篇介紹了整份 .gitlab-ci.yml 如果有大部分都通用的變數、條件,即可以透過 defaultvariables 整理,而如果是整段的 script 想要整理可以怎麼作呢?

在 GitLab CI 中的隱藏工作談 Hide Job

以往在 yaml 裡頭,有些內容不想完全移除,可以透過 # 號來停止該設定,而在 .gitlab-ci.yml 中,則可以直接在工作名稱最前端,加上一個 . 符號,即可停止這個工作。

如下,以往要停止整個工作會在整個工作最前頭加上 # 來表示:

#temp_job:
#  script:
#    - echo 'hide job'

而在 GitLab 8.6 之後,就可以透過在工作名稱前面加上 . 符號來隱藏該工作,如此流水線 (pipleline)在啟動時,就會直接的略過這個工作。也因此,在進行工作命名的時候,一定不要在工作名稱開頭的地方使用 . 符號因為這工作會因此不執行。

.temp_job:
  script:
    - echo 'hide job'

而,也因為在工作的開頭加上 . 符號可以隱藏工作,所以可以透過這特性,來建立所謂工作模板。

透過 Anchor 來建立樣板 Script

接下來的會透過 hide job 這個特性,搭配 .gitlab-ci.ymlanchors 語法,來建立工作的模板,讓可重複使用的內容可以整理在一起。

.template: &tmpl_script
  - echo 'template echo'

job_name:
  script:
    - *tmpl_script
    - echo 'this is the script'

如上就是一個基礎的 ahchors 的語法範例,其經過 GitLab CI 的過程解析之後,可以得到如下的實際上執行的流水線內容:

job_name:
  script:
    - echo 'template echo'
    - echo 'this is the script'

從這個範例可以得知,可以透過 & 符號搭配一個名稱來為預計成為樣版的原始碼區段命名,而可以利用 * 加上剛定義的名稱來做引用。且在 script 上使用,templatescript 內容,會與引用它的 script 合併在一起。

如果除了 Script 的內容外,整個工作都想引用可以怎麼做?

如果是針對更完整的區段作引用,則必須再搭配 << 符號。舉例來說:

.build_template: &build_template
  image: ubuntu:20.04
  stage: build

build_v01:
  <<: *build_template
  script:
    - echo 'build 01'

build_v02:
  <<: *build_template
  script:
    - echo 'build 02'

上面這個案例,透過 GitLab CI 翻譯後,實際上執行的內容會是:

build_v01:
  image: ubuntu:20.04
  stage: build
  script:
    - echo 'build 01'

build_v02:
  image: ubuntu:20.04
  stage: build
  script:
    - echo 'build 02'

在這邊 << 符號,可以想像成,要把樣板的內容「引入」到什麼位置上。

一個工作可以引入多個樣板嗎?

答案是可以的,但要特別注意,後面引用的 template 會覆寫前面重複的內容。

.template_part1: &template_part1
  image: ubuntu:20.04
  stage: build
  script:
    - echo 'echo from template_part1 on script'
  before_script:
    - echo 'echo from template_part1 on before_script'

.template_part2: &template_part2
  after_script:
    - echo 'echo from template_part2 on after_script'
  script:
    - echo 'echo from template_part2 on script'

build_v01:
  <<: *template_part1
  <<: *template_part2
  script:
    - echo 'echo from build_v01'

如上的這個範例,GitLab CI 最終會翻譯為:

build_v01:
  image: ubuntu:20.04
  stage: build
  before_script:
    - echo 'echo from template_part1 on before_script'
  script:
    - echo 'echo from build_v01'
  after_script:
    - echo 'echo from template_part2 on after_script'

可以看到,在最終的 script 的部分印出的是 echo from build_v01

引入最終印出的結果

總結:

anchors 的語法使用上,必須要特別注意,如果是一整個工作包含一到多個內容時要作為樣板來源時,引用則必須搭配 <<:* 兩個符號來引用,反之,如果只是一個如 script 的一部分時,就可以直接使用 * 來引用。另外也要特別注意後宣告的內容會覆蓋前面的內容的這個特性。如果想要知道最後引用的結果是什麼,則可以透過 GitLab 提供的 CI Lint 工具作語法的確認,可以從上面知道透過 GitLab 翻譯後的結果為何。

接下來,會繼續談重複使用內容的其他語法,我是墨嗓(陳佑竹),期待這系列的文章能夠讓人有些幫助。


上一篇
Day13 - GitLab CI 流水線工作中重複的變數,可以怎麼統一?談 default、inherit
下一篇
Day15 - GitLab CI 如何整理流水線工作中重複的內容?談 extends 語法
系列文
用 GitLab CI 玩轉自動化測試與佈署31

尚未有邦友留言

立即登入留言