GitHub Actions:gh の「set the GH_TOKEN environment variable」
GitHub CLI がトークンを見つけられませんでした。gh はジョブのトークンを自分では拾いません。ステップの環境から GH_TOKEN、次に GITHUB_TOKEN を読むだけで(gh help environment)、actions/checkout が git のために保存する認証情報は読みません。トークンが無く、GITHUB_ACTIONS が true のときに gh はこの文を出し(help.go)、「認証が要る」を表す 4 で終わります。直しは1行ですが、最近の多くのケースでは、その行は書いてあって値が空でした。
見え方
gh: To use GitHub CLI in a GitHub Actions workflow, set the GH_TOKEN environment variable. Example:
env:
GH_TOKEN: ${{ github.token }}
Error: Process completed with exit code 4.
1. そのステップにトークンが無い
ステップに書くか、すべてのステップに行き渡るようにジョブに書きます。Blur-AutoClicker-arch は、めったに通らない分岐の gh のステップの1つにトークンが無かったので、ジョブに移しました(#3)。
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
env:
GH_TOKEN: ${{ github.token }}
steps:
- uses: actions/checkout@v7
- run: gh release create "$GITHUB_REF_NAME" --generate-notes
github.token は secrets.GITHUB_TOKEN と同じトークンです。コマンドに要る権限をジョブに与えます:リリースには contents: write、gh pr create には pull-requests: write、gh issue create には issues: write。
2. 行はあるのに、値が空
その実行に渡らないシークレットを指す式は空の文字列になり、空の GH_TOKEN はトークンが無いのと同じです。vbonk/repo-template では、GH_TOKEN: ${{ secrets.PROJECT_TOKEN }} の後ろにシークレットが無く、直近の100回の実行が100回とも失敗していました(#190)。よくある理由:
- シークレットを作っていない。または、ジョブが使っていない environment の中にある。
- フォークからのプルリクエストにはシークレットが渡らず、Dependabot には Dependabot のシークレットしか渡りません。OS-Credexus のマージのワークフローは、自分の Dependabot を飛ばす処理に着く前に、Dependabot のプルリクエストで失敗していました(#8)。
- 再利用ワークフローに届くのは呼び出し側が渡したシークレットだけで、渡さなかったものはエラーなしで空になります:AWS での同じ空の値に、
secrets: inheritと、空なら止めるステップがあります。
tuna-os/hive は、シークレットが無いときはジョブのトークンを使います(#28):
env:
GH_TOKEN: ${{ secrets.GHCR_PRUNE_TOKEN || github.token }}
この代わりが正しいのは、github.token でその仕事ができるときだけです。次の場合はできないので、はっきり失敗させるほうがよいでしょう:
- プロジェクト。ドキュメント:「
GITHUB_TOKENis scoped to the repository level and cannot access projects.」(GITHUB_TOKEN はリポジトリの範囲で、プロジェクトには触れない)。GitHub App か個人用アクセストークンを使います。 - ほかのリポジトリ。
GITHUB_TOKENが届くのは、ワークフローが動いているリポジトリだけです。 - ワークフローを起動すべきプルリクエスト。
GITHUB_TOKENで作ったプルリクエストの実行には承認が要り、それが起こすほかのイベントはワークフローを起動しません。OS-Credexus はそのために自分のトークンを使い続け、何を足せばよいかを書いたメッセージで失敗するようにしました(#8)。
3. GitHub Enterprise Server
GitHub Enterprise Server のホストには、gh は GH_TOKEN ではなく GH_ENTERPRISE_TOKEN、次に GITHUB_ENTERPRISE_TOKEN を読みます。リポジトリのリモートからホストがわからないときは、GH_HOST も設定します(gh help environment)。
見分け方
HTTP 403: Resource not accessible by integration:gh はトークンを持っていて、その権限が足りませんでした(「Resource not accessible by integration」)。HTTP 401: Bad credentials:gh が持っていたトークンを GitHub が受け付けませんでした。期限切れか取り消された個人用アクセストークンなどです。gh: command not found:gh が入っていません。GitHub のホストランナーのイメージには入っていますが、セルフホストランナーやコンテナのジョブには無いことがあります。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub・GitHub Actions・GitHub CLI は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「Resource not accessible by integration」 · AWS の「Could not load credentials from any providers」 · 「GH013: Repository rule violations found」 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English