GHA 빌링 한도를 두 번 넘기고 로컬로 내려왔다
GitHub Actions 빌링 한도 메일을 두 번 받았습니다.
첫 번째 메일은 작년이었습니다. 받았을 때 짧게 당황했고, 길게 인정하지 못했습니다. 사이트 수가 늘면서 빌드·배포 워크플로 실행 횟수가 한도를 넘긴 게 분명한데, 그 시점에 저는 워크플로 자체를 손보기보다 한도를 살짝 올리는 쪽을 골랐습니다. 무리한 결정이었다고 지금은 봅니다. 그때는 GHA 가 빠르다는 감각이 너무 강해서, 그 감각을 잃는 결정을 미루고 싶었습니다.
GHA 의 좋은 점을 적자면 길어집니다.
푸시 한 번에 빌드·배포가 한 줄로 흐릅니다. 로그가 남고, 어떤 사이트의 어떤 커밋이 언제 배포됐는지가 PR 화면에 그대로 표시됩니다. 같은 워크플로를 portfolio 전체에 복사해서 쓸 수 있어서, 사이트가 늘어도 관리 비용이 별로 안 늘었습니다. 한 번 잘 짜둔 흐름이 사이트 수에 곱해져서 작동하는 구조였습니다.
문제는 그 곱셈이 빌링에도 똑같이 적용된다는 점이었습니다.
사이트가 100 개를 넘으면서 한 번의 변경이 100 개의 빌드를 트리거하는 상황이 자주 일어났습니다. 공통 의존성 하나를 올리면 100 개의 워크플로가 동시에 큐에 들어갔고, GHA 분당 사용량이 일주일 만에 한 달 한도를 넘기는 일이 생겼습니다. 한도를 한 번 올렸고, 또 한 번 올렸고, 그 다음에 두 번째 메일을 받았습니다.
두 번째 메일을 받은 날에 결정을 내렸습니다.
microsaas-infra 안에 local-deploy.sh 스크립트를 표준으로 두고, portfolio 전체 배포를 그 스크립트로 통일했습니다. 변경된 사이트만 빌드하고, 변경된 자산만 S3 에 올리고, 변경된 CloudFront 패스만 invalidate 합니다. 한 번의 트리거가 100 개의 빌드를 부르던 흐름이, 변경분만 흐르는 형태로 바뀌었습니다.
내려오면서 잃은 것을 먼저 적자면.
푸시 한 번에 모든 게 자동으로 흐르는 감각을 잃었습니다. GHA 가 알아서 빌드·배포를 끝내주던 시기에는 머릿속에서 "배포" 라는 단계 자체를 의식할 일이 없었습니다. 내려오면서 그 단계가 다시 의식의 표면으로 올라왔습니다. 한 번에 끝나는 일이 세 번으로 쪼개졌고, 그 세 번을 잊으면 변경이 production 에 안 들어갑니다.
배포 기록도 잃었습니다. PR 화면에 자동으로 박히던 배포 정보가 사라졌고, 어떤 커밋이 언제 배포됐는지를 따로 적어둬야 합니다. 며칠 전에 배포한 줄 알았던 변경이 사실은 빌드만 하고 deploy 명령을 안 친 상태였다는 걸 뒤늦게 발견한 적도 있습니다. GHA 라면 PR 화면에 곧장 떴을 흔적이, 로컬에서는 안 보였습니다.
얻은 것을 적자면.
빌드 시간이 오히려 짧아졌습니다. GHA 워크플로는 매번 깨끗한 환경에서 시작해서 의존성을 다시 받고 캐시를 다시 만듭니다. 로컬은 그게 다 누적된 상태에서 시작합니다. 변경된 파일만 다시 처리하면 됩니다. 한 사이트당 빌드 시간이 GHA 의 절반 이하로 떨어졌습니다.
빌링 그래프가 평평해졌습니다.
GHA 시절에는 매달 한도 그래프가 가팔라지고 있었습니다. 로컬로 내려온 다음에는 그 그래프 자체가 사라졌습니다. 정확히는 GHA 빌링 페이지를 더 이상 매주 확인하지 않아도 되는 상태가 됐다는 뜻입니다. 비용이 0 이 됐다기보다, 비용이 측정 대상 바깥으로 빠졌다는 표현이 정확합니다. 제 노트북 전기료에는 들어가 있을 텐데, 그쪽은 한도 메일을 안 보냅니다.
이 결정의 다른 면도 적어둡니다.
로컬 배포는 운영자가 한 명일 때만 깔끔하게 돌아갑니다. 두 명 이상이 같이 작업하기 시작하면, 누가 어떤 변경을 언제 배포했는지가 다시 문제가 됩니다. 푸시 → 자동 배포라는 흐름은 협업 환경에서 누구의 변경이 production 에 들어갔는지를 자동으로 기록해주는 장치이기도 했습니다. 사람이 한 명 더 붙는 시점이 오면 다시 그런 흐름이 필요해질 것 같습니다.
지금 와서 생각하면 한도를 두 번 넘긴 일은, 빠르다는 감각을 비용으로 두 번 산 일이었습니다. 첫 번째 메일을 받은 시점에 같은 결정을 내렸어야 했는데, 그 감각을 잃기가 그만큼 싫었습니다. 비싸게 산 결정이었고, 다음에는 한 번의 신호로 움직이는 쪽으로 가보려고 합니다.
