사전 작업 : slack의 봇 만들고 web hook url을 받기 / git hub 토큰 생성
프로그램 시작 시 .env 파일을 읽어서 다음 값을 불러온다.
GITHUB_TOKENGITHUB_OWNERGITHUB_REPOSLACK_WEBHOOK_URL
이 값들은 GitHub API 인증 및 Slack Webhook 호출에 사용된다.
또한 last_event_id.txt 파일을 통해 이전에 처리한 GitHub 이벤트 ID를 저장 및 로드하도록 구성되어 있다.
- 기존에 처리한 이벤트가 있으면 ID를 불러온다.
- 최초 실행 시에는 파일이 없으므로 None을 반환한다.
요청 주소:
https://api.github.com/repos/{owner}/{repo}/events
헤더에 Authorization: token {GITHUB_TOKEN} 을 설정하여 인증을 수행한다.
가져오는 이벤트 개수는 기본 20개로 제한한다.
GitHub Events API는 최신 이벤트가 리스트의 첫 번째 요소로 온다.
따라서:
- 리스트를 앞에서부터 순회하면서
last_event_id와 동일한 ID가 나오기 전까지의 이벤트를 "새로운 이벤트"로 판단한다.- 동일한 ID가 나오면 루프를 종료한다.
이렇게 해서 중복 알림을 방지한다.
새로운 이벤트들은 최신 순으로 수집되므로, 이를 reverse()하여
오래된 이벤트 → 최신 이벤트 순으로 Slack에 전송되도록 한다.
이로써 알림 순서가 뒤바뀌는 문제를 방지한다.
이벤트 타입에 따라 다음 동작을 수행한다.
-
저장소 이름
-
브랜치 이름
-
푸시한 사용자
등의 정보를 추출하여 Slack 메시지 텍스트로 구성한다.
-
action(opened/closed/synchronize 등)
-
PR 번호
-
제목
-
작성자
-
링크
등을 한국어 문장으로 구성하여 Slack 메시지를 생성한다.
그 외 이벤트는 모두 무시한다.
Slack은 다음 형식의 JSON을 수신한다.
{"text":"메시지 내용"}
성공 시 ✔ 메시지를 출력하고, 실패 시 경고 메시지를 출력하도록 구성되어 있다.
모든 새로운 이벤트를 처리한 후:
events[0].id(가장 최신 이벤트 ID)를last_event_id.txt에 저장한다.
이를 통해 다음 실행 시 중복 알림이 발생하지 않도록 한다.
이 스크립트는 다음 흐름을 반복하여 수행한다:
- 이전에 처리한 이벤트 ID를 로드한다.
- GitHub Events API로 최근 이벤트 목록을 가져온다.
- 이전 ID 이후에 발생한 새로운 이벤트만 선별한다.
- PushEvent / PullRequestEvent만 처리하여 Slack에 통보한다.
- 가장 최신 이벤트 ID를 저장 파일에 기록한다.