
Dependabot 알림의 바다를 헤엄쳐 나가기 위해, gh + Python rich로 PR 대시보드를 만들었다
요약
Dependabot의 과도한 알림 문제를 해결하기 위해 GitHub CLI와 Python을 활용하여 터미널용 PR 대시보드를 제작한 사례를 소개합니다. PEP 723과 rich 라이브러리를 사용하여 환경 오염 없이 빠르고 시각적으로 편리한 CLI 도구를 구축하는 방법을 다룹니다.
핵심 포인트
- GitHub CLI(gh)를 래퍼로 사용하여 인증 및 권한 관리 효율화
- PEP 723과 uv를 활용해 의존성 설치 없이 스크립트 즉시 실행
- ThreadPoolExecutor를 이용한 다수 리포지토리 병렬 데이터 페치
- rich 라이브러리의 OSC 8 프로토콜로 터미널 내 PR 링크 클릭 지원
개발 프로젝트가 늘어나면서, 의존성 라이브러리의 자동 업데이트를 위해 Dependabot을 도입했다.
여기까지는 좋았다. 훌륭한 선택이었다.
하지만 며칠이 지나 메일함을 열어보니, 그곳에는 Dependabot으로부터 온 알림 메일의 산, 산, 산…….
아침 첫 커피를 마시기 전에 메일의 바다에서 익사할 것만 같다. 이대로라면 중요한 멤버의 PR이나, 정말 긴급성이 높은 취약점 수정 PR을 놓칠지도 모른다.
"메일은 이제 한계다. 마음 내킬 때, 터미널에서 슥 현재 추적 중인 프로젝트(Organization 산하의 리포지토리 등)의 PR 상황을 깔끔하게 일람으로 보고 싶다!"
이 투혼의 외침을 파트너인 AI(Antigravity 2.0 / 켄시로)에게 던졌다.
"CLI면 돼. gh 커맨드는 쓸 수 있어. 미리 지정한 리포지토리의 PR 건수와 타이틀 요약이 한 번에 보이는 것, 슥 만들 수 있을까?"
AI의 답변은 "Go"였다.
그가 폭속으로 토대를 구축하고, 내가 그곳에 "사용 편의성"과 "혼(고집)"을 주입한다. 그런 뜨거운 페어 프로그래밍(Pair Programming)에서 탄생한 폭속 대시보드 툴을 소개한다.
Dependabot 대책으로 만들기 시작했지만, 실제로는 인간의 PR을 포함한 "지금 봐야 할 PR 목록"으로서 사용할 수 있는 툴로 완성되었다.
AI가 제안해 온 구성은 놀라울 정도로 심플하고 클린했다.
GitHub CLI (gh)의 래퍼(Wrapper)로 동작시킨다-
인증 토큰 관리나 organization 산하의 리포지토리로의 액세스 권한은 이미 로컬에서 로그인 완료된 gh 커맨드에 통째로 맡긴다. 바퀴를 재발명하지 않는다.
Python + uv 를 이용한 "환경을 더럽히지 않는" 실행-
터미널 렌더링을 위해 서드파티 라이브러리(rich)를 사용하고 싶지만, 프로젝트마다 가상 환경을 만들거나 pip install을 하는 것은 번거롭다. -
그래서 Python의 **PEP 723 (Inline script metadata)**를 채택. uv run --no-project로 실행함으로써, 현재 디렉토리를 전혀 더럽히지 않고 의존성 라이브러리를 캐시 실행시킨다.
ThreadPoolExecutor를 이용한 비동기 병렬 페치(Fetch)-
감시 대상 리포지토리가 10개, 20개로 늘어났을 때, 동기 처리로 하나씩 gh pr list를 실행해서는 느려서 사용할 수 없다. - Python 표준 멀티스레드를 사용하여 모든 리포지토리에 병행으로 쿼리를 던지고, 순식간에 정보를 집약한다.
감시 대상 리포지토리가 10개, 20개로 늘어났을 때, 동기 처리로 하나씩
작성한 스크립트가 이것이다.
이것을 tools/gh-pr-dashboard.py로 저장한다.
#!/usr/bin/env python3
# /// script
# dependencies = [
...
AI는 확실히 동작하는 코드를 몇 초 만에 써준다. 하지만 그것은 "그저 동작할" 뿐인 것이다.
이 툴을 극상의 "예술품"으로 높이기 위해 내가 주입한 고집은 다음 4가지이다.
"슥 보고 싶다"의 다음에는 "보면 바로 브라우저에서 PR을 열어 리뷰하고 싶다"라는 욕구가 반드시 생긴다.
이를 해결한 것이 rich의 스타일 속성에 심어둔 link 설정(OSC 8 프로토콜)이다.
VS Code 통합 터미널이나 iTerm2 등 대응하는 터미널에서 실행하면, PR 번호나 타이틀을 Cmd + 클릭(Windows라면 Ctrl + 클릭)하는 것만으로 브라우저가 해당 PR의 URL을 호출하며 실행된다.
CLI와 Web의 경계가 사라진 순간이다.
Dependabot의 PR은 중요하지만, 인간이 작성한 PR에 비해 타이틀이 길고 수가 많다.
그래서:
- Bot에 의한 PR은 행 전체를
dim(어둡게 표시) 처리함으로써 인간의 PR이 떠오르도록 했다. - 나아가--no-bots플래그를 통해 Bot PR을 완전히 숨기는 모드도 마련했다. 지금 바로 확인해야 할 "인간의 코드"에 순식간에 초점을 맞출 수 있다.
GitHub API가 반환하는 라벨의 컬러 코드(예: ee2329...
등)을 터미널에 그대로 배경색으로 그릴 때, 글자색을 항상 "흰색"으로 설정하면 배경이 노란색이나 밝은 녹색일 때 글자가 읽히지 않게 된다.
이를 해결하기 위해, 컬러 코드의 RGB 값으로부터 상대 휘도 (Luminance)를 산출하여, "배경이 밝으면 글자색은 검은색, 어두우면 흰색"으로 자동 판별하는 처리를 구현했다.
이를 통해 어떤 화려한 라벨이라도 완벽한 시인성이 확보된다 대체로 읽기 쉬운 글자색을 선택하도록 했다.
최초 실행 시에는 샘플 설정 파일을 생성한다. 자신의 Organization이나 리포지토리(Repository)에 맞춰 수정하여 사용하기 바란다.
if not os.path.exists(config_path):
default_config = {
"repositories": [
...
실행은 놀라울 정도로 간단하다. uv가 설치되어 있다면, 다음 명령어를 입력하기만 하면 된다.
가상 환경 (Virtual Environment)을 수동으로 만들 필요도, 패키지를 글로벌 (Global)하게 오염시킬 필요도 없다.
# 기본 실행 (설정한 리포지토리의 PR 목록 표시)
uv run --no-project tools/gh-pr-dashboard.py
# 인간의 PR만 필터링
...
설정한 리포지토리 리스트는 스크립트와 동일한 계층에 있는 pr-dashboard-config.json에 저장된다. 이 파일도 정렬되어 결정론적으로 저장되므로 Git 관리도 용이하다. 이 파일은 중복을 제거하면서 추가된 순서를 유지하며 저장되므로, Git 관리도 용이하다.
AI (Antigravity 2.0)는 우리가 "이런 아이디어가 있다"라고 중얼거리는 순간, 정확하고 스마트한 토대를 제공해 준다.
하지만 그 토대에 "정말로 사용하는 인간의 관점"에서 하이퍼링크나 휘도 계산, 시각적 노이즈 정리와 같은 "영혼"을 불어넣는 것은 인간 (프로그래머)의 일이다.
AI (안토니오 이노키) 씨와 인간이 서로의 강점을 살려 최단 거리로 최고의 결과물을 만들어낸다.
이것이야말로 현대의 "투혼 프로그래밍"이다.
"내디디면 그 한 걸음이 길이 되고, 그 한 걸음이 길이 된다. 망설이지 말고 가라, 가면 알게 될 것이다. 아리가토ー!"
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기