원격 Apple Silicon 노드에서 go mod download·테스트를 자주 돌리는 개발자·CI 담당자를 위한 튜토리얼형 글입니다. GOPROXY 콤마 체인으로 순차 폴백하고, GOPRIVATE·GONOPROXY로 사내 모듈을 공개 경로에서 분리하며, GOSUMDB·GOMODCACHE까지 한 표로 정리합니다. ·기술 블로그와 함께, 다른 생태계 의존성 풀은 Python·uv·PyPI 매트릭스, Rust·Cargo 미러·락파일 글과 병행해 보세요.

① 왜 원격 Mac에서 모듈 풀이 자주 막히나

Go는 콤마로 구분된 GOPROXY 목록을 앞에서부터 시도합니다. 체인 앞단이 느리거나 타임아웃이 길면 잡 큐 전체가 밀리고, 끝에 direct가 없으면 미러에 없는 모듈에서 영구 실패로 이어질 수 있습니다.

  • 프록시 지연·단일 장애점: 근접 미러 없이 공개 프록시만 쓰거나, 폴백 없이 한 곳만 두면 약한 회선에서 재현이 어렵습니다.
  • 비공개 모듈 유출·패턴 누락: GOPRIVATE가 베니티 경로를 덮지 못하면 공개 프록시·로그에 민감 URL이 노출될 수 있습니다.
  • 캐시·메타 혼선: 공유 GOMODCACHE에 서로 다른 GOPROXY를 쓰는 잡이 동시에 붙으면 락·메타데이터 충돌이 납니다.

GOMODCACHE는 다운로드한 모듈 ZIP·메타를 보관하고, GOCACHE는 빌드 산출물 캐시입니다. 둘을 잡별로 나누면 CI 간 간섭이 줄고, 캐시 키 설계도 명확해집니다.

② 의사결정 매트릭스: 자체 모듈 프록시 vs 공개 GOPROXY 체인

자체 호스팅(예: Athens, 사내 게이트)은 감사·승인된 아티팩트·동일 회선 내 캐시에 유리합니다. 공개 프록시를 콤마로 엮고 마지막에 direct는 초기 도입·소규모 팀·지역 미러만 바꿔 끼우기 좋습니다.

자체 모듈 프록시 공개 체인 + direct
거버넌스 내부 승인·감사 로그·차단 목록 제3자 이용약관·가용성에 의존
운영 부담 스토리지·업그레이드·모니터링 환경 변수 변경 위주
약한 국경 간 링크 동일 리전/VPC에 두면 RTT 이득 신뢰 미러 선행 + direct로 VCS 폴백
비공개 모듈 내부 프록시 + sumdb 정책 통합 GOPRIVATE·GONOPROXY·GONOSUMDB로 분리

팀이 이미 컨테이너·다른 언어용 사내 레지스트리를 운영 중이면 Go 모듈까지 같은 운영 창에 넣는 편이 재현과 온콜에 유리합니다. 반면 단일 저장소·공개 의존성 위주면 공개 체인으로 시작한 뒤 지표(실패율·p95 지연)로 자체 프록시 필요성을 판단해도 늦지 않습니다.

③ 실행 파라미터 표: GOPROXY·비공개·GOSUMDB·캐시

비밀은 저장소에 커밋하지 말고 CI 비밀·런너 환경에 두고, 콤마 구분값에는 공백을 넣지 않습니다. 적용 후 go env | grep -E 'GOPROXY|GOPRIVATE|GOSUMDB|GOMODCACHE'로 확인하세요.

변수 역할·예시
GOPROXY 프록시 URL을 콤마로 나열. direct는 VCS 직접. 예: https://승인-미러,https://proxy.golang.org,direct
GOPRIVATE 비공개 모듈 경로 접두사(콤마). 프록시·기본 sumdb 동작에 영향
GONOPROXY 프록시를 타지 않을 패턴. 보통 GOPRIVATE와 맞춤
GOSUMDB 체크섬 DB. 기본 sum.golang.org, 사내 배포 시 엔드포인트 교체
GONOSUMDB sumdb 검증 생략 패턴(내부 모듈). 최소 범위만
GOMODCACHE 모듈 캐시 루트. CI는 CI_PIPELINE_ID 등으로 하위 분리
GOCACHE 빌드 캐시. GOMODCACHE와 경로 분리 권장
GOTMPDIR 임시 파일. 느린 공유 볼륨 피하기
GOINSECURE 레거시 내부 호스트만, 콤마 패턴. 가능하면 HTTPS 고정
# 셸 예시 — 도메인·비공개 접두사는 조직에 맞게 교체 export GOPROXY="https://proxy.golang.org,direct" # export GOPROXY="https://사내-athens.example.com,https://proxy.golang.org,direct" export GOSUMDB="sum.golang.org" export GOPRIVATE="*.corp.example,github.com/myorg/*" export GONOPROXY="$GOPRIVATE" export GONOSUMDB="$GOPRIVATE" export GOMODCACHE="${HOME}/Library/Caches/go-mod-${CI_PIPELINE_ID:-local}" export GOCACHE="${HOME}/Library/Caches/go-build-${CI_PIPELINE_ID:-local}" export GOTMPDIR="${HOME}/tmp/go-${CI_PIPELINE_ID:-local}" mkdir -p "$GOMODCACHE" "$GOCACHE" "$GOTMPDIR" go mod download

비공개 경로는 import 경로 전체 접두사가 빠지지 않게 패턴을 적습니다. 토큰이 들어간 git config URL은 로그 마스킹 규칙과 함께 문서화하세요.

④ CI에 옮기기: 재현 가능한 다섯 단계

체크리스트
  • 경로 인벤토리: go list -m all로 공개·비공개 의존성을 나눕니다.
  • GOPRIVATE 고정: 조직 도메인·모노레포 베니티를 한 번에 덮는지 리뷰합니다.
  • GOPROXY 순서: 사내→지역 미러→공개→direct 여부를 YAML·launchd·SSH에 동일하게 둡니다.
  • 캐시 키: go.sum 해시·Go 마이너 버전·GOOS/GOARCH를 캐시 복원 키에 포함합니다.
  • 검증·롤백: go mod verify·일부 패키지 go test로 스모크 후 전체 파이프라인을 돌립니다.

⑤ 요약·FAQ: direct·sumdb·캐시

한 줄 요약: 프록시는 순서 있는 폴백, 비공개는 패턴으로 격리, 무결성은 GOSUMDB 정책, 디스크는 모듈 캐시와 빌드 캐시 분리가 기본기입니다.

direct만으로도 느리다면 병목이 Git 클론·LFS일 수 있어 모듈 프록시만으로는 한계가 있습니다. sumdb 오류가 반복되면 대체 프록시가 잘못된 메타를 주는지, GONOSUMDB 범위가 과한지부터 점검하세요.

맺음말: GOPROXY 체인·GOPRIVATE·GOSUMDB·GOMODCACHE를 분리해 두면 원격 Mac에서도 Go CI 풀이 안정됩니다. Apple Silicon 동형 노드와 디스크 여유가 필요하면 로그인 없이 고객 지원·도움말, 요금제, 구매를 확인하고, 다른 글은 기술 블로그·에서 이어가 보세요.

원격 빌드·CI

모듈 풀부터 안정적으로

MacPull 원격 Mac으로 동형 환경을 유지하세요. 도움말·구매는 로그인 없이 이용할 수 있습니다.

전용 노드
SSH
유연한 기간
지원