프로젝트를 Go 패키지로 사용하기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

전제 조건:

  • GitLab Go Proxy를 활성화하기 위해 관리자에게 문의하십시오.
  • Go 패키지로서 서브그룹의 개인 프로젝트를 사용하려면 Go 요청에 인증해야 합니다. 인증되지 않은 Go 요청은 go get 실행에 실패합니다. 서브그룹에 속해 있지 않은 프로젝트의 Go 요청에는 인증이 필요하지 않습니다.

프로젝트를 Go 패키지로 사용하려면 go getgodoc.org 검색 요청을 사용하십시오. 메타 태그를 사용할 수 있습니다:

개인 프로젝트에 대한 Go 요청 인증

전제 조건:

  • GitLab 인스턴스는 HTTPS로 액세스할 수 있어야 합니다.
  • read_api 스코프가 있는 개인 액세스 토큰이 있어야 합니다.

Go 요청을 인증하려면 다음 정보로 .netrc 파일을 만드십시오.

machine gitlab.example.com
login <gitlab_user_name>
password <personal_access_token>

Windows에서는 ~/.netrc 대신 ~/_netrc가 읽힙니다.

go 명령은 인증되지 않은 연결로 자격 증명을 전송하지 않습니다. Go에 의해 수행된 HTTPS 요청은 인증되지만, Git을 통해 수행된 요청은 인증되지 않습니다.

개인 Git 요청 인증

Go가 프록시로부터 모듈을 가져올 수 없는 경우 Git을 사용합니다. Git은 요청을 인증하기 위해 .netrc 파일을 사용하지만 다른 인증 방법을 구성할 수도 있습니다.

Git을 다음 중 하나로 구성하십시오:

  • 요청 URL에 자격 증명 삽입:

    git config --global url."https://${user}:${personal_access_token}@gitlab.example.com".insteadOf "https://gitlab.example.com"
    
  • HTTPS 대신 SSH 사용:

    git config --global url."git@gitlab.example.com:".insteadOf "https://gitlab.example.com/"
    

개인 프로젝트를 위한 Go 모듈 가져오기 비활성화

모듈 또는 패키지를 가져오기 위해 Go는 환경 변수를 사용합니다:

  • GOPRIVATE
  • GONOPROXY
  • GONOSUMDB

가져오기를 비활성화하려면:

  1. GOPRIVATE 비활성화:
    • 하나의 프로젝트에 대한 쿼리를 비활성화하려면 GOPRIVATE=gitlab.example.com/my/private/project을 비활성화하십시오.
    • GitLab.com의 모든 프로젝트에 대한 쿼리를 비활성화하려면 GOPRIVATE=gitlab.example.com을 비활성화하십시오.
  2. GONOPROXY에서 프록시 쿼리 비활성화.
  3. GONOSUMDB에서 체크섬 쿼리 비활성화.
  • 모듈 이름 또는 해당 접두사가 GOPRIVATE 또는 GONOPROXY에 있는 경우, Go는 모듈 프록시에 쿼리하지 않습니다.
  • 모듈 이름 또는 해당 접두사가 GONOPRIVATE 또는 GONOSUMDB에 있는 경우, 체크섬 데이터베이스에 쿼리하지 않습니다.

개인 서브그룹에 대한 Git 요청 인증

Go 모듈이 gitlab.com/namespace/subgroup/go-module과 같은 개인 서브그룹에 있을 때 Git 인증이 작동하지 않습니다. 이것은 go get이 인증되지 않은 요청을 만들어 저장소 경로를 찾는 데 실패하기 때문입니다. 인증되지 않은 사용자에게 프로젝트의 존재를 노출하는 보안 위험을 막기 위해 GitLab은 gitlab.com/namespace/subgroup.git으로 응답합니다. 결과적으로, 해당 Go 모듈을 다운로드할 수 없습니다.

불행하게도, Go는 .netrc 이외의 다른 요청 인증 수단을 제공하지 않습니다. 미래 버전에서는 Go가 임의의 인증 헤더 지원을 추가할 수 있습니다. 세부 사항은 golang/go#26232를 참고하세요.

해결책: 모듈 이름에 .git 사용하기

go get 요청을 건너뛰고 Go가 직접 Git 인증을 사용하도록 하려면 모듈 이름을 수정해야합니다.

모듈 경로에 VCS 한정자(.bzr, .fossil, .git, .hg, .svn 중 하나)가 있는 경우, go 명령은 해당 경로 한정자 앞까지를 저장소 URL로 사용합니다. 예를 들어, 모듈 example.com/foo.git/bar인 경우 go 명령은 Git을 사용하여 example.com/foo.git의 저장소를 다운로드하고, bar 하위 디렉토리에서 해당 모듈을 찾습니다.

Go 문서에서

  1. 개인 서브그룹의 Go 모듈의 go.mod로 이동합니다.
  2. 모듈 이름에 .git을 추가하십시오.
    예: module gitlab.com/namespace/subgroup/go-modulemodule gitlab.com/namespace/subgroup/go-module.git로 이름을 변경합니다.
  3. 이 변경사항을 커밋하고 푸시합니다.
  4. 이 모듈을 사용하는 Go 프로젝트를 방문하여 import 호출을 조정하십시오.
    예: import gitlab.com/namespace/subgroup/go-module.git.

이 변경 후에 Go 모듈이 올바르게 가져와져야 합니다. 예: GOPRIVATE=gitlab.com/namespace/* go mod tidy.

Geo 보조 사이트에서 Go 모듈 가져오기

Geo를 사용하여 보조 Geo 서버에서 Go 모듈을 포함하는 Git 저장소에 액세스합니다.

Geo 보조 서버에 액세스하려면 SSH 또는 HTTP를 사용할 수 있습니다.

SSH를 사용하여 Geo 보조 서버에 액세스

SSH를 사용하여 Geo 보조 서버에 액세스하려면:

  1. 클라이언트의 Git을 다시 구성하여 기본을 보조로 보내도록 설정합니다.

    git config --global url."git@gitlab-secondary.example.com".insteadOf "https://gitlab.example.com"
    git config --global url."git@gitlab-secondary.example.com".insteadOf "http://gitlab.example.com"
    
    • gitlab.example.com에 대해 기본 사이트 도메인 이름을 사용합니다.
    • gitlab-secondary.example.com에 대해 보조 사이트 도메인 이름을 사용합니다.
  2. 클라이언트가 GitLab 저장소에 대한 SSH 액세스를 설정했는지 확인합니다. 이를 기본 사이트에서 테스트할 수 있으며, GitLab은 공개 키를 보조 사이트로 복제합니다.

go get 요청은 주요 Geo 서버에 HTTP 트래픽을 생성합니다. 모듈 다운로드가 시작되면 insteadOf 구성이 트래픽을 보조 Geo 서버로 보냅니다.

HTTP를 사용하여 Geo 보조에 액세스

지속적으로 보조 서버로 복제되는 액세스 토큰을 사용해야 합니다. CI/CD 작업 토큰을 사용하여 HTTP로 Go 모듈을 가져올 수 없습니다.

Geo 보조 서버에 HTTP를 사용하여 액세스하려면:

  1. 클라이언트에 Git insteadOf 리디렉션을 추가합니다.

    git config --global url."https://gitlab-secondary.example.com".insteadOf "https://gitlab.example.com"
    
    • gitlab.example.com에 대해 기본 사이트 도메인 이름을 사용합니다.
    • gitlab-secondary.example.com에 대해 보조 사이트 도메인 이름을 사용합니다.
  2. 개인 액세스 토큰을 생성하고 클라이언트의 ~/.netrc 파일에 자격 증명을 추가합니다.

    machine gitlab.example.com login USERNAME password TOKEN
    machine gitlab-secondary.example.com login USERNAME password TOKEN
    

go get 요청은 주요 Geo 서버에 HTTP 트래픽을 생성합니다. 모듈 다운로드가 시작되면 insteadOf 구성이 트래픽을 보조 Geo 서버로 보냅니다.