Github Actions - steps Context

DongHwan·2022년 4월 3일
0

Github Actions

목록 보기
4/7

Github Actions에서 이전에 실행된 Step의 결과나 상태가 필요한 경우가 있을 것이다. 예를들면 이전 스텝이 실패했다면 특정 동작을 해야하는 경우나 이전 스텝에서 만들어진 결과물이 필요할 수 있다. steps Context가 이러한 상황에 도움이 될 것이다.

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-worldecho step의 id가 된다. 이제 해당 스텝 다음으로 실행되는 스텝들에서는 steps.hello-world을 통해 hello-world 스텝에 대한 정보를 가져올 수 있다.

steps.<step_id>outputsconclusion, outcome으로 총 3가지 정보를 가지고 있다.

outputs

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

conclusionoutcome은 거의 동일한 기능이기에 같이 설명하려고 한다.

continue-on-error

위 두개에 대해 설명하기 전, 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 & outcome 설명

이제 다시 돌아와서, conclusion에 대해 먼저 설명하자면 이는 continue-on-error가 적용된 이후의 스텝의 결과(result)를 나타낸다. 반대로 outcomecontinue-on-error가 적용되기 전의 스텝의 결과(result)를 나타낸다. result 값은 success, failure, cancelled 또는 skipped 4개 중 하나이다.

  • success는 해당 스텝이 에러없이 정상실행되었을 경우 발생하는 상태이다.
  • failure는 해당 스텝에서 에러 등이 발생하여 실패한 경우 발생하는 상태이다.
  • cancelled는 사용자가 직접 워크플로우의 실행을 취소시킬 수 있는데 이때 발생하는 상태이다.
  • skipped는 해당 스텝의 if 구문으로 인해 실행이 되지 않고 넘어가는 경우 발생하는 상태이다.

conclusioncontinue-on-error가 적용된 이후, outcome은 적용되기 전의 result를 가진다고 했다. 즉 continue-on-error 스텝이 실패했을 때, outcomefailure 값을 가지고, conclusionsuccess 값을 가진다.

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 스텝에서 정상적으로 캐시를 가져오지 못한다면 실패하는 로직을 구현했다고 가정하자. 만약 캐시를 가져오지 못한다면 스텝이 실패하고 outcomefailure가 될 것이다. 그렇다면 get-depsif 속성의 표현식이 true가 되므로 해당 스텝을 실행한다.

만약 캐시를 정상적으로 가져왔다면 outcomesuccess가 될 것이며, get-deps는 실행되지 않고 넘어간다. 이 경우 get-deps 스텝의 outcomeconclusion의 값은 skipped가 된다.

profile
날 어떻게 한줄로 소개해~

0개의 댓글