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...
- 「Not a valid zip file」:1 へ。
- どの実行でも同じアーティファクトで「unexpected end of file」:2 へ。
- 再実行で通る:3 へ。
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つで足ります:
- 要るものだけを取ってくる。Docker の README には記録を外すパターンが載っています。
pwget-*のように自分の名前に合うパターンでも同じです。- uses: actions/download-artifact@v8 with: pattern: "!*.dockerbuild" path: release merge-multiple: true - 記録をアップロードしない。
DOCKER_BUILD_RECORD_UPLOADをfalseにすると、止まるのはアップロードだけで、ジョブのサマリーは書かれます(main.ts)。- uses: docker/build-push-action@v7 env: DOCKER_BUILD_RECORD_UPLOAD: false with: push: true tags: ${{ steps.meta.outputs.tags }}
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 には、もう一度試しても効きません。同じバイトは同じように失敗します。
見分け方
- 「Artifact not found for name」:その名前のアーティファクトが見つかりませんでした。何も取ってきていません。
- 「Digest validation failed for artifact(s)」:v8 はバイトを取ってきましたが、SHA-256 がアップロード時に記録したダイジェストと合いませんでした。v8 は既定でこれを失敗にします(
digest-mismatchの入力)。v8 より前は警告だけでした。 - ダウンロードは通ったのに、次のステップが見る場所にファイルが無い:アーティファクトが2つ以上なら、
merge-multipleがtrueでない限り、それぞれ自分の名前のフォルダーに入ります。
失敗したジョブを 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