Github ActionsでプライベートレポジトリのGoのパッケージを使えるようにする

SPONSORED LINK

背景

${{ secrets.GITHUB_TOKEN }} ではトークンの権限が不足していてプライベートレポジトリのパッケージをgo getできなかった。

何をしたか

Github ActionsのGo言語用のworkflowにある以下のジョブで失敗する。
プライベートレポジトリのパッケージがgo.modに指定しているため。

    - name: Get dependencies
      run: |
        go get -v -t -d ./...
        if [ -f Gopkg.toml ]; then
            curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
            dep ensure
        fi

対応として以下を差し込んでみた。

        git config --global url."https://${{ secrets.GITHUB_TOKEN }}:x-oauth-basic@github.com/norabal".insteadOf "https://github.com/norabal"
        export GOPRIVATE="github.com/norabal"
  • ローカル環境の場合は、${{ secrets.GITHUB_TOKEN }} に当たる箇所はrepoの権限を付加したGithub Personal Access Tokenを当て込んでいる。
  • 「invalid version: unknown revision v1.1.0」というエラーが出るので、GOPRIVATEの宣言を追加することで解決している

差し込んでみた後のgo.ymlがこちら。

    - name: Get dependencies
      run: |
        git config --global url."https://${{ secrets.GITHUB_TOKEN }}:x-oauth-basic@github.com/norabal".insteadOf "https://github.com/norabal"
        export GOPRIVATE="github.com/norabal"
        go get -v -t -d ./...
        if [ -f Gopkg.toml ]; then
            curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
            dep ensure
        fi

この状態でGithub Actionsが実行されると、

go: github.com/norabal/private-sdk@v1.1.0: reading github.com/norabal/private-sdk/go.mod at revision v1.1.0: unknown revision v1.1.0

となりエラー終了してしまう。

SPONSORED LINK

なぜか?

${{ secrets.GITHUB_TOKEN }} ではプライベートレポジトリにアクセスする権限が足りていない。
(そういう使い方をするものじゃないみたい)

解決策

GITHUB_TOKENで利用できない権限を要求するトークンが必要な場合は、個人アクセストークンを生成して、それをリポジトリのシークレットに設定できます。

GITHUB_TOKENの権限

ということで、コマンドライン用の個人アクセストークンを作成する を見ながら以下の作業をした。

  1. Settings -> Developers Setting -> Personal Access Token から”Repo”にチェックをつけたトークンを作成する
  2. 本レポジトリのSettings (オーナー権限のあるユーザーのみ表示される) -> Secrets にトークン文字列を値として登録。キー名は自由。今回はGO_MODULES_TOKENにしてみた。
  3. ${{ secrets.GO_MODULES_TOKEN }} としてgo.yml内で使用する。

「secrets.GITHUB_TOKEN」を書き換えたものが以下。

    - name: Get dependencies
      run: |
        git config --global url."https://${{ secrets.GO_MODULES_TOKEN }}:x-oauth-basic@github.com/norabal".insteadOf "https://github.com/norabal"
        export GOPRIVATE="github.com/norabal"
        go get -v -t -d ./...
        if [ -f Gopkg.toml ]; then
            curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
            dep ensure
        fi

これで無事にプライベートレポジトリで管理しているGoのパッケージがgo getされるようになった。