たとえば npm でプライベートなパッケージを作成していて、他のリポジトリのアプリがそのパッケージを利用しているとします。

プライベートなパッケージにアクセスするにはアクセストークンが必要です。

GitHub Actions を使う場合、トークンを GitHub Secrets に設定しておいて、ワークフローの中でそれを .npmrc に書き出して使用する、というような仕組みを使っていることが多いと思います。

しかしながら Dependabot がこのワークフローを実行すると失敗してしまいます。

これは Dependabot が Secrets にアクセスできないようになっているからです。

正確にいうと、以前はアクセスできていたようですが、2021 年の 3 月に GitHub Actions に仕様変更があり、現在は上記の仕様になっています。

対応策

Dependabot Secrets を使いましょう。

GitHub の Settings > Secrets のところを見ると以下の2つがあります。

  • Actions secrets
  • Dependabot secrets

このうちの Dependabot secrets が Dependabot がアクセスできるシークレットです。

例えば Actions secrets に ACCESS_TOKEN という名称でトークンを設定しているのであれば Dependabot secrets のほうにも同じ名前である ACCESS_TOKEN の名称でトークンを設定します。

こうしておけばワークフロー上で Dependabot 以外のユーザと Dependabot が同じ名称でアクセスできます。

実際は Dependabot 以外のユーザは Actions secrets の ACCESS_TOKEN を参照しており、他方 Dependabot は Dependabot secrets の ACCESS_TOKEN を参照しているで別物です。

しかしワークフロー上ではそれを意識する必要がなくなりますので、処理中に if 文を入れたりなどの手を加える必要もありません。

推奨されない対応策

ネット上で調べると別の解決策が見つかるかもしれません。

例えばワークフローの on: pull_requeston: pull_request_target に変更する、などです。

一時的に上記対応が提案された時期もありましたが、現在は Dependabot Secrets という仕組みが用意されているため、こちらを使いましょう。

推奨されない理由は、セキュリティ上のリスクがあるためです。

経緯

事態の発生経緯や一時的に提案された解決策などはすべて以下の ISSUE にまとまっています。

スレッドが長いですが、最後の方にある次のコメントにすべてがまとめられています。これは Dependabot の PM の方によるコメントです。

https://github.com/dependabot/dependabot-core/issues/3253#issuecomment-852541544

上記コメントを要約すると以下の通りです。

  • GitHub Actions のチームが仕様の変更を行い、Dependabot がワークフローを起動したとき(github.actor == "dependabot[bot]")は secrets にアクセスできないようにした。
  • これはセキュリティ対策のため必要だったこと。
  • Dependabot に secrets を参照させるには2つの手がある。
    1. pull_request_target を使う方法
    2. ワークフローを2つに分割する方法
  • ただし、どちらの対応を行った場合でも同様のセキュリティリスクがあるため、それを受け入れた上で使うほかない。

そして以降の追加コメントで以下の通り説明されています。

https://github.com/dependabot/dependabot-core/issues/3253#issuecomment-940182533

  • GitHub Actions のチームが機能を追加した。ワークフロー内で permissions を指定することでアクセス許可を明示できる。
  • さらに GitHub Actions は Dependabot が再び secrets にアクセスできる仕組みを現在開発中である。

コメントはここまでで終わっていますが、最後の「アクセスできる仕組みを現在開発中である」の結果が、冒頭で紹介した Dependabot Secrets です。

補足

紹介した ISSUE 内でも言及されていますが、今回の原因で失敗したワークフローを Re-Run すると、今度は成功します。

それは github.actor == "dependabot[bot]" ではなくなったためです。