在上一篇,提到了 needs
參數,今天主要要討論的是 dependencies
這個參數,相較於 needs
可以不用等上一個關卡完成關聯的工作就開始執行,dependencies
則必須等待上一關卡完成後,關聯的工作才會開始執行。那,這相依參數,還有哪些特性呢?
在 GitLab CI 預設的流程中,當之前的關卡有產出工作成品 artifacts 時,則後續的工作會下載「之前所有關卡的工作們所產出的工作成品」,那麼,應該怎麼讓目前的工作,只下載到真正想要的工作成品呢?
在 .gitlab-ci.yml
的參數中,我們可以使用 dependencies
參數,來設定「真正需要相依的工作」,舉例來說:
default:
image: ubuntu:20.04
after_script:
- ls -al
build:osx:
stage: build
script:
- touch build_osx.txt
artifacts:
paths:
- build_osx.txt
build:linux:
stage: build
script:
- touch build_linux.txt
artifacts:
paths:
- build_linux.txt
test:osx:
stage: test
script:
- touch test_osx.txt
artifacts:
paths:
- test_osx.txt
dependencies:
- build:osx
test:linux:
stage: test
script:
- touch test_linux.txt
artifacts:
paths:
- test_linux.txt
dependencies:
- build:linux
deploy:
stage: deploy
script:
- echo 'deploy app'
上面的這個案例,總共有三個關卡計五個工作,其中 test
關卡中的工作均相依到 build
關卡中對應的工作,也在 test
關卡的工作裡,透過 dependencies
參數設定了相依,而在 deploy
關卡中,均沒有設置任何的相依性。根據執行結果:
deploy
的工作紀錄中,如前面所述,下載了之前所有關卡的所有工作產出物。test:osx
的工作紀錄中,執行的內容可以發現,其僅下載了設定 dependencies 關卡的工作產出物 build_osx.txt
。test:linux
的工作紀錄中,也可以看到如同 test:osx
一樣的結果,其僅下載了設定 dependencies 關卡的工作產出物 build_linux.txt
。當設定相依的工作沒執行成功,對於該工作會怎麼樣呢?這邊設計了一個小例子,修改自上面的範例,在 build:osx
結束的地方刻意的 exit 100
讓系統認為出錯,因此後續的工作 test:osx
設定了相依 build:osx
:
default:
image: ubuntu:20.04
after_script:
- ls -al
build:osx:
stage: build
script:
- touch build_osx.txt
- exit 100
artifacts:
paths:
- build_osx.txt
test:osx:
stage: test
script:
- touch test_osx.txt
artifacts:
paths:
- test_osx.txt
dependencies:
- build:osx
deploy:
stage: deploy
script:
- echo 'deploy app'
dependencies:
- test:linux
從上述案例的執行結果中,可以看到,對應的工作 test:osx
是呈現「skipped」的狀態,因為相依的工作執行失敗了,因此無法執行。
那麼,同樣的,如果如同最上面,每到關卡中有兩個工作,在 build
的關卡中的工作,一個成功,一個失敗,那會怎麼樣呢?(範例如此)
needs
呢?如 dependencies
的案例,透過 needs
修改為一個成功一個失敗(原始碼如此),那麼,因為 needs
設定,不管前一關卡是否全部通過,因此 linux
的工作會順利繼續進行,但到了 deploy
關卡,因此前一關卡 test
尚有一個工作無法完成,因此也連帶的無法跟著完成。
當使用 dependencies
參數時,其依然會根據上一關卡是否全數通過,才進行相依工作對應關卡的工作,因此,如果有需求是不管上一關卡工作是否全數通過,只要相依的工作完成了,就開始進行,那個,就應該選擇 needs
來使用。
我是墨嗓(陳佑竹),期待這系列的文章能夠讓人有些幫助。