actions/setup-go 대체로 골랑(Golang) 지속적 통합(CI) 속도 높이기
1. 이게 뭔가요?
이 기사는 프로그래밍 언어 Go로 작성된 소스 코드를 자동으로 검증하고 빌드하는 지속적 통합 작업의 속도를 높여주는 새로운 도구인 cloudx-io/setup-go의 개발 배경과 작동 방식을 다룹니다. 지속적 통합이란 개발자가 작성한 코드를 중앙 저장소에 합칠 때마다 오류가 없는지 자동으로 시험하고 조립하는 과정을 말하며, Go 언어는 이전에 작업했던 기록을 임시 저장하는 빌드 캐시와 테스트 캐시 기능을 가지고 있어 코드가 바뀌지 않았다면 이전 결과를 재사용해 시간을 아낄 수 있습니다. 하지만 깃허브에서 제공하는 기본 도구인 actions/setup-go는 여러 작업이 동시에 진행될 때 서로의 임시 저장 공간을 덮어쓰거나 오래된 기록을 불러오는 문제를 가지고 있어, 이 기사는 각 작업마다 고유한 이름을 붙여 충돌을 막고 매번 최신 기록을 저장하도록 개선한 새로운 도구의 성능 측정 결과를 설명합니다.
2. 왜 화제인가요?
기존의 기본 도구는 코드를 관리하는 설정 파일인 go.mod가 바뀔 때만 새로운 임시 저장 공간을 기록했기 때문에, 여러 작업이 동시에 실행될 때 먼저 끝난 작업의 불완전한 기록이 전체 저장 공간을 덮어쓰는 문제가 있었습니다. 예를 들어 문법 검사 작업이 테스트 작업보다 먼저 끝나면 테스트 결과가 빠진 오래된 기록이 저장되어 이후의 테스트 작업들이 이미 검사했던 테스트를 다시 수행하게 만드는 비효율이 발생했습니다. 클라우드엑스 코드 저장소의 백테스팅 기준으로 최근 4,011개의 커밋 중 기본 도구가 실행한 526,166회의 테스트 패키지 실행 횟수를 71,928회로 줄여 86퍼센트의 불필요한 테스트 반복을 없애고, 테스트 작업의 중간 실행 시간을 131초에서 41초로 줄여 69퍼센트의 성능 향상을 이뤘다는 점에서 개발 생산성 향상과 서버 비용 절감 측면에서 큰 화제가 되고 있습니다.
3. 핵심 내용
지속적 통합이란 개발자들이 작성한 코드를 중앙 저장소에 합칠 때마다 자동으로 오류가 없는지 테스트하고 빌드하는 과정을 뜻합니다. 깃허브의 공식 actions/setup-go 도구를 cloudx-io/setup-go로 바꾼 결과 테스트 작업 실행 시간이 69퍼센트 줄었습니다. 깃허브 액션즈 환경에서 골랑을 설치하고 실행할 때 공식 추천되는 기본 도구는 내부적으로 actions/cache를 사용하여 골랑 모듈 캐시와 빌드 캐시 디렉터리를 저장하고 불러옵니다. 기본 도구는 설정 파일인 go.mod가 바뀔 때만 캐시를 저장합니다. 활발하게 개발 중인 제품에서는 운영체제, 컴퓨터 아키텍처, 골랑 버전, go.mod 파일이 바뀌는 경우는 전체 코드 변경 중 극히 일부에 불과하므로, 이 캐시 키는 턱없이 부족합니다. 어떤 작업이 해시 값을 처음 계산하면 최종 캐시 상태가 깃허브 캐시 서비스에 저장되고, 다음 변경 전까지는 이후의 모든 지속적 통합 실행이 맨 처음 저장된 그 값만을 불러와 사용합니다. 애플리케이션을 수정해 나가면서 이 첫 번째 실행에서 가져온 빌드 모듈 압축 파일들은 점차 쓸모가 없어지고, 저장된 테스트 결과물 역시 시간이 지나면서 유효하지 않게 되므로 이후의 각 작업들은 더 많은 테스트를 반복해서 다시 실행하게 됩니다. 또한 여러 작업이 동시에 실행되면서 깃허브의 캐시 서비스에 서로 다른 지역 캐시 상태를 덮어쓰려고 경쟁하는 상황이 벌어집니다. 예를 들어 문법 검사를 하는 린트 작업과 코드가 제대로 동작하는지 확인하는 테스트 작업을 동시에 실행할 때 두 작업은 똑같은 기본 캐시 키를 찾아낸 다음 그 키에 해당하는 값을 저장하려고 서로 경쟁합니다. 문법 검사 작업이 먼저 끝나면 최신 테스트 캐시 상태가 반영되지 않은 값을 저장해 버리며, 나중에 실행되는 테스트 작업들은 캐시 키가 바뀌기 전까지 이 오래된 값을 계속 사용하게 되므로 불필요하게 테스트를 다시 실행하게 됩니다. 소스 코드를 검사하고, 프로그램을 만들고, 테스트하는 과정은 이전에 계산한 값을 저장해 두었다가 다시 계산하지 않고 재사용하는 기법인 메모이제이션을 적용하기에 가장 좋습니다. Go 언어의 모듈 캐시는 외부에서 가져다 쓰는 다른 소스 코드 다운로드 시간을 줄여주며, 빌드 캐시와 테스트 캐시는 실제로는 GOCACHE라는 같은 폴더 안에 있으며 전체적인 구조를 공유합니다. go build 명령어는 최종 프로그램 파일을 만들기 전단계인 중간 결과물과 꾸러미 보관 파일들을 저장하고, go test 명령어는 화면에 출력되는 내용, 오류 메시지, 그리고 테스트가 끝났을 때의 최종 결과 코드를 저장합니다. 깃허브의 기본 도구는 키와 파일 경로만 관리하며, 일단 기록되고 나면 액션즈 캐시 안의 키와 값 쌍은 수정할 수 없습니다. cloudx-io/setup-go는 작업 고유 식별자나 임의의 캐시 열쇠 접두사 입력값을 액션즈 캐시 열쇠의 일부로 포함시키는 방식으로 이 문제를 해결합니다. 덕분에 문법 검사 작업과 테스트 작업이 서로 충돌 없이 각자 독립된 캐시를 저장하고 불러올 수 있습니다. 클라우드엑스에서 만든 새로운 도구는 매번 임시 저장소 항목을 기록하며, 그 방식은 임시 저장소의 이름표 맨 마지막에 자동화 작업이 실행될 때마다 부여되는 고유한 번호인 깃허브 액션 실행 ID를 붙이는 것입니다. 전체 이름표는 깃의 특성을 살려 앞부분이 일치하는 항목을 쉽게 찾을 수 있도록 여러 다른 요소들을 함께 포함합니다. 캐시 키 구조는 go-cache-${os}-${inputs.cache-key-prefix}-${goVersion}-${ref_name}-${hashFiles('**/go.sum')}-${run_id} 형태입니다. 이렇게 매번 완전히 똑같은 이름표가 만들어지는 것을 원천 차단함으로써 모든 자동화 작업이 끝날 때마다 깃허브 액션 임시 저장소 서비스에 새로 작성된 데이터 덩어리를 확실하게 남기도록 만듭니다. 실제 측정 결과 2025년 10월 29일에는 기본 도구의 코드 검사 임시 저장소가 테스트 임시 저장소를 밀어내어 중간 테스트 실행 시간이 131초에 달했지만, 2025년 11월 21일 이 도구를 도입하여 테스트 임시 저장소를 코드 검사 임시 저장소와 분리하자 중간 테스트 실행 시간이 41초로 줄어들어 69퍼센트의 성능 향상을 기록했습니다. 또한 4,011개의 커밋 기록을 바탕으로 모델링한 결과 더 최신 상태의 임시 저장소를 불러오기 때문에 실행을 기다려야 하는 테스트 패키지 수가 526,166회에서 71,928회로 86퍼센트 줄어들었습니다. 다만 이 방식을 도입하면서 두 가지 단점을 겪었는데, 첫째는 캐시 데이터 객체가 훨씬 더 많아져 캐시 파일 덩어리가 계속 커졌다는 점이며 이는 Go 언어의 캐시가 스스로 불필요한 데이터를 지우지 않기 때문에 발생한 문제로 자동 프루닝 기능을 적용해 해결했습니다. 둘째는 깃허브 액션즈에서 제공하는 캐시 저장 용량을 늘려야 할 수도 있다는 점이지만 작업 실행 속도가 빨라지면서 가상 컴퓨터를 빌려 검증 작업을 실행할 때 걸린 시간 단위로 청구되는 비용 측면에서 어느 정도 상쇄됩니다.
4. 나에게 어떤 영향이 있나요?
개발 팀을 운영하거나 프로그램을 직접 빌드하는 개발자라면 지속적 통합 작업의 대기 시간을 줄이고 서버 비용을 절감하는 데 참고할 수 있습니다. 코드가 바뀔 때마다 테스트가 완료되기를 기다리는 시간을 줄여주어 전체적인 개발 효율을 높여줍니다. 다만 실제 성능 향상 폭은 프로젝트의 복잡도나 설정 파일의 변경 주기에 따라 달라질 수 있으며, 임시 저장 공간이 빠르게 늘어나는 문제를 해결하기 위해 별도의 자동 정리 기능 설정이나 추가 용량 확보가 필요할 수 있습니다.