InfoGrab DocsInfoGrab Docs

GitLab용 Go 프록시 (지원 중단됨)

요약

이 기능은 GitLab 19.1에서 사용 중단되었으며 20.0에서 제거될 예정입니다. GitLab용 Go 프록시를 사용하면 GitLab의 모든 프로젝트를 Go 프록시 프로토콜로 가져올 수 있습니다. GitLab용 Go 프록시는 실험 기능이며, 대규모 리포지터리에서 성능 문제가 발생할 수 있어 프로덕션 사용에는 적합하지 않습니다.

히스토리
Warning

이 기능은 GitLab 19.1에서 사용 중단되었으며 20.0에서 제거될 예정입니다. 사용할 수 있게 되면 Go 가상 레지스트리를 대신 사용합니다.

GitLab용 Go 프록시를 사용하면 GitLab의 모든 프로젝트를 Go 프록시 프로토콜로 가져올 수 있습니다.

GitLab용 Go 프록시는 실험 기능이며, 대규모 리포지터리에서 성능 문제가 발생할 수 있어 프로덕션 사용에는 적합하지 않습니다. 이슈 218083을 참고합니다.

GitLab은 Go 프록시가 활성화되어 있더라도 패키지 레지스트리에 Go 모듈을 표시하지 않습니다. 이슈 213770을 참고합니다.

Go 프록시가 사용하는 구체적인 API 엔드포인트에 대한 문서는 Go 프록시 API 문서를 참고합니다.

GitLab을 Go 프록시로 추가#

GitLab을 Go 프록시로 사용하려면 Go 1.13 이상을 사용해야 합니다.

사용할 수 있는 프록시 엔드포인트는 프로젝트별로 모듈을 가져오는 /api/v4/projects/:id/packages/go 입니다.

GitLab에서 Go 모듈을 가져오려면 프로젝트별 엔드포인트를 GOPROXY에 추가합니다.

Go는 해당 엔드포인트에 질의한 뒤 기본 동작으로 돌아갑니다.

go env -w GOPROXY='https://gitlab.example.com/api/v4/projects/1234/packages/go,https://proxy.golang.org,direct'

이렇게 구성하면 Go는 다음 순서로 의존성을 가져옵니다.

  1. Go가 프로젝트별 Go 프록시에서 가져오기를 시도합니다.
  2. Go가 proxy.golang.org에서 가져오기를 시도합니다.
  3. Go가 버전 관리 시스템 작업(git clone, svn checkout 등)으로 직접 가져옵니다.

GOPROXY를 지정하지 않으면 Go는 2단계와 3단계를 수행하며, 이는 GOPROXY를 https://proxy.golang.org,direct로 설정한 것과 같습니다. GOPROXY에 프로젝트별 엔드포인트만 있으면 Go는 해당 엔드포인트에만 질의합니다.

Go 환경 변수를 설정하는 방법은 환경 변수 설정을 참고합니다.

프라이빗 프로젝트에서 모듈 가져오기#

go는 보안되지 않은 연결로 자격 증명을 전송하는 것을 지원하지 않습니다. 다음 단계는 GitLab이 HTTPS로 구성된 경우에만 동작합니다.

  1. GitLab용 Go 프록시에서 가져올 때 HTTP 기본 인증 자격 증명을 포함하도록 Go를 구성합니다.
  2. 공개 체크섬 데이터베이스에서 프라이빗 GitLab 프로젝트의 체크섬을 내려받지 않도록 Go를 구성합니다.

요청 인증 활성화#

범위를 api 또는 read_api로 설정한 개인 액세스 토큰을 만듭니다.

~/.netrc 파일을 열고 다음 내용을 추가합니다. < > 안의 변수는 실제 값으로 바꿉니다.

HTTP 자격 증명이 올바르지 않은 상태로 go get을 요청하면 404 오류가 발생합니다.

Warning

NETRC라는 환경 변수를 사용하면 Go는 그 값을 파일 이름으로 사용하고 ~/.netrc는 무시합니다. GitLab CI/CD에서 ~/.netrc를 사용할 계획이라면 NETRC를 환경 변수 이름으로 사용하지 않습니다.

machine <url> login <username> password <token>
  • <url>: GitLab URL입니다. 예를 들면 gitlab.com 입니다.
  • <username>: 사용자 이름입니다.
  • <token>: 개인 액세스 토큰입니다.

체크섬 데이터베이스 쿼리 비활성화#

Go 1.13 이상에서 의존성을 내려받으면 가져온 소스를 체크섬 데이터베이스 sum.golang.org와 대조해 검증합니다.

가져온 소스의 체크섬이 데이터베이스의 체크섬과 일치하지 않으면 Go는 해당 의존성을 빌드하지 않습니다.

sum.golang.org는 프라이빗 모듈의 소스를 가져올 수 없어 체크섬을 제공하지 못하므로 프라이빗 모듈은 빌드에 실패합니다.

이 문제를 해결하려면 GONOSUMDB에 프라이빗 프로젝트를 쉼표로 구분해 설정합니다. Go 환경 변수 설정 방법은 환경 변수 설정을 참고합니다.

예를 들어 gitlab.com/my/project의 체크섬 질의를 비활성화하려면 GONOSUMDB를 다음과 같이 설정합니다.

go env -w GONOSUMDB='gitlab.com/my/project,<previous value>'

Go 작업#

Go의 의존성 관리나 Go 자체에 익숙하지 않다면 다음 문서를 참고합니다.

환경 변수 설정#

Go는 여러 기능을 제어하는 데 환경 변수를 사용합니다. 이 변수들은 일반적인 방식으로 관리할 수 있습니다. 다만 Go 1.14는 Go 환경 변수를 전용 Go 환경 파일에서 읽고 쓰며, 그 기본 위치는 ~/.go/env 입니다.

  • GOENV가 파일로 설정되어 있으면 Go는 대신 그 파일에서 읽고 씁니다.
  • GOENV는 설정되어 있지 않고 GOPATH가 설정되어 있으면 Go는 $GOPATH/env에서 읽고 씁니다.

Go 환경 변수는 go env <var>로 읽을 수 있고, Go 1.14 이상에서는 go env -w <var>=<value>로 쓸 수 있습니다. 예를 들면 go env GOPATH 또는 go env -w GOPATH=/go 입니다.

모듈 릴리스#

Go 모듈과 모듈 버전은 Git, SVN, Mercurial 같은 소스 리포지터리로 정의됩니다. 모듈은 go.mod와 Go 파일이 들어 있는 리포지터리입니다. 모듈 버전은 버전 관리 시스템(VCS) 태그로 정의됩니다.

모듈을 게시하려면 go.mod와 소스 파일을 VCS 리포지터리에 푸시합니다. 모듈 버전을 게시하려면 VCS 태그를 푸시합니다.

GitLab용 Go 프록시 (지원 중단됨)

GitLab v19.5
Tier: Free, Premium, Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기

요약

이 기능은 GitLab 19.1에서 사용 중단되었으며 20.0에서 제거될 예정입니다. GitLab용 Go 프록시를 사용하면 GitLab의 모든 프로젝트를 Go 프록시 프로토콜로 가져올 수 있습니다. GitLab용 Go 프록시는 실험 기능이며, 대규모 리포지터리에서 성능 문제가 발생할 수 있어 프로덕션 사용에는 적합하지 않습니다.

히스토리
Warning

이 기능은 GitLab 19.1에서 사용 중단되었으며 20.0에서 제거될 예정입니다. 사용할 수 있게 되면 Go 가상 레지스트리를 대신 사용합니다.

GitLab용 Go 프록시를 사용하면 GitLab의 모든 프로젝트를 Go 프록시 프로토콜로 가져올 수 있습니다.

GitLab용 Go 프록시는 실험 기능이며, 대규모 리포지터리에서 성능 문제가 발생할 수 있어 프로덕션 사용에는 적합하지 않습니다. 이슈 218083을 참고합니다.

GitLab은 Go 프록시가 활성화되어 있더라도 패키지 레지스트리에 Go 모듈을 표시하지 않습니다. 이슈 213770을 참고합니다.

Go 프록시가 사용하는 구체적인 API 엔드포인트에 대한 문서는 Go 프록시 API 문서를 참고합니다.

GitLab을 Go 프록시로 추가#

GitLab을 Go 프록시로 사용하려면 Go 1.13 이상을 사용해야 합니다.

사용할 수 있는 프록시 엔드포인트는 프로젝트별로 모듈을 가져오는 /api/v4/projects/:id/packages/go 입니다.

GitLab에서 Go 모듈을 가져오려면 프로젝트별 엔드포인트를 GOPROXY에 추가합니다.

Go는 해당 엔드포인트에 질의한 뒤 기본 동작으로 돌아갑니다.

go env -w GOPROXY='https://gitlab.example.com/api/v4/projects/1234/packages/go,https://proxy.golang.org,direct'

이렇게 구성하면 Go는 다음 순서로 의존성을 가져옵니다.

  1. Go가 프로젝트별 Go 프록시에서 가져오기를 시도합니다.
  2. Go가 proxy.golang.org에서 가져오기를 시도합니다.
  3. Go가 버전 관리 시스템 작업(git clone, svn checkout 등)으로 직접 가져옵니다.

GOPROXY를 지정하지 않으면 Go는 2단계와 3단계를 수행하며, 이는 GOPROXY를 https://proxy.golang.org,direct로 설정한 것과 같습니다. GOPROXY에 프로젝트별 엔드포인트만 있으면 Go는 해당 엔드포인트에만 질의합니다.

Go 환경 변수를 설정하는 방법은 환경 변수 설정을 참고합니다.

프라이빗 프로젝트에서 모듈 가져오기#

go는 보안되지 않은 연결로 자격 증명을 전송하는 것을 지원하지 않습니다. 다음 단계는 GitLab이 HTTPS로 구성된 경우에만 동작합니다.

  1. GitLab용 Go 프록시에서 가져올 때 HTTP 기본 인증 자격 증명을 포함하도록 Go를 구성합니다.
  2. 공개 체크섬 데이터베이스에서 프라이빗 GitLab 프로젝트의 체크섬을 내려받지 않도록 Go를 구성합니다.

요청 인증 활성화#

범위를 api 또는 read_api로 설정한 개인 액세스 토큰을 만듭니다.

~/.netrc 파일을 열고 다음 내용을 추가합니다. < > 안의 변수는 실제 값으로 바꿉니다.

HTTP 자격 증명이 올바르지 않은 상태로 go get을 요청하면 404 오류가 발생합니다.

Warning

NETRC라는 환경 변수를 사용하면 Go는 그 값을 파일 이름으로 사용하고 ~/.netrc는 무시합니다. GitLab CI/CD에서 ~/.netrc를 사용할 계획이라면 NETRC를 환경 변수 이름으로 사용하지 않습니다.

machine <url> login <username> password <token>
  • <url>: GitLab URL입니다. 예를 들면 gitlab.com 입니다.
  • <username>: 사용자 이름입니다.
  • <token>: 개인 액세스 토큰입니다.

체크섬 데이터베이스 쿼리 비활성화#

Go 1.13 이상에서 의존성을 내려받으면 가져온 소스를 체크섬 데이터베이스 sum.golang.org와 대조해 검증합니다.

가져온 소스의 체크섬이 데이터베이스의 체크섬과 일치하지 않으면 Go는 해당 의존성을 빌드하지 않습니다.

sum.golang.org는 프라이빗 모듈의 소스를 가져올 수 없어 체크섬을 제공하지 못하므로 프라이빗 모듈은 빌드에 실패합니다.

이 문제를 해결하려면 GONOSUMDB에 프라이빗 프로젝트를 쉼표로 구분해 설정합니다. Go 환경 변수 설정 방법은 환경 변수 설정을 참고합니다.

예를 들어 gitlab.com/my/project의 체크섬 질의를 비활성화하려면 GONOSUMDB를 다음과 같이 설정합니다.

go env -w GONOSUMDB='gitlab.com/my/project,<previous value>'

Go 작업#

Go의 의존성 관리나 Go 자체에 익숙하지 않다면 다음 문서를 참고합니다.

환경 변수 설정#

Go는 여러 기능을 제어하는 데 환경 변수를 사용합니다. 이 변수들은 일반적인 방식으로 관리할 수 있습니다. 다만 Go 1.14는 Go 환경 변수를 전용 Go 환경 파일에서 읽고 쓰며, 그 기본 위치는 ~/.go/env 입니다.

  • GOENV가 파일로 설정되어 있으면 Go는 대신 그 파일에서 읽고 씁니다.
  • GOENV는 설정되어 있지 않고 GOPATH가 설정되어 있으면 Go는 $GOPATH/env에서 읽고 씁니다.

Go 환경 변수는 go env <var>로 읽을 수 있고, Go 1.14 이상에서는 go env -w <var>=<value>로 쓸 수 있습니다. 예를 들면 go env GOPATH 또는 go env -w GOPATH=/go 입니다.

모듈 릴리스#

Go 모듈과 모듈 버전은 Git, SVN, Mercurial 같은 소스 리포지터리로 정의됩니다. 모듈은 go.mod와 Go 파일이 들어 있는 리포지터리입니다. 모듈 버전은 버전 관리 시스템(VCS) 태그로 정의됩니다.

모듈을 게시하려면 go.mod와 소스 파일을 VCS 리포지터리에 푸시합니다. 모듈 버전을 게시하려면 VCS 태그를 푸시합니다.