local-deploy.sh가 GHA보다 빠른 게 의외였습니다

GHA 에서 로컬로 배포를 내린 건 비용 때문이었지 속도 때문이 아니었습니다.

빌링 한도 메일을 두 번 받고 옮긴 거라 속도는 약간 손해를 보고 비용을 잡는다는 그림을 그리고 옮겼습니다. 그 가정이 맞기를 기대하면서도, 푸시 한 번에 모든 게 흐르는 흐름을 잃는 만큼 빌드가 답답하게 느껴질 거라고 짐작했습니다. 한두 달 굴려보고 비용 절감분이 답답함을 상쇄한다고 적당히 합리화할 작정이었습니다.

옮긴 다음의 사실관계가 짐작과 다르게 흘렀습니다.

빌드가 느려지지 않았고, 오히려 빨라졌습니다. 한 사이트의 평균 빌드·배포 시간이 GHA 시절 60~90 초였고, 로컬로 옮긴 다음은 20~30 초입니다. 변동이 큰 사이트도 있지만 portfolio 평균으로 보면 절반 이하로 떨어졌습니다. 비용을 잡으려고 옮긴 결정이 속도까지 같이 잡은 셈입니다.

빨라진 이유를 사후에 짚어보면 세 가지입니다.

첫째는 환경 부팅 비용입니다. GHA 워크플로는 매번 깨끗한 우분투 이미지로 시작합니다. Node 설치, 의존성 설치, 빌드 도구 부팅 시간이 매 빌드마다 들어갑니다. 한 사이트당 30 초 정도가 이 부팅에 쓰였고, 로컬은 그게 0 입니다. 노트북에는 Node 가 이미 떠 있고, 의존성도 받아져 있고, 캐시도 데워져 있습니다. 작은 사이트일수록 부팅 비용이 전체 빌드 시간의 절반 이상이었습니다.

둘째는 변경분 빌드입니다. GHA 는 푸시 한 번에 자동으로 트리거되는 구조라, 코드의 한 줄만 바뀌어도 전체 빌드가 다시 돌았습니다. 로컬은 변경된 파일만 다시 빌드합니다. 사이트의 한 페이지만 고쳤으면 그 페이지만 다시 만들고, 나머지는 이전 빌드 산출물이 그대로 남습니다. portfolio 의 일상적인 변경은 대부분 한두 파일 단위라, 변경분 빌드의 효과가 크게 들어왔습니다.

셋째는 invalidate 의 범위입니다. GHA 시절에는 와일드카드 무효화를 자주 썼습니다. 어떤 파일이 어디로 갔는지를 워크플로에서 따라잡기가 번거로워서, 그냥 전체 무효화를 한 번 친 다음 작업으로 넘어갔습니다. 로컬은 변경된 산출물의 목록을 그대로 가지고 있어서 무효화 범위를 좁힙니다. 와일드카드 한 번이 완료되기까지 걸리는 시간이 좁은 무효화 여러 번보다 더 길었습니다.

이 세 가지가 합쳐져서 평균 빌드 시간이 절반 이하가 되었는데, 사후에 적어두고 보면 당연한 결과로 보입니다. 옮기기 전에는 안 보였다는 게 자조거리입니다.

GHA 의 빌드 시간을 빠르다고 느낀 건 비교 대상이 더 느린 시절의 기억이었기 때문입니다. 5 년 전쯤 Jenkins 에서 빌드·배포를 굴리던 답답함이 GHA 로 옮기면서 사라진 경험이 있고, 그 비교만 머릿속에 남아 있어서 GHA = 빠르다 라는 감각이 박혀 있었습니다. 로컬이 그것보다 더 빠를 수 있다는 가능성이 시야에 들어온 적이 없었습니다.

이 감각이 한도 메일을 두 번 받을 때까지 옮기는 결정을 미루게 만든 부분이기도 합니다. 옮기면 느려질 거라는 짐작이 있었고, 그 짐작이 검증된 적이 없었습니다. 검증을 미루는 동안 빌링은 매달 한 칸씩 차올랐습니다.

옮기고 나서 한 달쯤 지난 시점에 한 가지가 더 보였습니다.

빌드 시간이 짧아진 게 운영 페이스를 바꿔놓고 있었습니다. 한 사이트의 변경 한 번에 60~90 초가 들었던 시절에는, 변경을 머릿속에서 모아두었다가 한 번에 푸시하는 패턴이 있었습니다. 작은 변경 다섯 개를 모아서 한 번에 푸시하면 빌드는 한 번만 돕니다. 20~30 초로 떨어진 다음에는 그때그때 따로 푸시해도 한 번 분량의 시간이 안 듭니다. 변경을 모아두는 습관이 사라지고, 변경 하나 하나가 바로 production 에 들어가는 흐름으로 바뀌었습니다.

부작용도 같이 적어둡니다. 변경 단위가 작아진 만큼 git log 가 잘게 쪼개졌습니다. 한 페이지의 한 줄을 고친 커밋이 늘었고, 어떤 작업이 한 묶음이었는지가 log 로는 잘 안 보입니다. 운영 페이스는 가벼워졌는데 기록의 결은 흩어졌습니다.

옮긴 결과가 옮길 때의 기대보다 더 좋았다는 사실 자체가 사후의 운에 가깝습니다. 비용을 잡으려고 옮긴 결정이 속도까지 잡아준 건 운영 환경의 우연한 정렬이고, 다음 비슷한 결정이 같은 방향의 부수 효과를 보장하지 않습니다.