.gitlab-ci.yml の needs についてのメモ

gitlab-ci にて needs を使いたくなったのでその際にドキュメントを見ながら試したメモ

needs

document link

needs は、あるjobが他のjobの実行後に動く必要がある。という順序を指定するもので、DAGである必要があります。

gitlab-ci pipelne では、通常、stage ごとに実行されていきますが、 needs 指定があると、 前のstageのjobが完了していなくてもneeds指定されたjobが完了していれば動き始めます。

needsに空リストを設定すると、即開始されます。

依存の記載として、特定jobのartifactsを利用する dependenciesがありますが、 needsはそれの強化版の様なイメージです。

jobA:
  stage: test
  script:
    - script

jobB:
  stage: deploy
  needs:
    - jobA
  script:
    - script

みたいな使いかたをすると、 jobAが終わったあとにjobBが動きます。

jobA:
  stage: test
  script:
    - script
  rules:
    - if:  '$CI_COMMIT_BRANCH == "main"'

jobB:
  stage: deploy
  needs:
    - jobA
  script:
    - script

こんな書き方をすると、 branchが "main" 以外の時に jobBをpipelineに追加しようとしてエラーが出てしまうので jobAとjobB では 同じ rules を使うことが重要です。

ただし、jobBを main 以外でも実行したい、jobAがなくても動かしたい という場合は

jobA:
  stage: test
  script:
    - script
  rules:
    - if:  '$CI_COMMIT_BRANCH == "main"'

jobB:
  stage: deploy
  needs:
    - job: jobA
      optional: true
  script:
    - script

と、 needs に optional: true を加えると、 jobAがなくても動くようになります。(gitlab 13.10以降、 13.10 では feature enable する必要あり)

また、 stage は必須となり、 needs に設定するjobのstageは、 needsを記載するjobのstageより前のstageである必要があります。これはDAGであることを保証するための制約です。

jobA:
  stage: test
  script:
    - script

jobB:
  stage: test
  needs:
    - jobA
  script:
    - script

つまり、たとえばこのように stageが両方ともtestであるとエラーとなります。

dependencies と同様にartifactsを利用したい場合は

jobA:
  stage: test
  script:
    - script
  artifacts:
    paths:
      - artifacts/
jobB:
  stage: deploy
  needs:
    - jobA
  script:
    - script

と前段のjobでartifactsを指定すれば良いです。

artifactsを利用しない場合は

jobA:
  stage: test
  script:
    - script
  artifacts:
    paths:
      - artifacts/
jobB:
  stage: deploy
  needs:
    - job: jobA
      artifacts: false
  script:
    - script

とneedsに artifacts: false と記載することでartifacts のダウンロードを抑止できます。