GitHub Actions で Artifacts v4 が一般利用可能になりました

2023.12.17

こんにちは、CX 事業本部 Delivery 部の若槻です。

GitHub Actions では、ジョブの完了後にデータの永続的な保管を可能にする方法として Artifacts という Actions が提供されています。これにより GitHub が提供するストレージ領域にビルドの成果物などのコンテンツを保管できます。

そしてこのたび、Artifacts の Version 4 が新しく一般利用可能になりました。

変更内容

v4 のリリースに伴う変更内容は @actions/upload-artifact および ``@actions/download-artifact` の README でそれぞれ確認可能です。

v3 からのそれぞれの改善点および破壊的変更は以下のようになります。

改善点

  • アップロード
    • アップロード速度が最大 90 % 向上
    • アップロード後に Artifacts ID が返され、Artifacts を UI および REST API ですぐに利用可能
    • アップロードされた Artifacts のコンテンツを後続のジョブで変更不可
    • Artifacts の圧縮レベルを指定可能
  • ダウンロード
    • ダウンロード速度が最大 90 % 向上
    • PAT の使用により他のワークフロー実行およびリポジトリから Artifact のダウンロードが可能

破壊的変更

  • アップロード
    • Self-hosted Runner ではファイアウォールルールの変更が必要となる場合がある
    • action/upload-artifact@v3 以下のバージョンで作成された Artifacts はダウンロード不可
  • ダウンロード
    • Self-hosted Runner ではファイアウォールルールの変更が必要となる場合がある
    • 同じ名前の Artifacts を同一ワークフロー実行内で複数回アップロード不可
    • ジョブごとにアップロード可能な Artifacts の数が 10 に制限

試してみた

アップロード/ダウンロード

次のような別のジョブ間で Artifacts をアップロード/ダウンロードによりやり取りするワークフローを試してみます。

.github/workflows/artifacts-example.yml

name: Artifacts Example
on: workflow_dispatch

jobs:
  upload-artifact:
    runs-on: ubuntu-latest
    steps:
      - name: Create Artifact
        run: echo "Hello World" > test.txt
      - name: Upload Artifact
        uses: actions/upload-artifact@v4
        with:
          name: my-artifact
          path: test.txt
  download-artifact:
    runs-on: ubuntu-latest
    needs: upload-artifact
    steps:
      - name: Download Artifact
        uses: actions/download-artifact@v4
        with:
          name: my-artifact
      - name: Read Artifact
        run: |
          echo "$ ls"
          ls
          echo "$ cat test.txt"
          cat test.txt

ワークフローを実行すると、Artifacts のアップロードとダウンロードが行えていることが分かります。

同一ワークフロー実行内で同じ Artifacts 名で複数回アップロードできない

同じファイルを同一ワークフロー実行内で複数回アップロードしてみます。その時に Artifacts 名が異なる場合と同じ場合で試してみます。

name: Artifacts Example
on: workflow_dispatch

jobs:
  upload-artifact:
    runs-on: ubuntu-latest
    steps:
      - name: Create Artifact
        run: echo "Hello World" > test.txt
      - name: Upload Artifact
        uses: actions/upload-artifact@v4
        with:
          name: my-artifact
          path: test.txt
  upload-artifact-2:
    runs-on: ubuntu-latest
    needs: upload-artifact
    steps:
      - name: Upload Artifact with diffrence name
        uses: actions/upload-artifact@v4
        with:
          name: my-artifact-2
          path: test.txt
      - name: Upload Artifact with same name
        uses: actions/upload-artifact@v4
        with:
          name: my-artifact
          path: test.txt

すると、異なる名前の場合は正常にアップロードできましたが、同一の名前の場合は Conflict エラーが発生しました。

Error: Failed to CreateArtifact: Received non-retryable error: Failed request: (409) Conflict: an artifact with this name already exists on the workflow run

v3 以前とは異なり v4 ではこのような挙動となるため場合によってはワークフローの修正が必要になります。

おわりに

GitHub Actions で Artifacts v4 が一般利用可能になったのでご紹介しました。

v3 以前に対していくつかの破壊的変更はありますが、アップロードおよびダウンロード速度が最大 90% 向上するのは、ワークフロー実行の実行時間削減に繋がる大きなメリットだと思うので、ぜひ v4 への移行を検討してみてください。

参考

以上