上一篇介紹了整份 .gitlab-ci.yml
如果有大部分都通用的變數、條件,即可以透過 default
、variables
整理,而如果是整段的 script
想要整理可以怎麼作呢?
以往在 yaml 裡頭,有些內容不想完全移除,可以透過 #
號來停止該設定,而在 .gitlab-ci.yml
中,則可以直接在工作名稱最前端,加上一個 .
符號,即可停止這個工作。
如下,以往要停止整個工作會在整個工作最前頭加上 #
來表示:
#temp_job:
# script:
# - echo 'hide job'
而在 GitLab 8.6 之後,就可以透過在工作名稱前面加上 .
符號來隱藏該工作,如此流水線 (pipleline)在啟動時,就會直接的略過這個工作。也因此,在進行工作命名的時候,一定不要在工作名稱開頭的地方使用 .
符號因為這工作會因此不執行。
.temp_job:
script:
- echo 'hide job'
而,也因為在工作的開頭加上 .
符號可以隱藏工作,所以可以透過這特性,來建立所謂工作模板。
接下來的會透過 hide job 這個特性,搭配 .gitlab-ci.yml
的 anchors 語法,來建立工作的模板,讓可重複使用的內容可以整理在一起。
.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
上使用,template
的 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 翻譯後的結果為何。
接下來,會繼續談重複使用內容的其他語法,我是墨嗓(陳佑竹),期待這系列的文章能夠讓人有些幫助。