# ワークフロー成果物を使ったデータの格納と共有

成果物を使って、ワークフロー内のジョブ間でデータを共有し、ワークフローが完了したらデータを格納します。

## 前提条件

このチュートリアルを完了する前に、ワークフロー成果物を理解しておく必要があります。 「[ワークフロー成果物](/ja/enterprise-cloud@latest/actions/concepts/workflows-and-actions/workflow-artifacts)」を参照してください。

## ビルドおよびテストの成果物をアップロードする

コードのビルドおよびテストからの出力によって、多くの場合、エラーのデバッグに使用できるファイルと、デプロイできる本番コードが生成されます。 リポジトリにプッシュされるコードをビルドしてテストし、成功または失敗のステータスをレポートするワークフローを構成することができます。 デプロイメントに使用するビルドおよびテスト出力をアップロードし、失敗したテストまたはクラッシュをデバッグしてテストスイートのカバレッジを確認できます。

成果物をアップロードするには、`upload-artifact` アクションを使用できます。 成果物をアップロードする場合は、単一のファイルまたはディレクトリ、あるいは複数のファイルまたはディレクトリを指定できます。 また、特定のファイルやディレクトリを除外したり、ワイルドカードパターンを使用したりすることもできます。 成果物の名前を指定することをお勧めしますが、名前を指定しない場合は、`artifact` が既定の名前として使用されます。 構文の詳細については、[actions/upload-artifact](https://github.com/actions/upload-artifact) アクションをご覧ください。

### 例

たとえば、リポジトリあるいはWebアプリケーションにはCSSやJavaScriptに変換しなければならないSASSやTypeScriptが含まれているかもしれません。 ビルド構成で `dist` ディレクトリにコンパイル後のファイルを出力すると仮定すると、テストがすべて正常に完了した場合、`dist` ディレクトリにあるファイルが Web アプリケーション サーバーにデプロイされます。

```text
|-- hello-world (repository)
|   └── dist
|   └── tests
|   └── src
|       └── sass/app.scss
|       └── app.ts
|   └── output
|       └── test
|
```

この例で示しているのは、`src` ディレクトリにコードをビルドして、`tests` ディクトリでテストを実行する Node.js プロジェクトのワークフローを作成する方法です。 実行中の `npm test` によって、`code-coverage.html` という名前で、`output/test/` ディレクトリに保存されるコード カバレッジ レポートが生成されると想定できます。

このワークフローでは、`dist` ディレクトリに運用環境の成果物をアップロードしますが、Markdown ファイルはその対象外です。 また、`code-coverage.html` レポートも別の成果物としてアップロードされます。

```yaml copy
name: Node CI

on: [push]

jobs:
  build_and_test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
      - name: npm install, build, and test
        run: |
          npm install
          npm run build --if-present
          npm test
      - name: Archive production artifacts
        uses: actions/upload-artifact@v4
        with:
          name: dist-without-markdown
          path: |
            dist
            !dist/**/*.md
      - name: Archive code coverage results
        uses: actions/upload-artifact@v4
        with:
          name: code-coverage-report
          path: output/test/code-coverage.html
```

## カスタムの成果物の保持期間を設定する

ワークフローによって作成された個々の成果物のカスタム保存期間を定義できます。 ワークフローを使用して新しい成果物を作成する場合、`retention-days` アクションで `upload-artifact` を使用できます。 この例は、`my-artifact` という名前の成果物に 5 日間のカスタム保存期間を設定する方法を示しています。

```yaml copy
  - name: 'Upload Artifact'
    uses: actions/upload-artifact@v4
    with:
      name: my-artifact
      path: my_file.txt
      retention-days: 5
```

```
          `retention-days` の値は、リポジトリ、Organization、または Enterprise によって設定された保持制限を超えることはできません。
```

## ワークフロー実行中の成果物のダウンロード

以前にアップロードした成果物は、ワークフロー実行中に [`actions/download-artifact`](https://github.com/actions/download-artifact) アクションを使ってダウンロードできます。

> \[!NOTE]
> 別のワークフローまたはワークフロー実行から成果物をダウンロードする場合は、トークンと実行識別子を指定する必要があります。
> [
> ](https://github.com/actions/download-artifact?tab=readme-ov-file#download-artifacts-from-other-workflow-runs-or-repositories) アクションのドキュメント内の「ワークフローの他の実行またはリポジトリからアーティファクトをダウンロード」を参照してください。

個々の成果物をダウンロードするには、成果物の名前を指定します。 名前を指定せずに成果物をアップロードした場合、既定の名前は `artifact` です。

```yaml
- name: Download a single artifact
  uses: actions/download-artifact@v5
  with:
    name: my-artifact
```

また、名前を指定しないことで、ワークフロー実行のすべての成果物をダウンロードすることもできます。 これは、多数の成果物を扱っている場合に便利です。

```yaml
- name: Download all workflow run artifacts
  uses: actions/download-artifact@v5
```

ワークフロー実行のすべての成果物をダウンロードすると、各成果物のディレクトリがその名前を使用して作成されます。

構文の詳細については、[actions/download-artifact](https://github.com/actions/download-artifact) アクションをご覧ください。

## ワークフロー内のジョブ間でのデータの受け渡し

```
          `upload-artifact` アクションと `download-artifact` アクションを使用すると、ワークフローのジョブ間でデータを共有できます。 以下のワークフローの例では、同じワークフローのジョブ間でデータを受け渡す方法を説明しています。 詳細については、[actions/upload-artifact](https://github.com/actions/upload-artifact) と [download-artifact](https://github.com/actions/download-artifact) アクションを参照してください。
```

前のジョブの成果物に依存するジョブは、前のジョブが正常に完了するまで待つ必要があります。 このワークフローでは、`needs` キーワードを使用して、`job_1`、`job_2`、`job_3` を順次実行できます。 たとえば、`job_2` では `job_1` 構文を使用することにより `needs: job_1` が必要となっています。

ジョブ1は、以下のステップを実行します。

* 数式の計算を実行し、その結果を `math-homework.txt` というテキスト ファイルに保存します。
* アクションを`upload-artifact`使用して、成果物名 `math-homework.txt` を持つファイルをアップロード`homework`します。

ジョブ2は、前のジョブの結果を利用して、次の処理を実行します。

* 前のジョブでアップロードされた `homework_pre` 成果物をダウンロードします。 既定では、`download-artifact` アクションで、ステップが実行されているワークスペース ディレクトリに成果物をダウンロードします。
  `path` 入力パラメータを使用すると、別のダウンロード ディレクトリを指定できます。
* `math-homework.txt` ファイル内の値を読み取り、数式の計算を実行して、結果を `math-homework.txt` に再度保存し、その内容を上書きします。
* `math-homework.txt` ファイルをアップロードします。 成果物は不変 `v4`と見なされるため、成果物は別の入力 `homework_final`(名前として) 渡されます。% else %}このアップロードは、同じ名前を共有しているため、以前にアップロードされた成果物を上書きします。

ジョブ3は、前のジョブでアップロードされた結果を表示して、次の処理を実行します。

* Job 2 の `homework_final` 成果物をダウンロードします。
* 数式の結果をログに出力します。

このワークフロー例で実行される完全な数式は、`(3 + 7) x 9 = 90` です。

```yaml copy
name: Share data between jobs

on: [push]

jobs:
  job_1:
    name: Add 3 and 7
    runs-on: ubuntu-latest
    steps:
      - shell: bash
        run: |
          expr 3 + 7 > math-homework.txt
      - name: Upload math result for job 1
        uses: actions/upload-artifact@v4
        with:
          name: homework_pre
          path: math-homework.txt

  job_2:
    name: Multiply by 9
    needs: job_1
    runs-on: windows-latest
    steps:
      - name: Download math result for job 1
        uses: actions/download-artifact@v5
        with:
          name: homework_pre
      - shell: bash
        run: |
          value=`cat math-homework.txt`
          expr $value \* 9 > math-homework.txt
      - name: Upload math result for job 2
        uses: actions/upload-artifact@v4
        with:
          name: homework_final
          path: math-homework.txt

  job_3:
    name: Display results
    needs: job_2
    runs-on: macOS-latest
    steps:
      - name: Download math result for job 2
        uses: actions/download-artifact@v5
        with:
          name: homework_final
      - name: Print the final result
        shell: bash
        run: |
          value=`cat math-homework.txt`
          echo The result is $value
```

ワークフローの実行により、生成された成果物がアーカイブされます。 アーカイブされた成果物のダウンロードについて詳しくは、「[ワークフローの成果物をダウンロードする](/ja/enterprise-cloud@latest/actions/managing-workflow-runs/downloading-workflow-artifacts)」をご覧ください。

## 成果物の検証

upload-artifact アクションが使われるたびに、`digest` という出力が返されます。 これは、ワークフロー実行中にアップロードした成果物の SHA256 ダイジェストです。

その後、download-artifact アクションを使ってその成果物をダウンロードすると、そのダウンロードされた成果物のダイジェストが自動的に計算され、それが upload-artifact ステップからの出力と一致するかどうかが検証されます。

ダイジェストが一致しない場合、実行により UI とジョブ ログに警告が表示されます。

SHA256 ダイジェストを表示するには、upload-artifact ジョブのログを開くか、ワークフロー実行 UI に表示される \[Artifact output] をチェックします。