Github Actions에서 이전에 실행된 Step의 결과나 상태가 필요한 경우가 있을 것이다. 예를들면 이전 스텝이 실패했다면 특정 동작을 해야하는 경우나 이전 스텝에서 만들어진 결과물이 필요할 수 있다. steps
Context가 이러한 상황에 도움이 될 것이다.
steps
Context는 같은 job에서 이미 실행되었으며, id
를 가지고 있는 steps들에 대한 정보를 가지고 있다. 각 스텝에 대한 정보는 steps.<step_id>
로 가져오기 때문에, id
를 가지고 있는 steps들에 대한 정보만 가져오는 것이다.
steps:
- name: echo step
id: hello-world
run: echo "Hello World"
id
속성으로 step의 id를 정해줄 수 있다. 위 예시에서는 hello-world
이 echo step
의 id가 된다. 이제 해당 스텝 다음으로 실행되는 스텝들에서는 steps.hello-world
을 통해 hello-world
스텝에 대한 정보를 가져올 수 있다.
steps.<step_id>
는 outputs
와 conclusion
, outcome
으로 총 3가지 정보를 가지고 있다.
outputs
은 해당 스텝에서 정의된 output들의 집합이다. 그렇다면 우선 스텝에서 Output을 만드는 방법부터 알아보자.
steps:
- id: hello-world
run: echo "::set-output name=Hello::World"
Output을 만드는 방법은 위처럼 특정한 양식을 echo
로 출력해주면 된다. 해당 양식은 ::set-output name=<name>::<value>
로 위 예시에서는 Hello
라는 이름의 World
라는 값을 가지는 Output을 만들어준 것이다.
steps:
- id: hello-world
run: echo "::set-output name=Hello::World"
- name: echo step
run: echo ${{ steps.hello-world.outputs.Hello }}
위에서 outputs
에는 output들의 집합이라고 했다. outputs.<name>
을 통해 그 집합에서 특정 Output을 꺼내올 수 있다.
steps:
- id: hello-world
run: |
echo "::set-output name=Hello::World"
echo "::set-output name=random-id::$(echo $RANDOM)"
outputs
가 Output들의 집합이기에 당연히 하나의 스텝에서 여러개의 output을 만들 수도 있다.
conclusion
과 outcome
은 거의 동일한 기능이기에 같이 설명하려고 한다.
위 두개에 대해 설명하기 전, continue-on-error
에 대해 먼저 알아야 한다. steps에 적용할 수 있는 continue-on-error
는 해당 스텝에서 에러가 발생하더라도 이후 스텝을 계속 진행할 것인지 여부를 결정한다. 만약 continue-on-error
가 true로 설정되어 있다면 에러가 발생하더라도 이후 스텝을 계속 진행하고, 기본값인 false로 설정되어 있다면 해당되는 Job이 failed처리되며 이후 스텝을 진행하지 않는다.
steps:
- continue-on-error: true
run: ls /not_found
- run: echo "Hello World"
위 예시에서 첫번째 스텝이 실패하더라도 두번째 스텝은 정상적으로 실행된다.
이제 다시 돌아와서, conclusion
에 대해 먼저 설명하자면 이는 continue-on-error
가 적용된 이후의 스텝의 결과(result)를 나타낸다. 반대로 outcome
은 continue-on-error
가 적용되기 전의 스텝의 결과(result)를 나타낸다. result 값은 success
, failure
, cancelled
또는 skipped
4개 중 하나이다.
success
는 해당 스텝이 에러없이 정상실행되었을 경우 발생하는 상태이다.failure
는 해당 스텝에서 에러 등이 발생하여 실패한 경우 발생하는 상태이다.cancelled
는 사용자가 직접 워크플로우의 실행을 취소시킬 수 있는데 이때 발생하는 상태이다. skipped
는 해당 스텝의 if
구문으로 인해 실행이 되지 않고 넘어가는 경우 발생하는 상태이다.conclusion
은 continue-on-error
가 적용된 이후, outcome
은 적용되기 전의 result를 가진다고 했다. 즉 continue-on-error
스텝이 실패했을 때, outcome
은 failure
값을 가지고, conclusion
은 success
값을 가진다.
steps:
- id: get-cache
continue-on-error: true
run: # Get Cache
- id: get-deps
if: ${{ steps.get-cache.outcome == 'failure' }}
run: # Get Deps
위 예시에서 get-cache
스텝에서 정상적으로 캐시를 가져오지 못한다면 실패하는 로직을 구현했다고 가정하자. 만약 캐시를 가져오지 못한다면 스텝이 실패하고 outcome
이 failure
가 될 것이다. 그렇다면 get-deps
의 if
속성의 표현식이 true가 되므로 해당 스텝을 실행한다.
만약 캐시를 정상적으로 가져왔다면 outcome
이 success
가 될 것이며, get-deps
는 실행되지 않고 넘어간다. 이 경우 get-deps
스텝의 outcome
및 conclusion
의 값은 skipped
가 된다.