gitlab ciとprivate goモジュールの設定


去年話しましたprivate repositories and Gitlab CI 我々の物語と同様に我々migrated to modules , その移行の間(そして、我々が我々のプロジェクトを組織する方法のため)我々は.git プライベートモジュールにはreplace ディレクティブgo.mod 明示的に、そのリポジトリの正確な位置を示します.
以下のようになります.
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 , and
  • .netrc
  • これには4つの変更が必要でした.
  • パーソナルアクセストークンを使用します.
  • 更新.gitlab-ci.yml 新しいトークンを適切に使用するには
  • 更新Dockerfile 定義する.netrc 設定、
  • 取り外しreplace ディレクティブgo.mod .
  • 個人アクセストークンの使用


    具体的には次のスコープを持つ新しいトークンが必要です.
  • read_api
  • repository_access
  • セキュリティのために、このトークンは新しいCI/CD environment variable , そのために二つの新しい変数を定義します:
  • GO_MODULES_USER gitlabのユーザ名と
  • GO_MODULES_PERSONAL_ACCESS_TOKEN 作成したトークンを表現します.
  • 使用する代わりに新しいトークンを定義する理由CI_JOB_TOKEN あれはtoken does not have enough permissions 呼び出し時に正しいリポジトリを決定するのに使用されるGitLab APIにアクセスするにはgo mod <xyz> 舞台裏で.

    更新。Gitlab CI新しいトークンを正しく使用するには


    置換docker build 新しい変数を渡す命令は、こうするべきです.
    docker build \
      --build-arg CI_JOB_TOKEN
    
    次のように変更できます.
    docker build \
      --build-arg GO_MODULES_USER
      --build-arg GO_MODULES_PERSONAL_ACCESS_TOKEN
    

    dockerfileを更新するには.NETRC構成


    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画像に格納されて格納されていない知っている

    置換ディレクティブをGoで削除します。mod。


    最後に最後のステップはそれらを取り除く.git replaceディレクティブ:
    require (
        private.gitlab.instance/project/team/service-name v1.0.0
    )
    
    そして、我々はよく知られているgo get/mod ワークフロー!