💫

既存ディレクトリと同じ名前の artifacts を download-artifact すると失敗する【GitHub Actions】

2022/12/21に公開1

概要

この記事は、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                  # アップロード対象のファイル

ワークフロー

fail_sample.yaml
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 オプションを指定します。

success_sample.yaml
    - 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

【未検証】既存のディレクトリの名前を変える

省略

【失敗】ダウンロード対象のアップロード時の名前を変える

アップロード時の名前を変えてみましたが、ダメでした。

fail_sample.yaml
    - 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)でも再現した。
  • 元気があればやります🫠
脚注
  1. 例では、コードを短くするため同一ジョブとしています ↩︎

GitHubで編集を提案

Discussion