한 일

할 일 목록을 그래프로 보는 도구를 만들었다. 파퀘봇의 진짜 할 일 목록은 TODO.md 한 파일이다. 그걸 사람이 죽 읽는 대신, 점과 선으로 된 그래프로 보고 싶었다.

  • tools/issue-vault/generate.mjs를 짰다. TODO.md## 섹션을 읽어서 기능·PR 단위 노트로 쪼갰다.
  • 체크박스를 보고 상태를 자동으로 정했다. 완료(done), 진행중(in-progress), 예정(todo) 세 가지다.
  • 컴포넌트 허브와 [[PR-NN]] 링크를 자동으로 이었다. gh로 PR 제목까지 끌어와 붙였다. 바깥 라이브러리는 하나도 안 썼다.
  • 결과를 Obsidian으로 본다. 상태별로 색을 다르게 묶어서, 끝난 일과 남은 일이 한눈에 갈린다.

같은 데이터를 3D 별자리로도 봤다. 그래프만으로는 좀 심심했다. 그래서 별자리 뷰어를 따로 만들었다.

  • tools/constellation/index.html 한 파일이다. three.js로 그렸다.
  • 노드가 빛나는 별이 되고, 이어진 선이 별자리가 된다. 배경에 별가루가 깔리고 천천히 돈다.
  • generate.mjs가 그래프용 데이터와 별자리용 데이터(graph-data.js)를 같이 뽑는다. 브라우저에서 실제로 떠서 도는 걸 확인했다.

이 도구들이 배포를 건드리지 않게 막았다. 이건 어디까지나 내가 보는 로컬 도구다. 운영 서비스와는 상관없다. 그래서 tools/**obsidian-vault/**를 배포 트리거에서 빼고, 파생물은 git에 안 올라가게 .gitignore에 넣었다.

배포를 한 줄로 흐르게 만들었다. 가장 큰 일이다. main에 푸시 한 번 하면, 사람이 중간에 끼어들지 않고 끝까지 간다.

  • 흐름은 test → staging → 스모크 → prod 순서다. 앞 단계가 끝나야 다음이 돈다.
  • 중요한 건 “같은 커밋"이 그대로 올라간다는 점이다. staging에서 검증한 그 커밋(github.sha)을 prod가 다시 끌어오는 게 아니라, 같은 커밋을 그대로 체크아웃해서 쓴다. 빠르게 두 번 푸시해도 엉키지 않는다.
  • staging 스모크 테스트가 prod로 넘어가는 유일한 관문이다. 사람의 승인 단계는 없다. 사용자가 그렇게 하기로 정했다.
  • 스모크는 7군데를 두드린다. api 5경로(/api/party, /api/stats, /api/stats/series, /api/bot/version, /api/bot/script), /grafana/api/health, 그리고 docker compose ps로 5개 서비스가 다 떠 있는지 본다.
  • staging과 prod 양쪽에서 6경로가 200을 주고, 모든 서비스가 떠 있고, 사람 손 없이 prod까지 완주하는 걸 직접 확인했다.

막힌 것, 고친 것

스모크 테스트가 엉뚱하게 통과하던 문제가 있었다.

웹서버(Caddy)는 평문 HTTP로 들어오면 HTTPS로 보내버린다(308 리다이렉트). 그런데 기존 검사는 curl -sf http://localhost로 두드리고 있었다. -f 옵션은 이 308 리다이렉트를 그냥 통과시킨다. 그러니까 실제 서비스가 살았는지가 아니라, “Caddy가 리다이렉트는 한다"는 사실만 보고 있던 셈이다. 빈 껍데기를 통과시키는 검사였다.

그래서 진짜 경로로 두드리게 고쳤다. .env의 도메인으로 curl --resolve를 써서, 실제 HTTPS와 도메인 라우팅까지 타고 들어가게 했다. 이제 인증서가 깨지면 스모크가 막는다. 그게 맞다. 인증서가 깨진 건 운영에서 진짜 장애니까, 관문이 거기서 막아주는 게 옳다.

돌아보며

배포를 자동으로 만드는 건 좀 무섭다. 사람이 중간에서 “올려, 말어"를 누르던 걸 없애는 일이니까. 한 번 푸시하면 prod까지 그냥 간다. 그래서 관문을 제대로 만드는 데 마음을 더 썼다.

가장 마음에 남는 건 스모크 버그다. 검사는 계속 초록불이었다. 다 잘 되는 줄 알았다. 그런데 사실은 리다이렉트만 보고 통과 도장을 찍고 있었다. “통과했다"는 말이 “괜찮다"는 뜻이 아닐 수 있다는 걸 다시 봤다. 검사가 통과한다고 안심하면 안 된다. 그 검사가 진짜로 무엇을 보는지를 봐야 한다.

별자리 뷰어는 솔직히 꼭 필요한 건 아니었다. 그래프만으로도 충분했다. 그런데 점과 선을 별과 별자리로 바꾸고, 천천히 도는 걸 보니 기분이 좋았다. 할 일 목록이 밤하늘이 됐다. 일을 보는 게 조금 즐거워졌다. 그런 작은 즐거움도 일을 오래 하게 만드는 것 같다.