GitLab을 위한 Go 프록시

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated Status: Experiment
caution
GitLab을 위한 Go 패키지 레지스트리는 제한된 기능으로 인해 제품으로 사용할 준비가 되지 않았으며 개발 중입니다. 이 epic에서 제품으로 사용할 준비가 될 남은 작업 및 일정에 대해 자세히 설명되어 있습니다.

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

Go 프록시가 사용하는 특정 API 엔드포인트에 대한 문서는 Go 프록시 API 문서를 참조하세요.

Go 프록시 활성화

GitLab을 위한 Go 프록시는 개발 중이며 대규모 리포지터리에서의 잠재적 성능 문제 때문에 제품으로 사용할 준비가 되지 않았습니다 (https://gitlab.com/gitlab-org/gitlab/-/issues/218083).

기본적으로 피처 플래그 뒤에 배포되었으며 _기본적으로 비활성화_되어 있습니다.

GitLab 관리자는 GitLab Rails 콘솔에 액세스할 수 있습니다 Go 프록시를 인스턴스에 대해 활성화할 수 있습니다.

활성화하려면:

Feature.enable(:go_proxy) # 또는

비활성화하려면:

Feature.disable(:go_proxy)

특정 프로젝트에 대해 활성화 또는 비활성화하려면:

Feature.enable(:go_proxy, Project.find(1))
Feature.disable(:go_proxy, Project.find(2))
note
활성화되어 있더라도 GitLab은 패키지 레지스트리에 Go 모듈을 표시하지 않습니다. 자세한 내용은 이 이슈를 참조하세요.

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 프록시에서 가져오려고 시도합니다.
  2. proxy.golang.org에서 가져오려고 시도합니다.
  3. 버전 제어 시스템 작업(예: git clone, svn checkout 등)을 사용하여 직접 가져옵니다.

GOPROXY가 지정되지 않은 경우, Go는 단계 2와 3에 해당하는 https://proxy.golang.org,directGOPROXY를 설정합니다. GOPROXY가 프로젝트별 엔드포인트만 포함된 경우, Go는 해당 엔드포인트에만 쿼리합니다.

Go 환경 변수 설정 방법에 대한 자세한 내용은 환경 변수 설정을 참조하세요.

GOPROXY 구성에 대한 자세한 내용은 Go의 의존성 관리 > 프록시를 참조하세요.

비공개 프로젝트에서 모듈 가져오기

go는 보안 연결을 통해 자격 증명을 전송하는 것을 지원하지 않습니다. 따라서 다음 단계는 GitLab이 HTTPS로 구성되어 있는 경우에만 작동합니다:

  1. Go를 구성하여 GitLab의 Go 프록시에서 가져올 때 HTTP 기본 인증 자격 증명을 포함하도록 합니다.
  2. Go를 구성하여 공개 체크섬 데이터베이스에서 비공개 GitLab 프로젝트의 체크섬 다운로드를 건너뛰도록 합니다.

요청 인증 활성화

api 또는 read_api로 설정된 개인 액세스 토큰을 생성합니다.

~/.netrc 파일을 열고 다음 텍스트를 추가합니다. < > 내 변수를 자신의 값으로 바꿉니다.

caution
NETRC라는 이름의 환경 변수가 있으면 Go는 그 값을 파일 이름으로 사용하고 ~/.netrc을 무시합니다. 만약 GitLab CI에서 ~/.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 환경 변수 설정에 대한 자세한 내용은 환경 변수 설정을 참조하세요. Go의 이 기능을 비활성화하는 자세한 내용은 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/env으로부터 Go 환경 변수를 읽거나 쓰기도 합니다.

  • 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 태그를 푸시하면 됩니다.

올바른 모듈 또는 모듈 버전의 컴포넌트에 대한 자세한 내용은 Go에서의 의존성 관리 > 버전 지정을 참조하십시오.