하나의 Workflow 안에는 여러 개의 Job들이 있을 수 있다. 이때 Job들의 실행 순서를 정해주거나 이전 Job의 결과에 따라 특정한 Job의 실행을 트리거하고 싶을 수 있다. jobs.<job_id>.needs
를 사용하여 이러한 동작들을 정의해줄 수 있다.
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
사용 방법은 위와 같다. needs
에 정의해준 Job이 실행된 이후에 해당하는 Job이 실행된다. 위 예시에서 job1
은 job2
가 실행되기 전에 반드시 성공적으로 실행이 끝나야한다. 그리고 job3
는 job1
과 job2
가 종료될때까지 기다린다. 즉, 실행 순서는 job1 -> job2 -> job3
의 순서이다.
jobs.<job_id>.needs
는 정의된 다른 Job들의 실행이 정상적으로 종료되어야 해당 Job을 실행해준다. 하지만 우리는 종종 이전 Job들의 실행 결과와 무관하게 순서만 지켜 실행하고 싶은 Job이 있을 수 있다.
jobs:
job1:
job2:
needs: job1
job3:
if: ${{ always() }}
needs: [job1, job2]
이럴 땐 always()
Expression을 사용하면, 이전 Job들의 실행 결과와 무관하게 무조건 실행시킬 수 있다. jobs.<job_id>.if
속성은 들어온 값에 따라 해당 Job의 실행 여부를 결정하는데, always()
를 넣어주면 항상 true로 실행을 한다.
jobs.<job_id>.needs
를 통해 넣어준 Job들의 정보를 needs Context를 통해 가져올 수 있다. needs Context에 담겨있는 정보들을 다음과 같다.
needs.<job_id>.outputs
needs.<job_id>.result
needs.<job_id>.outputs
jobs:
job1:
outputs:
output1: output_value
job2:
needs: job1
steps:
- run: echo ${{ needs.job1.outputs.output1 }}
needs.<job_id>.outputs
는 job_id Job에 정의된 outputs들을 저장하고 있다. 위 예시에서 보이듯 job1
의 outputs로 output1: output_value
를 지정해준 것을 알 수 있다. 이 특정 변수를 가져오기 위해서는 needs.<job_id>.outputs.<output name>
의 형식으로 사용해주면 된다.
만약 이전 Job에서 생성된 특정 값을 다른 Job에서 사용해야할 때 유용하게 사용할 수 있다.
needs.<job_id>.result
jobs:
job1:
job2:
needs: job1
steps:
- if: ${{ needs.job1.result == 'failure' }}
run: echo "job1이 실패했습니다."
needs.<job_id>.result
는 해당 Job의 실행 결과를 가지고 있다. 가능한 값으로는 success
, failure
, cancelled
, skipped
4가지가 있다. 해당 값을 통해 특정 Job의 결과에 따른 분기처리를 할 수 있을 것이다.