📦

GitHub Actions で private リポジトリを yarn で依存解決する

2020/10/07に公開

環境

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 configAUTHORIZATION を更に設定しなおせば、private リポジトリにアクセスできるようになります。

まとめ

GitHub の private リポジトリにアクセストークンを使って npm の依存解決する場合で、 GitHub Actions 上で npm/yarn を実行する場合には、アクセストークンに気をつけよう。

Discussion