Lesstep
GitHub Actions・actions/download-artifact・2026年11月4日に確認

GitHub Actions:「Artifact download failed after 5 retries」

actions/download-artifact はアーティファクトを見つけましたが、ランナーに取り込めませんでした。5秒おきに5回試し、それぞれの失敗の理由はデバッグのログにだけ書きます(ツールキットの download-artifact.ts)。なので、何が起きても見える行は同じです。見分ける手がかりは2つです:再実行で同じアーティファクトがまた失敗するか、デバッグのログの理由。

どう見えるか

Error: Unable to download artifact(s): Unable to download and extract artifact: Artifact download failed after 5 retries.

どのケースか

失敗したジョブを再実行し、ダイアログで Enable debug logging にチェックを入れます。リポジトリの変数 ACTIONS_STEP_DEBUG を true にしても同じです。各回の終わりに理由が出ます:

##[debug]Failed to download artifact after 1 retries due to Not a valid zip file. Retrying in 5 seconds...

1. アーティファクトが zip ではない

docker/build-push-action と docker/bake-action は、ビルドのたびにビルド記録をアップロードします。名前は owner~repo~GQJ6I2.dockerbuild のような形で、Docker のツールキットは zip にせず、ファイルのままアップロードします(artifact.ts の skipArchive: true)。v8 より前の download-artifact は、取ってきたアーティファクトをすべて解凍しようとします。name も pattern も無いステップは実行のアーティファクトを全部取ってくるので、バイナリだけが欲しかったリリースのジョブが記録まで拾います。

しばらく通ってから起きることがあります。ステップが一覧にするのは、始まった時点にあるアーティファクトだけです。AuroraTape のリリースのジョブは、2回のリリースでは Docker のジョブが終わる前に走っていました。1.0.2-rc.1 で Docker のジョブが先に終わり、リリースは作られませんでした(aurora-ltfs #271)。pwget_rs・porcupin・novastor も同じです(#4・#44・#222)。直しはどれか1つで足ります:

download-artifact@v8 にするだけでは、失敗は止まっても問題は残ります。v8 は先に Content-Type を見て、zip でないファイルはそのまま保存します(v8.0.0 のリリースノート)。なので記録がフォルダーに入り、merge-multiple: true なら、release/* を添付するステップが記録まで添付します。パターンは残してください。

archive: false(upload-artifact v7 の、1つのファイルを解凍なしでアップロードする設定)で上げたファイルを v4〜v7 の download-artifact で読んでも、同じことが起きます。取ってくる側を v8 にしてください。

2. zip の中の zip

Playwright の blob レポーターは、シャードごとのレポートを zip ファイルで書き、upload-artifact がそのフォルダーをもう一度 zip にします。download-artifact は unzip-stream で流しながら解凍していて、2つのプロジェクトが失敗の原因をそこまでたどりました:内側の zip のバイトのせいで途中で止まることがあり、どの回もどの再実行も「unexpected end of file」で失敗します。同じアーティファクトを unzip -t・Python の zipfile・gh run download は問題なく読めます(kody #4748・EinVault #389)。バイト次第なので、あるシャードは失敗して次のシャードは通ります。kody では、あるコミットから始まり、その後の main の実行はすべて失敗しました。

EinVault は、シャードの zip をそのままアップロードし、解凍せずに取ってくる形にしました。シャードに分けると Playwright はファイルを report-<hash>-<shard>.zip と名付け、archive: false ではアーティファクトの名前がファイルの名前になります。

# 各シャード
- uses: actions/upload-artifact@v7
  with:
    path: blob-report/*.zip
    archive: false

# まとめるジョブ
- uses: actions/download-artifact@v8
  with:
    pattern: report-*.zip
    skip-decompress: true
    path: all-blob-reports
    merge-multiple: true

kody は代わりに gh run download で blob レポートを取ってきます。こちらはファイルの末尾にある zip の目次を読みます。このステップには GH_TOKEN が要ります。

- run: gh run download "$GITHUB_RUN_ID" --pattern 'playwright-blob-report-*' --dir blobs
  env:
    GH_TOKEN: ${{ github.token }}

3. ストレージ側で一度だけ

再実行で通るなら、ワークフローに間違いはありません。tmt では10分のうちに2回、リリースとマージグループで1回ずつ起きました(tmt #5743)。v8.0.2 は、サービスが 429 を返したときの再試行が良くなり、Retry-After に従います(リリースノート)。v8.0.2 以降を使ってください。リリースのようにジョブ全体の再実行が高くつくところでは、同じジョブの中でもう一度試します:

- id: dl
  uses: actions/download-artifact@v8
  continue-on-error: true
  with:
    name: build
    path: dist
- if: steps.dl.outcome == 'failure'
  run: sleep 60
- if: steps.dl.outcome == 'failure'
  uses: actions/download-artifact@v8
  with:
    name: build
    path: dist

1 と 2 には、もう一度試しても効きません。同じバイトは同じように失敗します。

見分け方

失敗したジョブを IntelliJ IDEA から見るなら

Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行(デバッグのログつきも選べます)・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。

GitHub・GitHub Actions は GitHub, Inc. の商標、Docker は Docker, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Docker, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。

ほかに:「Artifact not found for name」 · 「Artifact storage quota has been hit」 · Docker Hub の pull の回数制限 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English