gitlab-ci にて needs を使いたくなったのでその際にドキュメントを見ながら試したメモ
needs
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 のダウンロードを抑止できます。