2021年11月25日木曜日

Gitlab CI でジョブが失敗したときに別のジョブを呼び出す方法

Gitlab CI でジョブが失敗したときに別のジョブを呼び出す方法

概要

when: on_failure を使います
ジョブごとに失敗した場合の挙動を指定したい場合は needs と組み合わせます

環境

  • RaspberryPi4 8GRAM
  • RaspberryPiOS 5.10.17 armv7l
  • Gitlab Runner 14.5.0

サンプル .gitlab-ci.yml

cleanup_build_job が何かしらのジョブが失敗した場合にコールされるジョブになります
when: on_failure が指定されていることがわかります

stages:
  - stage1
  - cleanup

.echo1_script: &echo1_script
  - "export MSG=hello"
  - "echo ${MSG} >> msg.txt"
  - "export MSG=HELLO"

.echo2_script: &echo2_script
  - "hoge"
  - "echo ${MSG} >> msg.txt"

cleanup_build_job:
  stage: cleanup
  script:
    - "echo 'Succeed cleanup.' >> msg.txt"
  when: on_failure
  artifacts:
    paths:
      - msg.txt

echo:
  stage: stage1
  script:
    - *echo1_script
    - *echo2_script
  artifacts:
    paths:
      - msg.txt

ジョブごとに失敗した場合の挙動を設定する場合

needs と組み合わせます
これを失敗した場合に実行するジョブごとに指定してあげることでそれぞれで失敗した場合の挙動を変えることができます

stages:
  - stage1
  - stage2
  - cleanup

.echo1_script: &echo1_script
  - "export MSG=hello"
  - "echo ${MSG} >> msg.txt"
  - "export MSG=HELLO"

.echo2_script: &echo2_script
  - "hoge"
  - "echo ${MSG} >> msg.txt"

cleanup_build_job_for_echo1:
  stage: cleanup
  script:
    - "echo 'Succeed cleanup by echo1.' >> msg.txt"
  when: on_failure
  needs: ["echo1"]
  artifacts:
    paths:
      - msg.txt

cleanup_build_job_for_echo2:
  stage: cleanup
  script:
    - "echo 'Succeed cleanup by echo2.' >> msg.txt"
  when: on_failure
  needs: ["echo2"]
  artifacts:
    paths:
      - msg.txt

echo1:
  stage: stage1
  script:
    - *echo1_script
  artifacts:
    paths:
      - msg.txt

echo2:
  stage: stage2
  script:
    - *echo2_script
  artifacts:
    paths:
      - msg.txt

ジョブの流れは以下のようになります
echo2 が失敗した場合には cleanup_build_job_for_echo2 だけが実行されています

echo2 も常に実行したい場合には

ただこの場合だと以下のように echo2 は実行されないので echo2 も常に実行したほしい場合には when: always を指定します

stages:
  - stage1
  - stage2
  - cleanup

.echo1_script: &echo1_script
  - "hoge"
  - "export MSG=hello"
  - "echo ${MSG} >> msg.txt"
  - "export MSG=HELLO"

.echo2_script: &echo2_script
  - "echo ${MSG} >> msg.txt"

cleanup_build_job_for_echo1:
  stage: cleanup
  script:
    - "echo 'Succeed cleanup by echo1.' >> msg.txt"
  when: on_failure
  needs: ["echo1"]
  artifacts:
    paths:
      - msg.txt

cleanup_build_job_for_echo2:
  stage: cleanup
  script:
    - "echo 'Succeed cleanup by echo2.' >> msg.txt"
  when: on_failure
  needs: ["echo2"]
  artifacts:
    paths:
      - msg.txt

echo1:
  stage: stage1
  script:
    - *echo1_script
  artifacts:
    paths:
      - msg.txt

echo2:
  stage: stage2
  script:
    - *echo2_script
  when: always
  artifacts:
    paths:
      - msg.txt

こんな感じで echo1 が失敗しても echo2 が実行されていることがわかります

最後に

これで失敗した場合にも特定のスクリプトを実行することができるようになりました

また調べてみると expected_stage_fail や on_failure_script と言った書き方もでてきたのですが expected_stage_fail や on_failure_script はどうやら使えないようです
https://gitlab.com/gitlab-org/gitlab/-/issues/19400

参考サイト

0 件のコメント:

コメントを投稿