본문 바로가기
C.W.K.
Stream
Lesson 14 of 14 · published

저장소 디스패치

~9 min · dispatch, external, webhook

Level 0견습생
0 XP0/101 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

외부 시스템이 워크플로를 실행시킨다

repository_dispatch를 쓰면 외부 시스템이 GitHub API에 POST 요청을 보내서 워크플로를 실행할 수 있어. 페이로드는 원하는 JSON 형태로 자유롭게 담을 수 있고, github.event.client_payload로 꺼내 쓸 수 있어.

주로 이렇게 활용해:

  • 저장소 간 연동 — A 저장소에서 빌드를 끝내고 배포를 담당하는 B 저장소에서 디스패치를 발동해.
  • 외부 CI 연동 — Jenkins가 단계를 마치고 배포하려고 GitHub에 디스패치를 보내.
  • GitHub 밖에서 수동 실행 — Slack 슬래시 명령, 내부 관리 도구, 웹훅 등을 활용해.

POST

POST /repos/{owner}/{repo}/dispatches
Authorization: Bearer <PAT 또는 contents:write 권한이 있는 App 토큰>
Body: {
"event_type": "deploy-prod",
"client_payload": { "version": "v1.4.2", "reason": "hotfix" }
}

워크플로는 on: repository_dispatch: types: [deploy-prod]로 이벤트를 기다려.

workflow_dispatch와 비교했을 때 장단점

  • workflow_dispatch — 수동 UI나 gh CLI로 실행하고, 타입이 정해진 입력값을 받으며, 브라우저나 PAT가 필요해.
  • repository_dispatch — 프로그램으로 실행하고, 자유 형식 JSON을 주고받으며, 머신 간 통신에 딱 맞아.

Code

repository_dispatch 수신 대기·yaml
name: external-deploy
on:
  repository_dispatch:
    types: [deploy-prod]

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - uses: actions/checkout@v4
      - name: Show payload
        run: |
          echo "version: ${{ github.event.client_payload.version }}"
          echo "reason: ${{ github.event.client_payload.reason }}"
      - run: ./deploy.sh ${{ github.event.client_payload.version }}
형제 저장소의 워크플로에서 발동·yaml
      - name: Trigger deploy in other repo
        run: |
          curl -X POST \
            -H 'Accept: application/vnd.github+json' \
            -H "Authorization: Bearer ${{ secrets.CROSS_REPO_PAT }}" \
            https://api.github.com/repos/my-org/deploy-repo/dispatches \
            -d '{"event_type":"deploy-prod","client_payload":{"version":"v1.4.2"}}'

External links

Exercise

curl로 샌드박스 저장소의 repository_dispatch를 실행하는 간단한 셸 스크립트를 작성해. 워크플로가 client_payload를 출력하게 해. 다른 페이로드로 스크립트를 3번 실행하고 각각 실행 결과가 잘 나오는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.