개발자로 후회없는 삶 살기

[문법] 다양한 이벤트 트리거를 알아보자 본문

[Infra]/[GitHub Actions]

[문법] 다양한 이벤트 트리거를 알아보자

몽이장쥰 2025. 1. 19. 20:02

서론

※ 아래 내용을 다룹니다.

  • 컴포넌트 종류
  • 이벤트 트리거 별 특징

본론

- 컴포넌트 종류

1. 워크플로우

깃헙 액션으로 동작할 전체 흐름을 의미하며, 푸시, 풀 리퀘 등 깃헙 이벤트에 의해서 트리거 된다. 특정 이벤트 외에도 특정 시간, 수동으로 워크 플로우를 실행할 수 있다.

 

2. 이벤트

워크플로우를 실행하는 활동이다. 푸시, 풀 이벤트 발생 시 워크플로우가 작동하려면, 원하는 레포지토리의 원하는 브랜치에 푸시, 풀 이벤트 설정이 되어 있어야 한다.

 

3. 러너

워크플로우가 동작하는 서버이다. 하나의 러너에서 하나의 잡이 동작한다. 위 사진에서 러너1, 러너2는 잡을 실행하는 서버로 하나의 잡을 실행할 수 있다.

 

4. 잡

러너에서 실행되며, 워크플로우에서 동작할 스탭이다. 하나의 워크 플로우에 여러 개의 잡을 설정할 수 있고 각 잡은 병렬로 실행되며, 순차적으로 실행하기 위해서 needs 키워드가 있다.

 

5. 스탭

잡안에서 사용되는 개별 명령어로 순차적으로 실행되고, 한 스텝이 실패하면 그다음 스텝은 실행되지 않는다.

 

6. 액션

코드 모음으로 구성된 라이브러리라고 볼 수 있다. 깃헙 액션에만 적용할 수 있는 라이브러리들이 깃헙 액션 마켓플레이스에 등록되어 있고 uses 키워드로 불러와서 사용할 수 있다. 위 예제에서는 체크아웃으로 해당 레포의 브랜치로 변경하고 노드를 설치한다. 어떤 액션은 인풋값이 필요하며, with 키워드로 넣어줄 수 있다.

 

- 다양한 트리거 이벤트

어떠한 이벤트로 워크플로우를 실행할 수 있는지 알아보자

 

-> yml 파일 구성

name: push-workflow
on: push

jobs:
  push-job:
    runs-on: ubuntu-latest
    steps:
    - name: step1
      run: echo hello world

    - name: step2
      run: |
        echo hhhhhh
        echo dhhdhdhdh

위처럼 간단한 워크플로우가 구성되어 있을 때, 각 키워드에 대해서 알아보자.

 

name: 워크 플로우의 이름으로 깃헙 액션 탭에 시각화된다.
on: 트리거 이벤트

pull-job: 잡의 이름으로 자유롭게 지정하면 된다.
runs-on: 잡이 실행되는 러너로 1러너 1잡이다.

 

✅ yml 파일 구성 정리

1) 특정 레포지토리에 위 yml 파일이 등록되어있을 때, 푸시 이벤트가 발생하면 push-workflow라는 이름의 워크 플로우가 실행된다.
2) push-job이라는 잡이 우분투 러너에서 실행된다.
3) 잡은 2개의 스탭으로 이루어져 있고 순차적으로 실행된다.

 

-> 풀리퀘 이벤트

name: push-workflow 2
on: pull_request

jobs:
  push-job:
    runs-on: ubuntu-latest
    steps:
    - name: step1
      run: echo hello world

    - name: step2
      run: |
        echo hhhhhh
        echo dhhdhdhdh

풀리퀘가 될 때 실행이 되는 워크플로우를 만들어봤다.

 

이벤트가 발생하는 yml을 설정하고 1차 푸시를 하여 풀리퀘를 생성하면 워크플로우가 정상적으로 동작한다.

 

하지만, 풀리퀘는 병합되기 전에 src 브랜치에서 커밋과 푸시를 할 수 있다. 이때, 2차 커밋과 푸시를 해도 이벤트가 발생하여 워크플로우가 동작하는 문제가 발생한다.

 

그 이유는, 풀리퀘 이벤트를 on 키워드에 기본으로 설정하면, 기본 실행 타입이 설정되고, 기본 실행 타입은 생성, 동기화 등으로 다양하기 때문이다.

 

name: pull-workflow
on: 
  pull_request:
    types: [opened]

jobs:
  pull-job:
    runs-on: ubuntu-latest
    steps:
    - name: step1
      run: echo hello world

    - name: step2
      run: |
        echo hhhhhh
        echo dhhdhdhdh

따라서, on 키워드에 실행 타입을 풀리퀘 생성 시에만 이벤트가 발생하도록 설정을 해줘야 한다.

 

-> 이슈 이벤트

이슈 이벤트 또한 기본 타입이 다양하여 수정, 삭제만 해도 워크플로우가 실행될 수 있다. 또한, 설정한 기본 브랜치에서만 이슈 이벤트가 동작한다는 옵션이 있다.

 

- 이슈 코멘트 이벤트

이슈나 PR에 댓글을 달았을 때 트리거되는 이벤트이다. 이슈 이벤트처럼 기본 브랜치에 워크플로우 yml이 설정되어 있어야만 한다.

 

name: issue-comment-workflow
on: issue_comment

jobs:
  pr-comment:
    if: ${{ github.event.issue.pull_request }}
    runs-on: ubuntu-latest
    steps:
      - name: pr comment
        run: echo ${{ github.event.issue.pull_request }}

  issue-comment:
    if: ${{ !github.event.issue.pull_request }}
    runs-on: ubuntu-latest
    steps:
    - name: issue comment
      run: echo ${{ github.event.issue.pull_request }}

pr 코멘트 잡과 이슈 코멘트 잡을 만든다. 각각 pr와 이슈에 댓글을 달 때 실행될 것이다. if 문과 깃헙 컨텍스트를 사용하면 조건을 줄 수 있다.

 

PR을 생성하고 댓글을 달아보면, 이슈 커멘트는 스킵된다.

 

- dispatch 이벤트

수동으로 워크플로우를 트리거 할 수 있는 이벤트로 기본 브랜치에 YML이 설정되어 있어야 한다. 

 

이벤트를 트리거할 때 input 값을 줄 수 있으며 4가지 타입이 있다. 초이스는 깃헙 액션에서 제공하는 타입으로 선택바가 생긴다. 그 값을 깃헙 워크플로우에서 받아올 수 있다.

 

디스페치 이벤트를 사용하기 위해선, on 절에 inputs 키워드를 넣으면 된다. 위 사진은 2가지 inputs 값을 받는 YML 설정이다. 각 인풋값마다 4가지 값을 받는다.

 

des : 인풋값에 대해서 깃헙 액션 탭 화면에 보일 설명
req : 반드시 필요한 값이면 true
def : 기본값
type : 타입
options : 초이스 타입 시 선택바가 생김

 

위 YML처럼 input 값을 설정하면 2가지 input 값을 받고, 설정, 기본값, 타입이 등록된다.

 

사용자가 수동으로 인풋값을 넣어서 트리거하면 디스페치 이벤트에서 등록한 input 값은 깃헙 워크플로우에서 사용할 수 있다. inputs.{input 값이름} 형태로 불러와 사용하면 된다.

 

- needs 키워드

하나의 워크플로우에서 여러 개의 잡은 병렬로 실행된다. 이를 순차로 실행하려면 needs 키워드가 필요하다.

 

name: needs
on: push

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
    - name: echo
      run: echo job1 done

  job2:
    runs-on: ubuntu-latest
    needs: [job1]
    steps:
    - name: echo
      run: echo job2 done

  job3:
    runs-on: ubuntu-latest
    steps:
    - name: echo
      run: |
        echo job3 failed
        exit 1

  job4:
    runs-on: ubuntu-latest
    needs: [job3]
    steps:
    - name: echo
      run: echo job4 skip

위 yml에서 잡 1, 3은 종속적이지 않아서 병렬로 실행된다. 2는 1에 종속되어 실행되고 4는 3이 실패하여 스키된다.

 

job4처럼 스킵된 잡을 따로 실행하는 방법에는 if condition이 있다.

Comments