① 배운 것
슬랙봇을 활용해 pr approve 받을 시 슬랙 메시지 받기
//python pr_approved.py
import requests
from github import Github
import os
class PrApprovedSlackBot:
def __init__(self):
pass
def _get_approved_pull_requests(repo):
pull_requests_list = []
# 현재 열려있는 PR 목록들을 가져온다.
for pull in repo.get_pulls(state="opened", sort="updated"):
# PR의 모든 리뷰를 가져옵니다.
reviews = pull.get_reviews()
# 리뷰 중에서 승인된 것이 있는지 확인합니다.
is_approved = any(review.state == 'APPROVED' for review in reviews)
if is_approved:
pull_requests_list.append((repo.name, pull))
return pull_requests_list
def _send_slack(msg: str):
response = requests.post(
"https://slack.com/api/chat.postMessage",
headers={"Authorization": os.environ["SLACK_TOKEN"]},
data={"channel": os.environ["SLACK_CHANNEL_ID"], "text": msg},
)
print(response.json()) # Slack API 응답 출력
def _make_pr_link_with_no(repo_name: str, pr_no: int) -> str:
link = f"https://github.com/bigglz/{repo_name}/pull/{pr_no}"
return link
def set_pull_requests_tags():
g = Github(os.environ["GITHUB_TOKEN"])
repos = [repo for repo in g.get_user().get_repos()]
total_pulls = []
for repo in repos: # 모든 저장소에 대해 실행
pulls = _get_approved_pull_requests(repo)
total_pulls.extend(pulls)
# 모든 저장소의 PR을 집계한 후 메시지를 생성
pr_msg_to_slack = (
f"<!here> 👋🏻 PR이 ARPPOVED 되었어요! 🥳\n"
)
for repo_name, pull in total_pulls:
pr_link = _make_pr_link_with_no(repo_name, pull.number)
pr_title = pull.title
pr_created_at = pull.created_at
pr_msg_to_slack += f"[{repo_name}] {pr_title}: {pr_link}\n"
_send_slack(pr_msg_to_slack) # 집계된 PR 정보를 슬랙에 전송
if __name__ == "__main__":
set_pull_requests_tags()
워크플로우에는 이렇게 작성
name: pr_approve_slack_bot
on:
workflow_dispatch:
pull_request_review:
types:
- submitted
jobs:
name: pr_approve_slack_bot
on:
workflow_dispatch:
pull_request_review:
types:
- submitted
jobs:
approved:
if: github.event.review.state == 'approved'
name: Run Script
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Generate requirements.txt
run: echo '${{ vars.REQUIREMENTS }}' | base64 --d > ./requirements.txt
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12.3'
cache: 'pip'
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run Workflow
env :
SLACK_TOKEN: ${{ secrets.SLACK_TOKEN }}
GITHUB_TOKEN: ${{ secrets.TOKEN_GITHUB }}
SLACK_CHANNEL_ID: ${{ vars.SLACK_CHANNEL_ID }}
run: python pr_approved.py
② 회고 (restropective)
③ 개선을 위한 방법