既存ディレクトリと同じ名前の artifacts を download-artifact すると失敗する【GitHub Actions】
概要
この記事は、GitHub Actions Advent Calendar 2022の18日目の記事です。
GitHub Actions において、異なるジョブ間で成果物を共有したいとき、筆者は actions/upload-artifact
,actions/download-artifact
を愛用しています。
これらのアクションを使っていて、既存ディレクトリと同じ名前の artifacts を download-artifact すると失敗してしまったため、再現手順や解決策について、備忘録として書き留めておきます。
再現手順
再現したいのは、actions/upload-artifact
,actions/download-artifact
を使って、異なるジョブ[1]間で、ファイルを共有する際のエラーです。
ディレクトリ構成
├── .github
│ └── workflows
│ ├── fail_sample.yaml # ワークフロー(失敗例)
│ └── success_sample.yaml # ワークフロー(成功例)
├── sample # "アップロード対象のファイル"と同名のデイレクトリ
│ └── .gitkeep
└── upload
└── sample # アップロード対象のファイル
ワークフロー
name: fail_sample
on:
push:
jobs:
job_v2:
runs-on: [ubuntu-22.04]
steps:
- uses: actions/checkout@v2
# あるファイル(`upload/sample`)を アクション(`actions/upload-artifacts`)でアップロードする
- uses: actions/upload-artifact@v2
with:
name: sample # is same as already existing directory name
path: upload/sample
# アクション(`actinos/download-artifacts`)でダウンロードする
- uses: actions/download-artifact@v2
with:
name: sample # is same as already existing directory name
# ダウンロードしたファイルの中身を表示する
- name: show files exists
run: cat sample/sample
if: always()
エラー内容
上記のfail_sample.yaml
を実行すると、下記エラーとなります。
Run actions/download-artifacts@v2
のエラーログを見ると、illegal operation on a directory, open path/to/xxx
とあり、ディレクトリに対する不当な操作である
と怒られています。これはsample
という名前の artifact をダウンロードしようとしたが、sample
という同名のディレクトリが既にあるためです。
> Run actions/download-artifact@v2
Starting download for sample
Directory structure has been setup for the artifact
Total number of files that will be downloaded: 1
node:events:368
throw er; // Unhandled 'error' event
^
Error: EISDIR: illegal operation on a directory, open '/home/runner/work/duplication_name_bug_for_download_artifacts_action/duplication_name_bug_for_download_artifacts_action/sample'
Emitted 'error' event on WriteStream instance at:
at emitErrorNT (node:internal/streams/destroy:157:8)
at emitErrorCloseNT (node:internal/streams/destroy:122:3)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -21,
code: 'EISDIR',
syscall: 'open',
path: '/home/runner/work/duplication_name_bug_for_download_artifacts_action/duplication_name_bug_for_download_artifacts_action/sample'
}
解決策
同名のフォルダとファイルが存在していることが諸悪の根源です。よって、ダウンロード対象か既存のディレクトリのどちらかの名前を変えれば解決です。
【成功】ダウンロード対象のダウンロード時の名前/位置を変える
download-artifact の path オプションを指定します。
- uses: actions/download-artifact@v2
with:
name: sample # is same as already existing directory name
+ path: ./sample/ # to avoid name duplication error
この変更により、ダウンロードが成功します。
Artifact sample was downloaded to /home/runner/work/duplication_name_bug_for_download_artifacts_action/duplication_name_bug_for_download_artifacts_action/sample
Artifact download has finished successfully
【未検証】既存のディレクトリの名前を変える
省略
【失敗】ダウンロード対象のアップロード時の名前を変える
アップロード時の名前を変えてみましたが、ダメでした。
- uses: actions/upload-artifact@v2
with:
- name: sample # is same as already existing directory name
+ name: sample_binary # is not same ...
path: upload/sample
- uses: actions/download-artifact@v2
with:
- name: sample # is same as already existing directory name
+ name: sample_binary # is not same ...
- name: check files exists
- run: cat sample/sample
+ run: cat sample_binary/sample
エラーログ
上記のエラーと若干違うものの、症状としては同じ様です。
> Run actions/download-artifact@v2
Starting download for sample_binary
Directory structure has been setup for the artifact
Total number of files that will be downloaded: 1
events.js:291
throw er; // Unhandled 'error' event
^
Error: EISDIR: illegal operation on a directory, open '/home/runner/work/duplication_name_bug_for_download_artifacts_action/duplication_name_bug_for_download_artifacts_action/sample'
Emitted 'error' event on WriteStream instance at:
at internal/fs/streams.js:361:12
at FSReqCallback.oncomplete (fs.js:156:23) {
errno: -21,
code: 'EISDIR',
syscall: 'open',
path: '/home/runner/work/duplication_name_bug_for_download_artifacts_action/duplication_name_bug_for_download_artifacts_action/sample'
}
環境情報
今回使用したソートコード
今回使用したアクションとそのバージョン一覧
# v2系
Download action repository 'actions/checkout@v2' (SHA:dc323e67f16fb5f7663d20ff7941f27f5809e9b6)
Download action repository 'actions/upload-artifact@v2' (SHA:82c141cc518b40d92cc801eee768e7aafc9c2fa2)
Download action repository 'actions/download-artifact@v2' (SHA:f023be2c48cc18debc3bacd34cb396e0295e2869)
# v3系
Download action repository 'actions/checkout@v3' (SHA:755da8c3cf115ac066823e79a1e1788f8940201b)
Download action repository 'actions/upload-artifact@v3' (SHA:83fd05a356d7e2593de66fc9913b3002723633cb)
Download action repository 'actions/download-artifact@v3' (SHA:9782bd6a9848b53b110e712e20e42d89988822b7)
その他: actions/download-artifact の Issue に登録した方がよさそう
- ざっと見たところIssue、PRには上がってはなさそう。
- v3(SHA:9782bd6a9848b53b110e712e20e42d89988822b7)でも再現した。
- 元気があればやります🫠
-
例では、コードを短くするため同一ジョブとしています ↩︎
Discussion
既存ファイルを上書きしたいオプションのイシューがあがっている様子