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 Actions에 기본으로 제공되는 GITHUB_TOKEN
은 기본적으로 워크플로우가 실행되는 저장소에 대한 권한만 가지고 있으므로 다른 저장소, 특히 private 저장소에 대한 권한을 부여하려면 Personal Access Token이 필요하다. Settings의 Personal access tokens 메뉴에서 같은 계정(혹은 org) 다른 저장소에 접근할 수 있도록 repo
권한을 부여해서 토큰을 생성한다.
이렇게 만든 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
이 워크플로우는 on
에 repository_dispatch
로 지정했고 types
로 앞에서 호출한 이벤트 이름인 demo_event
를 지정했다. 그래서 해당 저장소에 repository_dispatch
로 ``demo_event`라는 이벤트가 발생하면 이 워크플로우가 실행된다.
앞에서 다른 저장소에 만든 Trigger repository_dispatch
워크플로우를 실행해보자.
정상적으로 실행되어 API가 호출되면 outsideris/actions-test
저장소의 Repository Dispatch
가 호출되는 것을 확인할 수 있다.
이 방법은 저장소 간 워크플로우의 연결할 때 유용하다.
Comments