GitHub Actions で private リポジトリを yarn で依存解決する
環境
- yarn 1.22.10
- actions/checkout 2.0.2
GitHub の private リポジトリを yarn で解決する
GitHub の private リポジトリに npm モジュールを置いておいて、それを別のリポジトリから参照したいことがあります。
本来は GitHub Package Registry を使うのが良さそうですが、開発中で簡単に使いたい時に、アクセストークンを使って依存解決することがあります。
そういう時に GitHub Personal Token を package.json
に書いておけば、 private リポジトリに置いたモジュールでもいい感じに依存を解決することができます。
"dependencies": {
"<リポジトリ名>": "https://<パーソナルアクセストークン>:x-oauth-basic@github.com/<ユーザ名>/<リポジトリ名>.git#main"
},
ちなみに :x-oauth-basic
は省略可能です。
GitHub Actions で yarn install する
開発が進んで GitHub Actions で CI しようとします。
GitHub Actions のドキュメント を参考に以下のようなワークフローを書きます。
name: yarn
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- run: yarn install
この状態で push をすると以下のようなエラーが出て、なぜか private リポジトリの解決に失敗します。
remote: Repository not found.
fatal: repository 'https://github.com/<ユーザー名>/<リポジトリ名>.git/' not found
Error: Process completed with exit code 128.
ちなみに npm の場合も同様で以下のようなエラーメッセージが出て依存解決に失敗します。
npm ERR! remote: Repository not found.
npm ERR! fatal: repository 'https://github.com/<ユーザー名>/<リポジトリ名>.git/' not found
npm ERR!
npm ERR! exited with error code: 128
解決策
以下のように yarn install の直前に git config
を呼び出します。
- run: |
REPOSITORY_AUTHORIZATION="$(echo -n <パーソナルアクセストークン>:x-oauth-basic | base64)"
git config --local http.https://github.com/.extraheader "AUTHORIZATION: basic $REPOSITORY_AUTHORIZATION"
- run: yarn install
以降の git コマンドはパーソナルアクセストークンの権限で動くので注意してください。
何が起こっているか
GitHub Actions では、そのビルドでのみ有効な GitHub のアクセストークンが発行され、git config
によって、すべての Git コマンドで AUTHORIZATION
ヘッダーにそのアクセストークンが利用されます。
yarn は内部的には git コマンドを実行して、依存を解決するため、 package.json
に書かれたアクセストークンよりも GitHub Actions で設定されたアクセストークンが優先されてしまい、アクセスできないということが起こっています。
そのため、git config
で AUTHORIZATION
を更に設定しなおせば、private リポジトリにアクセスできるようになります。
まとめ
GitHub の private リポジトリにアクセストークンを使って npm の依存解決する場合で、 GitHub Actions 上で npm/yarn を実行する場合には、アクセストークンに気をつけよう。
Discussion