背景
${{ 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
となりエラー終了してしまう。
なぜか?
${{ secrets.GITHUB_TOKEN }}
ではプライベートレポジトリにアクセスする権限が足りていない。
(そういう使い方をするものじゃないみたい)
解決策
GITHUB_TOKEN
で利用できない権限を要求するトークンが必要な場合は、個人アクセストークンを生成して、それをリポジトリのシークレットに設定できます。GITHUB_TOKEN
の権限
ということで、コマンドライン用の個人アクセストークンを作成する を見ながら以下の作業をした。
- Settings -> Developers Setting -> Personal Access Token から”Repo”にチェックをつけたトークンを作成する
- 本レポジトリのSettings (オーナー権限のあるユーザーのみ表示される) -> Secrets にトークン文字列を値として登録。キー名は自由。今回は
GO_MODULES_TOKEN
にしてみた。 ${{ 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されるようになった。