📦

GitHub Actionでprivateリポジトリをnpm installすると「Repository not found.」エラーになる

2021/05/20に公開

はじめに

GitHub Action 上で、GitHub の private リポジトリを記載した package.json をnpm installしたら、「Repository not found.」エラーになり、困ったので備忘録。

なお、python のpip installでは今回の対応をしなくても問題は発生せず、npm installでは発生した。

動作環境

  • GitHub Action
  • Node.js 14.x

前提

  • private リポジトリのインストールにはgit+httpsを利用
    package.json
    ・・・
    "dependencies": {
        "package name": "git+https://github.com/YOUR-USERNAME/YOUR-REPOSITORY",
    }
    ・・・
    
  • ~/.netrc を利用
    ~/.netrc
    machine github.com
    login アカウント名
    password Personal access token
    

結論

actions/checkout@v2の with 句で persist-credentialsfalseに設定する。

修正前後の workflow

修正前

workflow.yml
    ・・・
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [14.x]
    steps:
      - uses: actions/checkout@v2
      - name: Setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        env:
          MACHINE_USER: workflowで利用するユーザ名
          ACCESS_TOKEN: ${{ secrets.MACHINE_USER_TOKEN }} <- GitHubのSecretsに登録したPersonal access token
        run: |
          touch ~/.netrc
          echo "machine github.com" > ~/.netrc
          echo "login $MACHINE_USER" >> ~/.netrc
          echo "password $ACCESS_TOKEN" >> ~/.netrc
          chmod 600 ~/.netrc
          npm install
      - name: Clean up
        run: |
          rm ~/.netrc
        if: ${{ always() }}
    ・・・

修正後

workflow.yml
    ・・・
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [14.x]
    steps:
      - uses: actions/checkout@v2
+       with:
+         persist-credentials: false
      - name: Setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        env:
          MACHINE_USER: Personal access tokenを持つユーザ名
          ACCESS_TOKEN: ${{ secrets.MACHINE_USER_TOKEN }}
        run: |
          touch ~/.netrc
          echo "machine github.com" > ~/.netrc
          echo "login $MACHINE_USER" >> ~/.netrc
          echo "password $ACCESS_TOKEN" >> ~/.netrc
          chmod 600 ~/.netrc
          npm install
      - name: Clean up
        run: |
          rm ~/.netrc
        if: ${{ always() }}
    ・・・

何が問題だったのか?

persist-credentialsの説明を見ると、

# Whether to configure the token or SSH key with the local git config
# Default: true

とあるから、trueだとローカルの設定が優先されて、
~/.netrcが存在していても、提供された GITHUB_TOKEN シークレットしか使わないということだろうか。

まとめ

たったこの 2 行にたどり着くために、どれだけネットをさまよい、いろいろ試してみたことか。。。
同じようにハマっている人の助けになれば、幸いです。

参考

https://github.com/actions/checkout#usage
https://docs.github.com/ja/actions/reference/authentication-in-a-workflow

Discussion