240913 TIL

나고수·2024년 9월 13일
0

2024 TIL

목록 보기
68/94
post-thumbnail

① 배운 것
슬랙봇을 활용해 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)

③ 개선을 위한 방법

profile
되고싶다

0개의 댓글