여러분 들의 팀들은 PR 과 코드 리뷰를 하시나요?
슬랙 디스코드와 같은 협업용 앱을 사용 하시나요?
이때, PR 을 머지하면 유의미한 정보들을 받고 싶다!
라는 생각이 있다면
해당 내용은 유용할 수 있습니다.
혹시, 잘못된 내용이나 다른 좋은 요소들이 있다면 댓글로 또는 joyson5582@gmail.com
로 남겨주세요!
현재, 저희 팀은 팀원간 소통을 위해 슬랙을 사용하고 있습니다.
( 기존 우테코가 슬랙으로 커뮤니티를 해서 이미 다들 익숙해졌다고 판단 했습니다. )
슬랙에서 제공해주는 Github Integration
을 통해 머지될 시 슬랙이 보여주는 정보는
위와 같이 보여줍니다.
( 오픈된건 이렇게 잘 보여주면서 왜... )
다소, 머지될 때는 받는 정보들이 아쉬운걸 알 수 있습니다.
그러면 어떤 정보들이 중요할까요?
https://api.github.com/repos/woowacourse-teams/2024-corea/pulls/594
( PR 페이로드 공식 문서 )
이와 같이 PR 을 조회 해보면 라벨
,어사인니
,리뷰어
,머지된 시간
,본문
, 제목
등등 수많은 정보들을 반환해줍니다.
이는 각자의 프로젝트 & 팀마다 중요도가 다를 수 있습니다.
아래는 저희 팀에서 중요하다고 생각한 부분들 입니다.
저희 팀은 미션 & 취업으로 다들 바쁜 일정이 있기에, 짧은 이슈 & 짧은 PR 을 지향하기로 했습니다.
( 크게 부담을 주지 않고, 코드 리뷰 & 작업을 맡게 하기 위해 )
그렇기에
변경 파일 / 라인 수, PR 기간 - 이슈 및 PR 이 얼마나 작은지
평균 리뷰 응답 시간 / 승인 시간 - 얼마나 빨리 리뷰에 참여했는지, 리뷰가 끝났는지
대화 수 - 코드 리뷰가 유의미 했는지
가 중요한 요소라고 생각했습니다.
( 이 삼각형 처럼 세 가지가 조화롭게 이루어진다면 베스트 일겁니다. )
하지만, 단순 PR을 조회할 때는 해당 내용들을 바로 충분하게 받을 수 없습니다.
( reviews
조회 + comments
조회 + 추가 조회 필요 )
하지만, 일일히 직접 하는건 매우 귀찮은 일입니다.
이를 해결해주는 워크플로우가 있습니다!
네이버에서 만든 워크플로우인 https://github.com/naver/pr-stats 입니다.
( 단일 PR 말고도 모든 PR,각 유저별 정보 등 다양하게 추출 해줍니다! 🙂🙂 )
사이트를 들어가보면 더 자세히 알 수 있습니다!
이 내용으로 저희는 슬랙에 요청을 보내서 전달하는 방식으로 사용했습니다.
( 위와 같이 알림을 줍니다. )
워크 플로우와 파이선을 사용해서 만들었습니다.
중요한 부분들에 대해서만 간단하게 설명 하자면
- name: Analyze PR Stats and Notify
run: |
python .github/scripts/pr-stats.py
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
PR_HTML_URL: ${{ github.event.pull_request.html_url }}
ASSIGNEE: ${{ github.event.pull_request.assignee.login }}
PR_NUMBER: ${{ github.event.pull_request.number }}
html_url
assignee
🙂PR_NUMBER
WEBHOOK_URL
slack_webhook_url = os.getenv("SLACK_WEBHOOK_URL")
pr_html_url = os.getenv("PR_HTML_URL")
assignee = os.getenv("ASSIGNEE")
pr_number = os.getenv("PR_NUMBER")
를 파이선 파일을 실행할 때 넣습니다.
def analyze_csv(file_path):
with open(file_path, newline='') as csvfile:
reader = csv.DictReader(csvfile)
stats = []
for row in reader:
stats.append(row)
return stats
CSV 파일에서 정보를 추출하고
def extract_important_info(pr_data):
return next((pr for pr in pr_data if pr['number'] == pr_number), None)
그리고, 현재 번호와 일치한 정보를 찾습니다.
def format_duration(ms):
if ms == 'NaN':
return "N/A"
total_seconds = int(round(float(ms))) / 1000
days, remainder = divmod(total_seconds, 86400) # 86400초 = 1일
hours, remainder = divmod(remainder, 3600) # 3600초 = 1시간
minutes, _ = divmod(remainder, 60)
if days > 0:
return f"{int(days)}일 {int(hours)}시간 {int(minutes)}분 😢"
else:
return f"{int(hours)}시간 {int(minutes)}분 🙂"
# response_time = format_duration(pr['averageResponseTime'])
ms 를 반올림해서 추출합니다.
평균을 구해주므로 ms 이나 소수점을 포함합니다.
그 후에는 슬랙 데이터를 빌더합니다.
( Slack Block Kit Builder 에서 원하는 형태를 만들어 보세요! )
현재는 실제 운영 서버 런칭 & 배포를 한다고
만든 기능이 유의미하게 작동하진 않습니다. ( 대부분이 짧은 시간 내 리뷰 및 머지 )
하지만, 해당 메시지들을 보며
더 좋은 코드 리뷰
, 평균 응답 시간을 더 빠르게
이슈(PR) 단위를 짧게
를 의식하게 된다면
조금이라도 도움이 되리라고 생각합니다. ☺️
Github Integration 은 merged 만 안받게 할 수 없으므로
/github unsubscribe woowacourse-teams/2024-corea pulls
와 같이 opened 까지 같이 꺼지게 됩니다. 🥲