Gitlab CI 및 Private Go 모듈 구성

6797 단어 go
작년에 나는 private repositories and Gitlab CI에 대해 이야기했고 우리가 migrated to modules 마이그레이션하는 동안 (그리고 우리가 프로젝트를 구성하는 방식 때문에) 우리는 개인 모듈에 .git를 추가하기 시작하고 replace 지시어는 Go가 해당 저장소의 정확한 위치를 명시적으로 나타내도록 합니다.

다음과 같은 것:

require (
    private.gitlab.instance/project/team/service-name v1.0.0
)

replace (
    private.gitlab.instance/project/team/service-name => private.gitlab.instance/project/team/service-name.git v1.0.0
)


그 워크플로는 관용적이지 않고 번거로웠으며 내부 종속성 업그레이드를 평소보다 더 어렵게 만들었습니다.

그러나 더 많은 조사를 한 후에 다음을 사용하는 것과 관련된 더 좋은 대안이 있다는 것을 깨달았습니다.

  • Gitlab's Personal Access Tokens
  • go.mod

  • 여기에는 4가지 변경이 필요했습니다.
  • 개인 액세스 토큰 사용,
  • 새 토큰을 올바르게 사용하기 위해 .netrc 업데이트 중,
  • .gitlab-ci.yml 구성을 정의하기 위해 Dockerfile 업데이트 및
  • .netrc에서 replace 지시문을 제거합니다.

  • 개인 액세스 토큰 사용



    특히 다음 범위의 새 토큰이 필요합니다.
  • go.mod
  • read_api

  • 보안 문제를 위해 이 토큰은 new CI/CD environment variable 로 정의되며 이를 위해 두 개의 새 변수를 정의합니다.

  • Gitlab 사용자 이름을 나타내는 repository_access
  • GO_MODULES_USER 방금 만든 토큰을 나타냅니다.
  • GO_MODULES_PERSONAL_ACCESS_TOKEN를 사용하는 대신 새 토큰을 정의하는 이유는 백그라운드에서 CI_JOB_TOKEN를 호출할 때 올바른 저장소를 결정하는 데 사용되는 Gitlab API에 액세스하기 위한 이token does not have enough permissions 때문입니다.

    새 토큰을 올바르게 사용하도록 go mod <xyz> 업데이트


    .gitlab-ci.yml 명령어를 교체하여 새 변수를 전달하면 다음과 같이 됩니다.

    docker build \
      --build-arg CI_JOB_TOKEN
    


    다음과 같이 변경할 수 있습니다.

    docker build \
      --build-arg GO_MODULES_USER
      --build-arg GO_MODULES_PERSONAL_ACCESS_TOKEN
    


    Dockerfile 구성을 정의하기 위해 Docker 빌드 업데이트



    Dockerfile은 다음과 같이 변경됩니다.

    FROM golang:1.15.0-alpine3.12
    
    ARG GO_MODULES_USER
    ARG GO_MODULES_PERSONAL_ACCESS_TOKEN
    
    WORKDIR /project-name/
    
    RUN go env -w GOPRIVATE="private.gitlab.instance" && \
        echo -e "machine private.gitlab.instance\nlogin ${GO_MODULES_USER}\npassword ${GO_MODULES_PERSONAL_ACCESS_TOKEN}" > ~/.netrc
    
    COPY ["go.mod", "go.sum", "./"]
    RUN go mod download
    
    COPY . .
    
    #-
    
    FROM golang:1.15.0-alpine3.12
    
    WORKDIR /project-name/
    
    ENV PATH=/go/bin/:$PATH
    
    COPY --from=0 /project-name/ /project-name/
    COPY --from=0 /go/ /go/
    


    다단계 빌드 덕분에 빌드 중인 최종 Docker 이미지에 자격 증명이 저장되지 않는다는 것을 확실히 알 수 있습니다.

    replace 에서 .netrc 지시문을 제거합니다.



    마지막으로 마지막 단계는 대체 지시문go.mod을 제거하는 것입니다.

    require (
        private.gitlab.instance/project/team/service-name v1.0.0
    )
    


    이제 잘 알려진.git 작업 흐름으로 돌아갑니다!


    좋은 웹페이지 즐겨찾기