GitHub Actions:「Invalid workflow file」
GitHub がワークフローのファイルを読めなかったので、そこからジョブを1つも始めなかった、という意味です(「ワークフローのファイルが正しくない」)。どこか1か所の間違いでファイル全体が拒まれ、メッセージの行とは関係の無いジョブも含めて、そのファイルのジョブはすべて止まります。リポジトリのほかのワークフローのファイルには影響しません。
見え方
- 実行はジョブ0本、0秒で失敗します。名前はワークフローの
name:でなく.github/workflows/ci.ymlのようなファイルのパスになり、実行の一覧には「This run likely failed because of a workflow file issue.」と出ます。 - 実行のページには、ファイル・行・列と理由が出ます。10月の公開のリポジトリから(reach #1):
Invalid workflow file: .github/workflows/ci.yml#L1 (Line: 55, Col: 9): Unrecognized function: 'hashFiles'. Located at position 1 within expression: hashFiles('relay-node-android/gradle/wrapper/gradle-wrapper.jar') != '' pushのトリガーが無いワークフローでも、push のたびに失敗の実行が1つできます。- スケジュールのワークフローは、ただ止まります。あるプロジェクトの毎晩の同期(トリガーは
scheduleとworkflow_dispatchだけ)は、変更でファイルが正しくなくなった2026年2月15日を最後に、スケジュールで動いていません。11月2日の時点で、それ以来スケジュールの実行は0、push での失敗の実行が約2,000、それでもワークフローは有効のままでした(OpenHands/docs #987)。別の毎日の同期も、10月11日に同じように止まっていました(openchamber-docker #17)。
メッセージと、直すところ
Unrecognized named-value: 'secrets'
9月のリリースのワークフローから(TimoDesk #44):
Invalid workflow file (Line: 52, Col: 13): Unrecognized named-value: 'secrets'. Located at position 1 within expression: secrets.KEYSTORE_BASE64 != ''
GitHub のドキュメントには、シークレットは if: の条件で直接は参照できない、とあります。secrets を使えるジョブの env で判定しておき、その変数を見ます:
jobs:
release:
runs-on: ubuntu-latest
env:
HAS_KEYSTORE: ${{ secrets.KEYSTORE_BASE64 != '' }}
steps:
- name: Sign
if: env.HAS_KEYSTORE == 'true'
run: ./sign.sh
ほかのキーでの Unrecognized named-value・function
キーごとに使えるコンテキストと関数が決まっていて、GitHub のコンテキストのリファレンスの「Context availability」の表に並んでいます。よく出るのは次の2つです:
hashFiles()が使えるのはステップのキーだけです。ジョブのif:に書くと、上の「Unrecognized function: 'hashFiles'」になります。判定はステップのif:に移します。- ジョブの
envで使えるのはgithub・needs・strategy・matrix・vars・secrets・inputsで、runner・env・job・stepsは使えません。なので、そこにrunner.tempを書くと「Unrecognized named-value: 'runner'」になります(dtctl-ai-bug-demo #100)。ステップで設定します。ジョブのif:はもっと少なく、github・needs・vars・inputsだけです。
Unexpected symbol
steps.plan.outputs.3dsx == 'true' での Unexpected symbol: '3dsx':ドットのあとの名前は数字で始められません。この例では、出力の名前を want_3dsx に変えて直しています(3ds-GBabe #2)。
Unexpected value '...'
キーが、それを受け付けない場所にあります。インデントのせいのことがよくあります。Unexpected value 'schedule' は、on: の下に書くべき schedule: をジョブの中に書いていたためでした(ChiaEngine #96)。
再利用可能なワークフローを呼ぶジョブ(uses: ./.github/workflows/x.yml)に書けるキーは、name・uses・with・secrets・strategy・needs・if・concurrency・permissions・cache-mode だけです。runs-on・env・steps・timeout-minutes は、呼ばれる側のワークフローのジョブに書きます。あるプロジェクトのリリースのワークフローは、そうしたジョブに timeout-minutes を足したところでジョブを作らなくなりました(openchamber #118)。
'with' is already defined
1つのブロックに同じキーが2回あります。たとえば同じステップに2つ目の with: や env: がある場合です(hisabkikitab #16)。1つにまとめます。
You have an error in your yaml syntax on line N
ファイルがそもそも YAML として正しくありません。よくあるのは、run: | の中のテキストが、ヒアドキュメントの本文のように0列目から始まっている場合です。そこでブロックが終わってしまい、YAML は次の行を新しいキーとして読みます(cornucopia #3688)。その行もブロックのほかの行と同じだけ字下げします。シェルに渡る前に YAML がその字下げを取り除くので、ヒアドキュメントはそのまま動きます。
The nested job is requesting ..., but is only allowed ...
The workflow is not valid. .github/workflows/nightly.yml (Line: 63, Col: 3): Error calling workflow '...'. The nested job 'matrix' is requesting 'id-token: write', but is only allowed 'id-token: none'.
呼ばれたワークフローは、呼んだ側から受け取る GITHUB_TOKEN の権限を下げることはできても、上げることはできません。また permissions のブロックに書かなかった権限は none になります。呼ぶ側のジョブの permissions に、その権限を足します。あるリリースは、そうしたジョブから contents: write を外し、contents: read を足し忘れて壊れました(xlq #145)。この場合の実行は、ジョブ0本の失敗でなく「Startup failure」で終わり、スケジュールの実行は毎晩始まっては失敗し続けます(langwatch #9187)。
push の前に見つける
actionlint(v1.7.12)は、手元のマシンでも CI でもワークフローのファイルを検査できます。上の間違いの多くを見つけます。たとえば context "secrets" is not allowed here や unexpected key "schedule" for "job" section です。ただ、呼ばれるワークフローが何を要るかは知らないので、権限のエラーは GitHub でしか分かりません。検査は専用のワークフローのファイルから動かします。壊れたファイルの中の検査のジョブは始まらないからです。
name: Lint workflows
on: [push, pull_request]
jobs:
actionlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Check workflow files
run: |
bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
./actionlint -color
shell: bash
見分け方
- ジョブが始まり、「Set up job」で「Unable to resolve action」になって失敗した:ファイルは正しく、使っているアクションが見つからなかったのです(「Unable to resolve action」)。
- 手で始めると HTTP 422「Workflow does not have 'workflow_dispatch' trigger」で断られる:ファイルは正しく、そのブランチのファイルにそのトリガーが無いのです(workflow_dispatch のトリガーが無い)。
- ジョブが動き、ステップが「Resource not accessible by integration」で断られた:ファイルは正しく、動いている最中にトークンの権限が足りなかったのです(「Resource not accessible by integration」)。
失敗した実行を IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出るので、ジョブ0本で失敗した実行にも作業しているその場で気づけます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「Unable to resolve action」 · 「Resource not accessible by integration」 · workflow_dispatch のトリガーが無い · 「Unexpected input(s)」の警告 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English