프로젝트를 Go 패키지로 사용
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
프로젝트를 Go 패키지로 사용하려면 go get 및 godoc.org 디스커버리 요청을 사용합니다. 유효하지 않은 HTTP 자격 증명으로 go get 요청을 보내면 404 오류를 받습니다. Go 1.24 이상에서는 GOAUTH 환경 변수를 사용해 사용자 지정 명령으로 자격 증명을 제공합니다.
히스토리
- GitLab 17.3에서 권한이 없는
go get요청에 404 오류를 반환하도록 변경되었습니다. - GitLab 19.4에서 세분화된 개인 액세스 토큰을 지원하도록 변경되었습니다.
사전 요건:
- 하위 그룹의 비공개 프로젝트를 Go 패키지로 사용하려면 Go 요청을 인증해야 합니다. 인증되지 않은 Go 요청은
go get실패로 이어집니다. 하위 그룹에 속하지 않은 프로젝트는 Go 요청을 인증할 필요가 없습니다.
프로젝트를 Go 패키지로 사용하려면 go get 및 godoc.org 디스커버리 요청을 사용합니다. 다음 메타 태그를 사용할 수 있습니다.
유효하지 않은 HTTP 자격 증명으로 go get 요청을 보내면 404 오류를 받습니다.
HTTP 자격 증명은 ~/.netrc(MacOS 및 Linux) 또는 ~/_netrc(Windows)에서 확인할 수 있습니다.
Go 1.24 이상에서는 GOAUTH 환경 변수로 자격 증명을 제공할 수도 있습니다.
자세한 내용은 GOAUTH로 인증을 참고합니다.
비공개 프로젝트에 대한 Go 요청 인증#
사전 요건:
- GitLab 인스턴스에 HTTPS로 접근할 수 있어야 합니다.
- 다음 중 하나가 있어야 합니다.
read_api스코프를 가진 개인 액세스 토큰.- 해당 프로젝트로 범위가 지정되고 Code 리소스에 대한 Download 권한을 가진 세분화된 개인 액세스 토큰.
GOAUTH로 인증하기#
Go 1.24 이상에서는
GOAUTH 환경 변수를
사용해 사용자 지정 명령으로 자격 증명을 제공합니다.
GOAUTH의 git dir 값은 깊이가 1을 넘는 중첩 하위 그룹의 비공개 프로젝트에서는
동작하지 않습니다. 대신 사용자 지정 명령을 사용합니다.
GOAUTH로 인증하려면 Go 요청에 HTTP 기본 인증 헤더를 추가하는 사용자 지정 명령을
만듭니다. 다음 예시는 git credential fill 이 반환하는 HTTPS 기반 Git 자격 증명을 사용해
gitlab.com에 대한 요청을 인증합니다.
#!/usr/bin/env bash
GITLAB_URL="https://gitlab.com"
creds=$(echo "url=${GITLAB_URL}" | git credential fill 2>&1) || {
printf >&2 'error: git credential fill failed:\n%s\n' "$creds"
exit 1
}
username=""
password=""
while IFS='=' read -r key value; do
case "$key" in
username) username="$value" ;;
password) password="$value" ;;
esac
done <<< "$creds"
if [ -z "$username" ] || [ -z "$password" ]; then
printf >&2 'error: git credential fill did not return a username or password for %s\n' "$GITLAB_URL"
exit 1
fi
encoded=$(printf '%s:%s' "$username" "$password" | base64 | tr -d '\n')
# Expected output format: https://pkg.go.dev/cmd/go@master#hdr-GOAUTH_environment_variable
printf '%s\n\nAuthorization: Basic %s\n\n' "$GITLAB_URL" "$encoded"
이 스크립트를 사용하려면 다음 단계를 따릅니다.
-
스크립트를 파일로 저장합니다. 예를 들어
gitlab_goauth.sh로 저장합니다. -
파일에 실행 권한을 부여합니다.
chmod +x gitlab_goauth.sh -
GOAUTH환경 변수를 해당 명령의 절대 경로로 설정합니다.export GOAUTH="<absolute_path_to_your_command>"
기존 .netrc 파일을 GOAUTH와 함께 사용하려면 다음과 같이 설정합니다.
export GOAUTH="netrc"
.netrc로 인증하기#
.netrc 파일로 Go 요청을
인증하려면 다음 내용으로
파일을 만듭니다.
machine gitlab.example.com
login <gitlab_user_name>
password <personal_access_token>
Windows에서 Go는 ~/.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는 모듈이나 패키지를 가져올 때 다음 환경 변수를 사용합니다.
GOPRIVATEGONOPROXYGONOSUMDB
페칭을 비활성화하려면 다음 단계를 따릅니다.
GOPRIVATE를 비활성화합니다.- 한 프로젝트의 쿼리를 비활성화하려면
GOPRIVATE=gitlab.example.com/my/private/project를 비활성화합니다. - GitLab.com의 모든 프로젝트에 대한 쿼리를 비활성화하려면
GOPRIVATE=gitlab.example.com을 비활성화합니다.
- 한 프로젝트의 쿼리를 비활성화하려면
GONOPROXY에서 프록시 쿼리를 비활성화합니다.GONOSUMDB에서 체크섬 쿼리를 비활성화합니다.
- 모듈 이름이나 그 접두사가
GOPRIVATE또는GONOPROXY에 있으면 Go는 모듈 프록시에 쿼리하지 않습니다. - 모듈 이름이나 그 접두사가
GOPRIVATE또는GONOSUMDB에 있으면 Go는 체크섬 데이터베이스에 쿼리하지 않습니다.
비공개 하위 그룹에 대한 Git 요청 인증#
Go 모듈이 gitlab.com/namespace/subgroup/go-module처럼 비공개 하위 그룹 아래에 있으면
Git 인증이 동작하지 않습니다.
go get 이 리포지터리 경로를 찾기 위해 인증되지 않은 요청을
보내기 때문입니다.
인증이 없으면 GitLab은 인증되지 않은 사용자에게 프로젝트의 존재가 노출되는
보안 위험을 막기 위해 gitlab.com/namespace/subgroup.git으로
응답합니다.
그 결과 Go 모듈을 내려받을 수 없습니다.
비공개 하위 그룹의 Go 모듈을 내려받으려면 Go 인증을 구성할 수 있습니다.
해결 방법: 모듈 이름에 .git 사용#
go get 요청을 건너뛰고 Go가 Git 인증을 직접 사용하도록 강제하는 방법이 있지만,
모듈 이름을 수정해야 합니다. Go 문서의 설명은 다음과 같습니다.
모듈 경로의 경로 구성 요소 끝에 VCS 한정자(
.bzr,.fossil,.git,.hg,.svn중 하나)가 있으면, go 명령은 해당 경로 한정자까지의 전체를 리포지터리 URL로 사용합니다. 예를 들어 모듈example.com/foo.git/bar의 경우 go 명령은 Git을 사용해example.com/foo.git리포지터리를 내려받고, bar 하위 디렉터리에서 모듈을 찾습니다.
- 비공개 하위 그룹에 있는 Go 모듈의
go.mod로 이동합니다. - 모듈 이름에
.git을 추가합니다. 예를 들어module gitlab.com/namespace/subgroup/go-module을module gitlab.com/namespace/subgroup/go-module.git으로 변경합니다. - 이 변경 사항을 커밋하고 푸시합니다.
- 이 모듈에 의존하는 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 보조 서버에 접근하려면 다음 단계를 따릅니다.
-
기본 사이트로 향하는 트래픽을 보조 사이트로 보내도록 클라이언트의 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에는 보조 사이트 도메인 이름을 사용합니다.
-
클라이언트가 GitLab 리포지터리에 SSH로 접근하도록 설정되어 있는지 확인합니다. 기본 사이트에서 이를 테스트할 수 있으며, GitLab이 공개 키를 보조 사이트로 복제합니다.
go get 요청은 기본 Geo 서버로 HTTP 트래픽을 생성합니다. 모듈 다운로드가
시작되면 insteadOf 구성이 트래픽을 보조 Geo 서버로 보냅니다.
HTTP를 사용하여 Geo 보조 서버 접근#
보조 서버로 복제되는 영구 액세스 토큰을 사용해야 합니다. HTTP로 Go 모듈을 가져올 때는 CI/CD job 토큰을 사용할 수 없습니다.
HTTP로 Geo 보조 서버에 접근하려면 다음 단계를 따릅니다.
-
클라이언트에 Git
insteadOf리디렉션을 추가합니다.git config --global url."https://gitlab-secondary.example.com".insteadOf "https://gitlab.example.com"gitlab.example.com에는 기본 사이트 도메인 이름을 사용합니다.gitlab-secondary.example.com에는 보조 사이트 도메인 이름을 사용합니다.
-
개인 액세스 토큰을 생성하고 클라이언트의
~/.netrc파일에 자격 증명을 추가합니다.machine gitlab.example.com login USERNAME password TOKEN machine gitlab-secondary.example.com login USERNAME password TOKEN
go get 요청은 기본 Geo 서버로 HTTP 트래픽을 생성합니다. 모듈 다운로드가
시작되면 insteadOf 구성이 트래픽을 보조 Geo 서버로 보냅니다.