GitHub Actions:「No files were found with the provided path」
actions/upload-artifact が、渡されたパスを探してファイルを1つも見つけられず、何もアップロードしませんでした。既定ではただの警告で(if-no-files-found: warn)、ステップは成功するので、問題が見えるのはあとで、人やほかのジョブがアーティファクトを探したときです。
見え方
No files were found with the provided path: test-results/. No artifacts will be uploaded.
パスは書いたとおりに表示されます。これは canopycms #666 で、E2E のどの成功したシャードにも出ていたものです(下の3)。
1. パスは working-directory からでなく、ワークスペースから読まれる
GitHub のドキュメントには、defaults.run はすべての run のステップのシェルと作業ディレクトリを決める、とあります。upload-artifact のような uses: のステップはそれに当たらないので、path はワークスペースの一番上から探されます:
defaults:
run:
working-directory: frontend
steps:
- run: npm run build # runs in frontend/, writes frontend/dist
- uses: actions/upload-artifact@v7
with:
name: dist
path: frontend/dist # not dist
2. ドットで始まる名前
- v4.4.0(2024年8月30日)から、名前がドットで始まるファイルとフォルダーは、
include-hidden-files: trueにしない限り除かれます。リリースノートには、認証情報がうっかりアーティファクトに入る危険を減らすため、とあります。 - パスそのものが隠しフォルダーなら、何も見つかりません。doodle-shooter #12 では、
e2e/.resultsの E2E の失敗のトレースが、一度もアップロードされていませんでした。 - パスの中の隠しフォルダーは、警告なしで抜けます。workshop #52 では、リリースのアーティファクトにビルドの隠しファイルが入っておらず、ステージングへのデプロイが、無い Vite のマニフェストを確かめる段階で失敗していました。
有効にするのはそのアップロードだけにし、パスにチェックアウトの .git フォルダーが入らないようにします。actions/checkout は、persist-credentials: false にしない限り、トークンをローカルの git の設定に保存するからです。
- uses: actions/upload-artifact@v7
with:
name: e2e-results
path: e2e/.results
include-hidden-files: true
3. ファイルが作られていない
- ツールがフォルダーをときどきしか作らない。canopycms では、CI の Playwright はテストがトレースかスクリーンショットを残したときだけ
test-results/を作り、アップロードはif: always()で動いていたので、成功したシャードのたびに警告が出ていました。失敗のときだけのファイルならif: failure()、またはif-no-files-found: ignoreにします。 - ビルドが、ステップを失敗させずに失敗していた。VoltAir #79 では、アップロードが
bin/VoltAir.apkを見つけられませんでした。直し(VoltAir #80)は、ビルドの失敗したコマンドでステップを失敗させるようにし、古いツールチェーンに要る Java のバージョンを指定するものでした。 - ファイルを作ったのが別のジョブだった。ジョブはどれも新しいランナーで動くので、作ったジョブの中でアップロードします。
何があるかは、アップロードの前のステップで一覧して確かめます:
- run: |
ls -la frontend/dist
find . -name '*.apk' -not -path './.git/*'
warn・error・ignore
if-no-files-found: errorはステップを失敗させます。リリースのビルドのように、アーティファクトがジョブの目的なら、これにします。VoltAir のワークフローもそうです。if-no-files-found: ignoreは、同じ行をふつうの出力として出すだけです。ときどきしか無いファイル向けです。- 既定の
warnは、その行を実行のアノテーションに出して成功します。
見分け方
- あとの
actions/download-artifactのステップが、アーティファクトが見つからず「Unable to download artifact(s)」で失敗するのは、たいてい1つ前のジョブでこの警告が出ています。 - 「Artifact storage quota has been hit」:ファイルは見つかったが、アカウントのアーティファクトの保存領域がいっぱいです(「Artifact storage quota has been hit」)。
- キャッシュはアーティファクトとは別です。「Cache not found for input keys」は
actions/cacheの話です(「Cache not found for input keys」)。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「Artifact storage quota has been hit」 · 「Cache not found for input keys」 · 「Unexpected input(s)」の警告 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English