{"meta":{"title":"使用工作流工件存储和共享数据","intro":"使用工件在工作流中的作业之间共享数据，并在工作流完成后存储数据。","product":"GitHub Actions","breadcrumbs":[{"href":"/zh/actions","title":"GitHub Actions"},{"href":"/zh/actions/tutorials","title":"教程"},{"href":"/zh/actions/tutorials/store-and-share-data","title":"存储和共享数据"}],"documentType":"article"},"body":"# 使用工作流工件存储和共享数据\n\n使用工件在工作流中的作业之间共享数据，并在工作流完成后存储数据。\n\n## 先决条件\n\n在完成本教程之前，需要理解工作流工件。 请参阅“[工作流工件](/zh/actions/concepts/workflows-and-actions/workflow-artifacts)”。\n\n## 上传构建和测试构件\n\n构建和测试代码的输出通常会生成可用于调试测试失败的文件和可部署的生产代码。 您可以配置一个工作流程来构建和测试推送到仓库中的代码，并报告成功或失败状态。 您可以上传构建和测试输出，以用于部署、调试失败的测试或崩溃以及查看测试套件范围。\n\n可以使用 `upload-artifact` 操作上传工件。 上传构件时，您可以指定单个文件或目录，或多个文件或目录。 您还可以排除某些文件或目录，以及使用通配符模式。 建议为工件命名，如果没有命名，则会使用 `artifact` 作为默认名称。 有关语法的更多信息，请参阅 [actions/upload-artifact](https://github.com/actions/upload-artifact) 操作 上）。\n\n### 示例\n\n例如，您的仓库或 Web 应用程序可能包含必须转换为 CSS 和 JavaScript 的 SASS 和 TypeScript 文件。 假设生成配置输出 `dist` 目录中已编译的文件，如果所有测试均已成功完成，则可将 `dist` 目录中的文件部署到 Web 应用服务器。\n\n```text\n|-- hello-world (repository)\n|   └── dist\n|   └── tests\n|   └── src\n|       └── sass/app.scss\n|       └── app.ts\n|   └── output\n|       └── test\n|\n```\n\n此示例演示了如何创建 Node.js 项目的工作流，该项目在 `src` 目录中生成代码，在 `tests` 目录中运行测试。 可以假定运行 `npm test` 会生成一个名为 `code-coverage.html`、存储在 `output/test/` 目录中的代码覆盖率报告。\n\n工作流上传 `dist` 目录中的生产工件，但不包括任何 Markdown 文件。 它还将 `code-coverage.html` 报表作为另一个工件上传。\n\n```yaml copy\nname: Node CI\n\non: [push]\n\njobs:\n  build_and_test:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n      - name: npm install, build, and test\n        run: |\n          npm install\n          npm run build --if-present\n          npm test\n      - name: Archive production artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: dist-without-markdown\n          path: |\n            dist\n            !dist/**/*.md\n      - name: Archive code coverage results\n        uses: actions/upload-artifact@v4\n        with:\n          name: code-coverage-report\n          path: output/test/code-coverage.html\n```\n\n> \\[!TIP]\n> 要在拉取请求中直接显示代码覆盖率结果，而不是下载构件，可以将 Cobertura XML 覆盖率报告上传到 Code Quality。 请参阅“[为存储库设置代码覆盖率](/zh/code-security/how-tos/maintain-quality-code/set-up-code-coverage)”。\n\n## 配置自定义构件保留期\n\n您可以为工作流程创建的单个构件自定义保留期。 使用工作流创建新工件时，可以同时使用 `retention-days` 和 `upload-artifact` 操作。 此示例演示如何为名为 `my-artifact` 的工件设置 5 天的自定义保留期：\n\n```yaml copy\n  - name: 'Upload Artifact'\n    uses: actions/upload-artifact@v4\n    with:\n      name: my-artifact\n      path: my_file.txt\n      retention-days: 5\n```\n\n`retention-days` 值不能超过存储库、组织或企业设置的保留限制。\n\n## 在工作流程运行期间下载构件\n\n可使用 [`actions/download-artifact`](https://github.com/actions/download-artifact) 操作在工作流运行期间下载以前上传的工件。\n\n> \\[!NOTE]\n> 如果要从其他工作流或其他工作流运行中下载构件，则需要提供令牌和运行标识符。 请参阅 [](https://github.com/actions/download-artifact?tab=readme-ov-file#download-artifacts-from-other-workflow-runs-or-repositories) 操作文档中的`download-artifact`。\n\n指定构件的名称以下载单个构件。 如果在未指定名称的情况下上传了工件，则默认名称为 `artifact`。\n\n```yaml\n- name: Download a single artifact\n  uses: actions/download-artifact@v5\n  with:\n    name: my-artifact\n```\n\n您还可以不指定名称而下载工作流程运行中的所有构件。 如果您在处理大量工件，这会非常有用。\n\n```yaml\n- name: Download all workflow run artifacts\n  uses: actions/download-artifact@v5\n```\n\n如果下载所有工作流运行的工件，则会为每个工件使用其名称创建一个目录。\n\n有关语法的详细信息，请参阅 [actions/download-artifact](https://github.com/actions/download-artifact) 操作。\n\n## 在工作流中的作业间传递数据\n\n可以使用 `upload-artifact` 和 `download-artifact` 操作在工作流中的作业间共享数据。 此示例工作流程说明如何在相同工作流程中的任务之间传递数据。 更多信息，请参阅 [actions/upload-artifact](https://github.com/actions/upload-artifact) 和 [download-artifact](https://github.com/actions/download-artifact) 操作 上的操作。\n\n依赖于以前作业构件的作业必须等待依赖项成功完成。 此工作流使用 `needs` 密钥来确保 `job_1`、`job_2` 和 `job_3` 按顺序运行。 例如，`job_2` 需要 `job_1`，方法是使用 `needs: job_1` 语法。\n\n作业1执行以下步骤：\n\n* 执行数学计算并将结果保存到名为 `math-homework.txt` 的文本文件。\n* 使用 `upload-artifact` 操作上传 `math-homework.txt` 文件，工件名称为 `homework_pre`。\n\n作业 2 使用上一个作业的结果：\n\n* 下载在上一个作业中上传的 `homework_pre` 构件。 默认情况下，`download-artifact` 操作会将工件下载到该步骤执行的工作区目录中。 可以使用 `path` 输入参数指定不同的下载目录。\n* 读取 `math-homework.txt` 文件中的值，执行数学计算，并再次将结果保存到 `math-homework.txt`，覆盖其内容。\n* 上传 `math-homework.txt` 文件。\n  由于在 `v4` 中工件被视为不可变，因此会将该工件以另一个输入 `homework_final` 作为名称传入。\n\n作业 3 显示上一个作业中上传的结果：\n\n* 从作业 2 下载 `homework_final` 构件。\n* 将数学方程式的结果打印到日志中。\n\n在此工作流示例中执行的完整数学运算是 `(3 + 7) x 9 = 90`。\n\n```yaml copy\nname: Share data between jobs\n\non: [push]\n\njobs:\n  job_1:\n    name: Add 3 and 7\n    runs-on: ubuntu-latest\n    steps:\n      - shell: bash\n        run: |\n          expr 3 + 7 > math-homework.txt\n      - name: Upload math result for job 1\n        uses: actions/upload-artifact@v4\n        with:\n          name: homework_pre\n          path: math-homework.txt\n\n  job_2:\n    name: Multiply by 9\n    needs: job_1\n    runs-on: windows-latest\n    steps:\n      - name: Download math result for job 1\n        uses: actions/download-artifact@v5\n        with:\n          name: homework_pre\n      - shell: bash\n        run: |\n          value=`cat math-homework.txt`\n          expr $value \\* 9 > math-homework.txt\n      - name: Upload math result for job 2\n        uses: actions/upload-artifact@v4\n        with:\n          name: homework_final\n          path: math-homework.txt\n\n  job_3:\n    name: Display results\n    needs: job_2\n    runs-on: macOS-latest\n    steps:\n      - name: Download math result for job 2\n        uses: actions/download-artifact@v5\n        with:\n          name: homework_final\n      - name: Print the final result\n        shell: bash\n        run: |\n          value=`cat math-homework.txt`\n          echo The result is $value\n```\n\n工作流程运行将会存档它生成的任何工件。 有关下载已存档项目的详细信息，请参阅“[下载工作流程构件](/zh/actions/how-tos/manage-workflow-runs/download-workflow-artifacts)”。\n\n## 验证工件\n\n每次使用 upload-artifact 操作时，都会返回名为 `digest` 的输出。 这是工作流运行期间上传的工件的 SHA256 摘要。\n\n当随后使用 download-artifact 操作下载该工件时，它会自动计算下载工件的摘要，并验证其是否与 upload-artifact 步骤的输出相匹配。\n\n如果摘要不匹配，则运行将在 UI 和作业日志中显示警告。\n\n要查看 SHA256 摘要，打开 upload-artifact 作业的日志，或检查工作流运行 UI 中显示的工件输出。"}