Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

다른 저장소의 GitHub Actions 워크플로우를 호출할 수 있는 repository_dispatch

GitHub Actions에서 한 저장소에서 다른 저장소의 워크플로우를 실행하고 싶었다. 예를 들면 A 저장소에서 새 버전을 릴리스하면 B 저장소에서 릴리스 된 새 버전을 가지고 업데이트하는 걸 자동화해야 하는 경우였다.

repository_dispatch 이벤트 호출

기본적으로 GitHub Actions는 자신의 저장소의 워크플로우를 실행할 수 있으므로 다른 저장소의 워크플로우를 트리거 하려면 repository_dispatch 웹 훅 이벤트를 이용해야 한다.

여기서는 GitHub Actions 간의 트리거를 예시로 들었지만 repository_dispatch 웹 훅 이벤트는 GitHub 외부에서 REST API로 이벤트를 호출하는 방식을 발한다. 즉, Actions가 아니라 REST API로 호출할 수 있다면 어디서나 호출할 수 있는 이벤트이고 이를 해당 저장소에 권한이 없는 다른 저장소의 Actions에서 사용하는 것이다.

dispatch API는 POST /repos/{owner}/{repo}/dispatches 형태이고 바디로 임의의 event_type을 넘길 수 있다. 필요에 따라서는 client_payload도 바디에 전달할 수 있지만, Actions를 트리거 하는 용도로는 event_type만으로도 충분하다.

Personal Access Token

GitHub의 Personal Access Token 생성 메뉴

GitHub Actions에 기본으로 제공되는 GITHUB_TOKEN은 기본적으로 워크플로우가 실행되는 저장소에 대한 권한만 가지고 있으므로 다른 저장소, 특히 private 저장소에 대한 권한을 부여하려면 Personal Access Token이 필요하다. Settings의 Personal access tokens 메뉴에서 같은 계정(혹은 org) 다른 저장소에 접근할 수 있도록 repo 권한을 부여해서 토큰을 생성한다.

생성한 Personal Access Token를 Actions의 시크릿으로 설정하는 메뉴

이렇게 만든 PAT(Personal Access Token)을 GitHub Actions 워크플로우를 만들 저장소에 PAT이라는 시크릿으로 저장한다.

name: Trigger repository_dispatch

on: workflow_dispatch

jobs:
  trigger:
    runs-on: ubuntu-latest
    steps:
      - run: gh api /repos/outsideris/actions-test/dispatches -f event_type='demo_event'
        env:
          GITHUB_TOKEN: ${{ secrets.PAT }}

이 워크플로우는 다른 저장소의 워크플로우를 실행하기 위한 워크플로우이다. 이 워크플로우의 실행 타입은 용도에 따라 다르겠지만 여기서는 데모를 위해 수동으로 실행할 수 있도록 workflow_dispatch로 지정했다. 워크플로우에서는 gh api /repos/outsideris/actions-test/dispatches -f event_type='demo_event'를 이용해서 dispatch API를 호출하는데 Actions에는 gh CLI가 설치되어 있으므로 이를 이용해서 이벤트를 호출하도록 했고 여기서 타깃 저장소는 outsideris/actions-test가 되고 이벤트 이름은 demo_event가 된다.

repository_dispatch 워크플로우

이제 위에서 호출한 repository_dispatch 이벤트를 받는 워크플로우를 만들어 보자.

name: Repository Dispatch

on:
  repository_dispatch:
    types: [ demo_event ]

jobs:
  demo:
    runs-on: ubuntu-latest

    steps:
      - run: echo Repository Dispatch

이 워크플로우는 onrepository_dispatch로 지정했고 types로 앞에서 호출한 이벤트 이름인 demo_event를 지정했다. 그래서 해당 저장소에 repository_dispatch로 ``demo_event`라는 이벤트가 발생하면 이 워크플로우가 실행된다.

앞에서 다른 저장소에 만든 Trigger repository_dispatch 워크플로우를 실행해보자.

Trigger repository_dispatch 워크플로우가 성공적으로 실행된 화면

정상적으로 실행되어 API가 호출되면 outsideris/actions-test 저장소의 Repository Dispatch가 호출되는 것을 확인할 수 있다.

Repository Dispatch 워크플로우가 설공적으로 실행된 화면

이 방법은 저장소 간 워크플로우의 연결할 때 유용하다.

2022/04/12 03:18 2022/04/12 03:18