iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
0
DevOps

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

Day12 - GitLab CI 工作與工作間的關聯與互動?談工作相依 dependencies 參數

在上一篇,提到了 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工作紀錄中,如前面所述,下載了之前所有關卡的所有工作產出物。

插入 deploy 工作畫面

  • test:osx工作紀錄中,執行的內容可以發現,其僅下載了設定 dependencies 關卡的工作產出物 build_osx.txt

插入 test:osx 工作畫面

  • 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」的狀態,因為相依的工作執行失敗了,因此無法執行

插入單一個工作執行失敗導致後續的工作無法執行 03

那麼,同樣的,如果如同最上面,每到關卡中有兩個工作,在 build 的關卡中的工作,一個成功,一個失敗,那會怎麼樣呢?(範例如此)

插入單一個工作執行失敗導致後續關卡的工作都無法執行

同樣的案例,如果是使用 needs 呢?

dependencies 的案例,透過 needs 修改為一個成功一個失敗(原始碼如此),那麼,因為 needs 設定,不管前一關卡是否全部通過,因此 linux 的工作會順利繼續進行,但到了 deploy 關卡,因此前一關卡 test 尚有一個工作無法完成,因此也連帶的無法跟著完成。

插入使用 needs 的執行結果

結論

當使用 dependencies 參數時,其依然會根據上一關卡是否全數通過,才進行相依工作對應關卡的工作,因此,如果有需求是不管上一關卡工作是否全數通過,只要相依的工作完成了,就開始進行,那個,就應該選擇 needs 來使用。

我是墨嗓(陳佑竹),期待這系列的文章能夠讓人有些幫助。


上一篇
Day11 - GitLab CI 工作與工作間的關聯與互動?談有向無環圖與 needs 參數
下一篇
Day13 - GitLab CI 流水線工作中重複的變數,可以怎麼統一?談 default、inherit
系列文
用 GitLab CI 玩轉自動化測試與佈署31

尚未有邦友留言

立即登入留言