emahiro/b.log

日々の勉強の記録とか育児の記録とか。

プライベートリポジトリを go get する

Overview

go get でプライベートリポジトリを fetch するのに、コケてその調査で時間を溶かすことが何度か重なったので対応方法について記載します。

またプライベートリポジトリに依存してるプロジェクトで Github Actions を回すときもプライベートリポジトリの取得部分でハマったのでそちらについても記載します。

プライベートリポジトリを go get する

何もしないままプライベートリポジトリを go get すると

go get -u github.com/PRIVATE_REPO
github.com/PRIVATE_REPO@vX.X.X: verifying module: github.com/PRIVATE_REPO: reading https://sum.golang.org/lookup/github.com/PRIVATE_REPO: 410 Gone
    server response: not found: github.com/PRIVATE_REPO: invalid version: unknown revision v0.0.1

というようにエラーが出て module を fetch することはできません。

これを解消するには以下の3つの設定を行います。

  • https の代わりに ssh を使用。
    • git config --add --global url."git@github.com:".insteadOf https://github.com
  • GOPROXY を direct に設定。
    • export GOPROXY=direct
  • GOPRIVATE にプライベートリポジトリを設定。
    • export GOPRIVATE=github.com/PRIVATE_REPO

Github Actions でプライベートリポジトリを go get する

Github Actions でも何もせずにプライベートリポジトリを pull しようとすると以下のエラーに遭遇してmodule を取得することができせん。

go: github.com/PRIVATE_REPO: invalid version: git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/* in /home/runner/go/pkg/mod/cache/vcs/3703b101c339d9fd970d99639a980444379be4a036303c73173fe24bc3ab8ac5: exit status 128:
    remote: Invalid username or password.
    fatal: Authentication failed for 'https://github.com/PRIVATE_REPO'

プライベートリポジトリを fetch するためには Actions がプライベートリポジトリへのアクセス権限を持っているが必要になります。
このため、Actions でビルドされるステップの中でビルドに使われているコンテナ内の git の設定でアクセス権を付与します。

アクセス権についてはプライベートリポジトリを見ることができるユーザーごとの Personal Access Token を取得します。 取得方法については Setting > Developer setting > Personal access token からユーザーごとのアクセストークンを払い出すことができます。この時に repo にチェックをつけて access token を生成し、それを Actions の secrets に加えます。

Actions を定義している yml には以下の設定が追加されます。

jobs:
  build:
    steps:
      - name: github private modules access
        run: git config --global url."https://${{ secrets.GO_MODULES_TOKEN }}:x-oauth-basic@github.com/".insteadOf "https://github.com/"

リポジトリの Settings > Secrets で生成した個人の Access Token を GO_MODULES_TOKEN を key にして追加します。

これで Github Actions 上でもプライベートリポジトリを fetch できるようになります。

See Also