[GitHub Actions] if문 사용해 Job 실패 제어하기

2022. 12. 29. 22:48· CI, CD/GitHub Actions
목차
  1. Step과 Job의 차이점
  2. 병렬적인 Job 간의 실패 제어
  3. 순차적인 Job 간의 실패 제어
  4. 전체 코드
반응형

Step과 Job의 차이점

Step은 무조건 순차적으로 실행되는 반면, Job은 병렬적으로 실행될 수도 있고 순서대로 실행될 수도 있다. 이 말은 Step에서 실패를 제어하기 위해 사용했던 전제인 "먼저 실행된 Step은 이후 Step 시작 전에 끝난다"가 더이상 유효하지 않다는 뜻이다. 따라서 이 전제를 맞추기 위해 추가적인 설정을 해주어야 한다.

 

병렬적인 Job 간의 실패 제어

일단, 병렬적인 Job A와 Job B가 있다고 해보자. B가 A의 실패를 제어하는 것은 불가능하다. 이유는 B는 A에 대한 정보가 없기 때문이다. 하나의 Job이 다른 Job에 대한 정보를 알기 위해서는 needs Context를 사용해야 하는데, 병렬적인 Job 간에는 needs에 다른 Job의 정보가 없다.

 

공식 문서에는 아래와 같이 나와있다.

The needs context contains outputs from all jobs that are defined as a direct dependency of the current job.

needs Context는 현재 Job에 직접 의존성이 있다고 정의된 모든 Job에 대한 outputs 정보를 가진다.
 

Contexts - GitHub Docs

About contexts Contexts are a way to access information about workflow runs, runner environments, jobs, and steps. Each context is an object that contains properties, which can be strings or other objects. Contexts, objects, and properties will vary signif

docs.github.com

 

따라서 다른 Job이 실패했는지에 대해 필요한 정보가 없으므로, 병렬적인 Job 간의 실패 제어는 불가능하다.

*제어가 되어도 문제이다. Job A, B가 병렬적으로 실행되면 각 Job 실행 시점에 다른 Job이 성공했는지, 실패했는지는 랜덤이기 때문이다.

 

 

순차적인 Job 간의 실패 제어

순차적인 Job 간에는 실패 제어가 가능하다. 순차적인 Job은 앞서 실행된 Job이 성공했는지 실패했는지를 알 수 있기 때문이다. Step에서는 outputs.outcome을 통해 상태에 접근했지만 Job에서는 jobs.<job_id>.result 를 통해 상태에 접근할 수 있다.

 

Context Name Type Description
jobs.<job_id>.result string Job의 실행 결과 반환. 반환 값 : success, failure, cancelled, skipped

 

 

Contexts - GitHub Docs

About contexts Contexts are a way to access information about workflow runs, runner environments, jobs, and steps. Each context is an object that contains properties, which can be strings or other objects. Contexts, objects, and properties will vary signif

docs.github.com

 

하지만, Job에 의존성 있는 Job 객체 정보는 needs 객체에 관리되므로, needs.<job_id>.result 로 상태에 접근할 수 있다.

 

예를 들어 test Job과 handle-failure Job이 있다고 해보자.  handle-failure은 needs 로 test를 가지므로 test가 끝나고 수행된다. 따라서 handle-failure은 test가 성공했는지, 실패했는지에 대한 정보가 있다. 따라서 if 문을 통해 해당 정보로 이전 Job이 실패했는지 확인 후 수행하는 것이 가능하다.

handle-failure:
  runs-on: ubuntu-latest
  needs: [ test ]
  if: failure() && needs.test.result == 'failure'
  steps:
    - name: Print Report
      run: |
        echo "This runs when test fails"

 

 

전체 코드

전체 코드는 다음과 같다. test Job 을 수행 후 handle-failure Job을 수행한다.

name: Handle Job Failure - Handled - if

on:
  workflow_dispatch:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Check out Repository
        uses: actions/checkout@v3

      - name: set up JDK 11
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'
          cache: gradle

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Test with Gradle
        id: exec-test
        run: ./gradlew :app::testDebug
        
  handle-failure:
    runs-on: ubuntu-latest
    needs: [ test ]
    if: failure() && needs.test.result == 'failure'
    steps:
      - name: Print Report
        run: |
          echo "This runs when test fails"

 

반응형
저작자표시 비영리 변경금지
  1. Step과 Job의 차이점
  2. 병렬적인 Job 간의 실패 제어
  3. 순차적인 Job 간의 실패 제어
  4. 전체 코드


 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com

'CI, CD/GitHub Actions' 카테고리의 다른 글
  • [GitHub Actions] outputs Context 활용해 특정 step이 fail 되었는지 체크하기
  • [GitHub Actions] if 사용해 Step이 Fail되었을 때 다음 Step 제어하기
  • [GitHub Actions] 테스트, 릴리즈 환경 별로 다른 Secrets 설정하는 방법 알아보기
  • [GitHub Actions] 보안이 필요한 값을 Secrets 기능을 통해 저장하기
Dev.Cho
Dev.Cho
'조세영의 Kotlin World'는 Kotlin를 전문적으로 다루는 개인 기술 블로그입니다. Kotlin 세계에 대한 양질의 자료를 제공하며 Kotlin, Android, Spring, CI, CD 분야에 대해 다룹니다.
Dev.Cho
조세영의 Kotlin World
Dev.Cho
전체
오늘
어제

블로그 메뉴

  • LinkedIn
  • GitHub
  • 분류 전체보기 (491)
    • Kotlin (104)
      • Class and Interface (19)
      • Variable and Function (8)
      • Modifier (5)
      • Collection (14)
      • Time (8)
      • 동시성 제어 (7)
      • Reactive Programming (2)
      • Paradigm (2)
      • Kotlin 자료구조 (15)
      • Design Patterns (11)
      • Algorithm (3)
      • Exception (1)
      • 기타 (9)
      • Update History (0)
    • Coroutines (32)
      • Coroutine Basics (18)
      • Flow (9)
      • CoroutineScope (3)
      • Debugging (2)
    • Testing Codes (28)
      • Test 기본 (3)
      • JUnit5 (9)
      • MockK (6)
      • Testing Coroutines (1)
      • Testing Android (8)
      • Test 기타 (1)
    • Spring (50)
      • Dependency Injection (18)
      • Settings (5)
      • REST API (0)
      • DevTools (1)
      • MVC (18)
      • Error (2)
      • MongoDB (2)
      • Database (4)
    • Android (39)
      • Architecture (2)
      • Component (5)
      • Manifest (1)
      • Lifecycle (2)
      • Dependency Injection (17)
      • Resource (1)
      • Storage (1)
      • Security and Optimization (1)
      • WebView (2)
      • Error (6)
    • Android Jetpack Compose (33)
      • Compose (6)
      • Compose Modifier (13)
      • Compose Resource (4)
      • Compose State (4)
      • Compose Side Effect (6)
    • Android Jetpack Compose UI (48)
      • Compose Layout (14)
      • Compose Text (10)
      • Compose Button (5)
      • Compose Dialog (2)
      • Compose TextField (0)
      • Compose UIs (4)
      • Compose Animation (1)
      • Compose Canvas (12)
    • Android Jetpack (10)
      • Datastore (5)
      • ViewModel (4)
      • LiveData (1)
      • Paging (0)
    • KMP (5)
    • Programming (4)
    • Machine (9)
      • JVM (7)
      • Linux (2)
    • CI, CD (74)
      • Gradle (12)
      • Groovy Gradle (5)
      • Git (25)
      • Git Remote (5)
      • GitHub (5)
      • GitHub Actions (21)
    • Network (33)
      • GraphQL (12)
      • HTTP (11)
      • Basic (9)
    • 오픈소스 (3)
    • Database (3)
      • MongoDB (3)
    • IDE (6)
      • Android Studio (2)
      • Intellij (4)
    • Firebase (1)
    • Javascript (9)

공지사항

  • 코틀린 코루틴 완전 정복 강의 in 인프런 오픈
  • 코틀린 코루틴의 정석 책 출간
  • Kotlin Coroutines 공식 기술 문서 한국어 번⋯
  • GitHub에서 조세영의 Kotlin World를 Foll⋯
  • 문의&제안

인기 글

태그

  • Android
  • Kotlin
  • junit
  • flow
  • 코틀린
  • 코루틴
  • gradle
  • Coroutine
  • Spring
  • junit5
  • Jetpack Compose
  • GraphQL
  • github actions
  • github
  • junit4
  • GIT
  • HTTP
  • Spring boot
  • Class
  • 스프링
  • 안드로이드
  • Unit Testing
  • dagger2
  • 의존성 주입
  • Android Compose
  • compose
  • java
  • Dependency Injection
  • kotlin spring
  • 유닛 테스팅

최근 글

반응형
hELLO · Designed By 정상우.v4.3.0
Dev.Cho
[GitHub Actions] if문 사용해 Job 실패 제어하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.