{"meta":{"title":"GitHub Actions 的工作流语法","intro":"工作流程是可配置的自动化过程，由一个或多个作业组成。 您必须创建 YAML 文件来定义工作流程配置。","product":"GitHub Actions","breadcrumbs":[{"href":"/zh/actions","title":"GitHub Actions"},{"href":"/zh/actions/reference","title":"参考"},{"href":"/zh/actions/reference/workflows-and-actions","title":"工作流和操作"},{"href":"/zh/actions/reference/workflows-and-actions/workflow-syntax","title":"工作流程语法"}],"documentType":"article"},"body":"# GitHub Actions 的工作流语法\n\n工作流程是可配置的自动化过程，由一个或多个作业组成。 您必须创建 YAML 文件来定义工作流程配置。\n\n## 关于工作流程的 YAML 语法\n\n工作流文件使用 YAML 语法，并且必须具有 `.yml` 或 `.yaml` 文件扩展名。 如果你不熟悉 YAML 并且想要了解详细信息，请参阅“[在 Y 分钟内了解 YAML](https://learnxinyminutes.com/docs/yaml/)”。\n\n必须将工作流文件存储在存储库的 `.github/workflows` 目录中。\n\n> \\[!TIP]\n> GitHub Actions与传统工作流不同，需要将每个决策脚本编写为 YAML 作业步骤，GitHub Agentic Workflows请使用 YAML frontmatter 进行触发器和配置，但允许你用自然语言 Markdown 描述所需的内容，因此无需提前预测和编码每个方案。 有关详细信息，请参阅“[创建GitHub代理工作流](/zh/copilot/how-tos/github-agentic-workflows/creating-github-agentic-workflows)”。\n\n## `name`\n\n工作流的名称。 GitHub 在存储库的“操作”选项卡下显示工作流的名称。如果省略 `name`，GitHub 会显示相对于存储库根目录的工作流文件路径。\n\n## `run-name`\n\n从工作流生成的工作流运行的名称。\nGitHub 在存储库的“操作”选项卡上，在工作流运行列表中显示工作流运行名称。如果 `run-name` 省略或只是空格，则运行名称设置为工作流运行的事件特定信息。 例如，对于由 `push` 或 `pull_request` 事件触发的工作流，将其设置为提交消息或拉取请求的标题。\n\n此值可包含表达式，且可引用 [`github`](/zh/actions/reference/workflows-and-actions/contexts#github-context) 和 [`inputs`](/zh/actions/reference/workflows-and-actions/contexts#inputs-context) 上下文。\n\n### `run-name` 的示例\n\n```yaml\nrun-name: Deploy to ${{ inputs.deploy_target }} by @${{ github.actor }}\n```\n\n## `on`\n\n若要自动触发工作流，请使用 `on` 定义哪些事件可以触发工作流运行。 有关可用事件的列表，请参阅“[触发工作流的事件](/zh/actions/reference/workflows-and-actions/events-that-trigger-workflows)”。\n\n可以定义单个或多个可以触发工作流的事件，或设置时间计划。 还可以将工作流限制为仅在特定文件、标签或分支发生更改时才执行。 后续部分将介绍这些选项。\n\n### 使用单个事件\n\n例如，当推送到工作流存储库中的任何分支时，将运行具有以下 `on` 值的工作流：\n\n```yaml\non: push\n```\n\n### 使用多个事件\n\n可以指定单个事件或多个事件。 例如，当推送到存储库中的任何分支或有人创建存储库的分支时，将运行具有以下 `on` 值的工作流：\n\n```yaml\non: [push, fork]\n```\n\n如果指定多个事件，仅需发生其中一个事件就可触发工作流。 如果触发工作流的多个事件同时发生，将触发多个工作流运行。\n\n### 使用活动类型\n\n某些事件具有活动类型，可让你更好地控制工作流的运行时间。 使用 `on.<event_name>.types` 定义将触发工作流运行的事件活动类型。\n\n例如，`issue_comment` 事件具有 `created`、`edited` 和 `deleted` 活动类型。 如果工作流在 `label` 事件上触发，则每当创建、编辑或删除标签时，它都会运行。 如果为 `created` 事件指定 `label` 活动类型，则工作流将在创建标签时运行，但不会在编辑或删除标签时运行。\n\n```yaml\non:\n  label:\n    types:\n      - created\n```\n\n如果指定多个活动类型，则只需要发生其中一种事件活动类型就可触发工作流。 如果触发工作流的多个事件活动类型同时发生，则将触发多个工作流运行。 例如，当某个议题被创建或被加上标签时，以下工作流将被触发。 如果打开了一个带有两个标签的议题，则会启动三个工作流运行：一个对应议题打开事件，另外两个对应这两个议题加标签事件。\n\n```yaml\non:\n  issues:\n    types:\n      - opened\n      - labeled\n```\n\n有关每个事件及其活动类型的详细信息，请参阅“[触发工作流的事件](/zh/actions/reference/workflows-and-actions/events-that-trigger-workflows)”。\n\n### 使用筛选器\n\n某些事件具有筛选器，可让你更好地控制工作流的运行时间。\n\n例如，`push` 事件具有 `branches` 筛选器，该筛选器仅在发生目标为与 `branches` 筛选器匹配的分支的推送时（而不是在发生任何推送时）运行工作流。\n\n```yaml\non:\n  push:\n    branches:\n      - main\n      - 'releases/**'\n```\n\n### 将活动类型和筛选器用于多个事件\n\n如果为事件指定活动类型或筛选器，并且针对多个事件指定工作流触发器，则必须单独配置每个事件。 必须为所有事件附加冒号 (`:`)，包括没有配置的事件。\n\n例如，具有以下 `on` 值的工作流将在以下情况下运行：\n\n* 创建标签\n* 推送到存储库中的 `main` 分支\n* 推送到启用了 GitHub Pages 的分支\n\n```yaml\non:\n  label:\n    types:\n      - created\n  push:\n    branches:\n      - main\n  page_build:\n```\n\n## `on.<event_name>.types`\n\n使用 `on.<event_name>.types` 定义将触发工作流运行的活动类型。 大多数 GitHub 事件由多种活动触发。 例如，当标签为 `label`、`created` 或 `edited` 时，会触发 `deleted`。 通过 `types` 关键词可缩小触发工作流运行的活动类型的范围。 如果只有一种活动类型可触发 Webhook 事件，则不需要 `types` 关键字。\n\n可以使用事件 `types` 的数组。 有关每个事件及其活动类型的详细信息，请参阅 [触发工作流的事件](/zh/actions/reference/workflows-and-actions/events-that-trigger-workflows)。\n\n```yaml\non:\n  label:\n    types: [created, edited]\n```\n\n## `on.<pull_request|pull_request_target>.<branches|branches-ignore>`\n\n使用 `pull_request` 和 `pull_request_target` 事件时，可以将工作流配置为仅针对面向特定分支的拉取请求运行。\n\n如果要包含分支名称模式或同时包含和排除分支名称模式，请使用 `branches` 筛选器。 当您只想排除分支名称模式时，请使用 `branches-ignore` 筛选器。 不能对工作流中的同一事件同时使用 `branches` 和 `branches-ignore` 筛选器。\n\n如果你同时定义 `branches`/`branches-ignore` 和 [`paths`/`paths-ignore`](/zh/actions/reference/workflows-and-actions/workflow-syntax#onpushpull_requestpull_request_targetpathspaths-ignore)，则工作流将只在这两个筛选器都满足条件时运行。\n\n`branches` 和 `branches-ignore` 关键词接受使用 `*`、`**`、`+`、`?` 和 `!` 等字符匹配多个路径名称的 glob 模式。 如果名称包含其中任一字符，而你想要逐字匹配，则需要使用 `\\` 转义每个特殊字符。 有关 glob 模式的详细信息，请参阅 [GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#filter-pattern-cheat-sheet)。\n\n### 示例：包括分支\n\n在 `branches` 中定义的模式会针对 Git ref 的名称进行评估。 例如，对于目标为以下内容的拉取请求，每当发生 `pull_request` 事件时，以下工作流都会运行：\n\n* 名为 `main` 的分支 (`refs/heads/main`)\n* 名为 `mona/octocat` 的分支 (`refs/heads/mona/octocat`)\n* 名称以 `releases/` 开头的分支，如 `releases/10` (`refs/heads/releases/10`)\n\n```yaml\non:\n  pull_request:\n    # Sequence of patterns matched against refs/heads\n    branches:\n      - main\n      - 'mona/octocat'\n      - 'releases/**'\n```\n\n如果因分支筛选、[路径筛选](/zh/actions/reference/workflows-and-actions/workflow-syntax#onpushpull_requestpull_request_targetpathspaths-ignore)或[提交消息](/zh/actions/how-tos/manage-workflow-runs/skip-workflow-runs)而跳过某工作流，则与该工作流关联的检查将保持为“挂起”状态。 要求这些检查必须通过的拉取请求将无法合并。\n\n### 示例：排除分支\n\n当模式与 `branches-ignore` 模式匹配时，工作流将不会运行。 在 `branches-ignore` 中定义的模式根据 Git 引用的名称进行评估。 例如，除非拉取请求面向以下内容，否则每当有 `pull_request` 事件时，以下工作流都会运行：\n\n* 名为 `mona/octocat` 的分支 (`refs/heads/mona/octocat`)\n* 名称匹配 `releases/**-alpha` 的分支，如 `releases/beta/3-alpha` (`refs/heads/releases/beta/3-alpha`) <!-- markdownlint-disable-line outdated-release-phase-terminology -->\n\n```yaml\non:\n  pull_request:\n    # Sequence of patterns matched against refs/heads\n    branches-ignore:\n      - 'mona/octocat'\n      - 'releases/**-alpha'\n```\n\n### 示例：包括和排除分支\n\n不能在单个工作流中使用 `branches` 和 `branches-ignore` 筛选同一事件。 如果要同时包括和排除单个事件的分支模式，请使用 `branches` 筛选器以及 `!` 字符来指示应排除哪些分支或标记。\n\n如果使用字符 `!` 定义分支，则还必须至少定义一个没有 `!` 字符的分支。 如果只想排除分支，请改用 `branches-ignore`。\n\n您定义模式事项的顺序。\n\n* 肯定匹配后的匹配否定模式（前缀为 `!`）将排除 Git 引用。\n* 否定匹配后的匹配肯定模式将再次包含 Git 引用。\n\n以下工作流将在针对面向 `pull_request` 或 `releases/10` 的拉取请求的 `releases/beta/mona` 事件上运行，但不针对面向 `releases/10-alpha` 或 `releases/beta/3-alpha` 的拉取请求，由于负模式，`!releases/**-alpha` 将遵循正模式。 <!-- markdownlint-disable-line outdated-release-phase-terminology -->\n\n```yaml\non:\n  pull_request:\n    branches:\n      - 'releases/**'\n      - '!releases/**-alpha'\n```\n\n## `on.push.<branches|tags|branches-ignore|tags-ignore>`\n\n使用 `push` 事件时，可以将工作流配置为在特定分支或标记上运行。\n\n如果要包含分支名称模式或要同时包含和排除分支名称模式，请使用 `branches` 筛选器。 只希望排除分支名称时，请使用 `branches-ignore` 筛选器。 不能对工作流中的同一事件同时使用 `branches` 和 `branches-ignore` 筛选器。\n\n如果要包含标记名称模式或要同时包含和排除标记名称模式，请使用 `tags` 筛选器。 只需要排除标记名称模式时，请使用 `tags-ignore` 筛选器。 不能对工作流中的同一事件同时使用 `tags` 和 `tags-ignore` 筛选器。\n\n如果仅定义了 `tags`/`tags-ignore` 或者仅定义了 `branches`/`branches-ignore`，那么对于影响未定义的 Git 引用的事件，工作流将不会运行。如果既未定义 `tags`/`tags-ignore` 也未定义 `branches`/`branches-ignore`，则工作流将针对影响分支或标记的事件运行。 如果你同时定义 `branches`/`branches-ignore` 和 [`paths`/`paths-ignore`](/zh/actions/reference/workflows-and-actions/workflow-syntax#onpushpull_requestpull_request_targetpathspaths-ignore)，则工作流将只在这两个筛选器都满足条件时运行。\n\n`branches`、`branches-ignore`、`tags` 和 `tags-ignore` 关键词接受使用 `*`、`**`、`+`、`?` 和 `!` 等字符匹配多个分支或标记名称的 glob 模式。 如果名称包含其中任一字符，而你想要逐字匹配，则需要使用 \\_\\_ 转义每个特殊字符。 有关 glob 模式的详细信息，请参阅 [GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#filter-pattern-cheat-sheet)。\n\n### 示例：包括分支和标记\n\n在 `branches` 和 `tags` 中定义的模式根据 Git ref 的名称进行评估。 例如，当以下项出现 `push` 事件时，将运行以下工作流：\n\n* 名为 `main` 的分支 (`refs/heads/main`)\n* 名为 `mona/octocat` 的分支 (`refs/heads/mona/octocat`)\n* 名称以 `releases/` 开头的分支，如 `releases/10` (`refs/heads/releases/10`)\n* 名为 `v2` 的标记 (`refs/tags/v2`)\n* 名称以 `v1.` 开头的标记，如 `v1.9.1` (`refs/tags/v1.9.1`)\n\n```yaml\non:\n  push:\n    # Sequence of patterns matched against refs/heads\n    branches:\n      - main\n      - 'mona/octocat'\n      - 'releases/**'\n    # Sequence of patterns matched against refs/tags\n    tags:\n      - v2\n      - v1.*\n```\n\n### 示例：排除分支和标记\n\n当某个模式与 `branches-ignore` 或 `tags-ignore` 模式匹配时，工作流将不会运行。 在 `branches` 和 `tags` 中定义的模式根据 Git ref 的名称进行评估。 例如，只要出现 `push` 事件，就会运行以下工作流，除非以下项出现 `push` 事件：\n\n* 名为 `mona/octocat` 的分支 (`refs/heads/mona/octocat`)\n* 名称与 `releases/**-alpha` 匹配的分支，如 `releases/beta/3-alpha` (`refs/heads/releases/beta/3-alpha`) <!-- markdownlint-disable-line outdated-release-phase-terminology -->\n* 名为 `v2` 的标记 (`refs/tags/v2`)\n* 名称以 `v1.` 开头的标记，如 `v1.9` (`refs/tags/v1.9`)\n\n```yaml\non:\n  push:\n    # Sequence of patterns matched against refs/heads\n    branches-ignore:\n      - 'mona/octocat'\n      - 'releases/**-alpha'\n    # Sequence of patterns matched against refs/tags\n    tags-ignore:\n      - v2\n      - v1.*\n```\n\n### 示例：包括和排除分支和标签\n\n不能在一个工作流中使用 `branches` 和 `branches-ignore` 筛选同一事件。 同样，不能在一个工作流中使用 `tags` 和 `tags-ignore` 筛选同一事件。 如果要同时包括和排除一个事件的分支或标记模式，请使用 `branches` 或 `tags` 筛选器以及 `!` 字符来指示应排除哪些分支或标记。\n\n如果使用字符 `!` 定义分支，则还必须至少定义一个没有 `!` 字符的分支。 如果只想排除分支，请改用 `branches-ignore`。 同样，如果使用字符 `!` 定义标记，则还必须至少定义一个没有 `!` 字符的标记。 如果只想排除标记，请改用 `tags-ignore`。\n\n您定义模式事项的顺序。\n\n* 肯定匹配后的匹配否定模式（前缀为 `!`）将排除 Git 引用。\n* 否定匹配后的匹配肯定模式将再次包含 Git 引用。\n\n以下工作流将在推送到 `releases/10` 或 `releases/beta/mona` 时运行，但不在推送到 `releases/10-alpha` 或 `releases/beta/3-alpha` 时运行，因为否定模式 `!releases/**-alpha` 遵循肯定模式。 <!-- markdownlint-disable-line outdated-release-phase-terminology -->\n\n```yaml\non:\n  push:\n    branches:\n      - 'releases/**'\n      - '!releases/**-alpha'\n```\n\n## `on.<push|pull_request|pull_request_target>.<paths|paths-ignore>`\n\n使用 `push` 和 `pull_request` 事件时，可以配置工作流以根据更改的文件路径运行。 路径筛选器不会对标签推送进行评估。\n\n如果想要包括文件路径模式或想要同时包括和排除文件路径模式，请使用 `paths` 筛选器。 如果只想排除文件路径模式，请使用 `paths-ignore` 筛选器。 不能对工作流中的同一事件同时使用 `paths` 和 `paths-ignore` 筛选器。 如果要同时包括和排除单个事件的路径模式，请使用前缀为 `paths` 字符的 `!` 筛选器来指示应排除哪些路径。\n\n> \\[!NOTE]\n> 您定义 `paths` 模式的顺序很重要：\n>\n> * 在正向匹配之后，如果又匹配到否定模式（前缀为 `!`），则将排除该路径。\n> * 在负向匹配之后出现的正向模式会再次包含该路径。\n\n如果你同时定义 `branches`/`branches-ignore` 筛选器和 `paths`/`paths-ignore` 筛选器，则工作流将只在这两个筛选器都满足条件时运行。\n\n`paths` 和 `paths-ignore` 关键字支持 glob 模式，这些模式使用 `*` 和 `**` 通配符字符来匹配多个路径名。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#filter-pattern-cheat-sheet)”。\n\n### 示例：包括路径\n\n如果至少一个路径与 `paths` 筛选器中的模式匹配，则工作流将运行。 例如，只要推送 JavaScript 文件 (`.js`)，就会运行以下工作流。\n\n```yaml\non:\n  push:\n    paths:\n      - '**.js'\n```\n\n如果因路径筛选、[分支筛选](/zh/actions/reference/workflows-and-actions/workflow-syntax#onpull_requestpull_request_targetbranchesbranches-ignore)或[提交消息](/zh/actions/how-tos/manage-workflow-runs/skip-workflow-runs)而跳过某工作流，则与该工作流关联的检查将保持为“挂起”状态。 要求这些检查成功的拉取请求将被阻止合并。\n\n### 示例：排除路径\n\n当所有路径名称匹配 `paths-ignore` 中的模式时，工作流不会运行。 如果任何路径名与 `paths-ignore` 中的模式不匹配，即使某些路径名与模式匹配，工作流也会运行。\n\n具有以下路径筛选器的工作流将仅在 `push` 事件上运行，这些事件包括至少一个位于存储库根目录的 `docs` 目录外的文件。\n\n```yaml\non:\n  push:\n    paths-ignore:\n      - 'docs/**'\n```\n\n### 示例：包括和排除路径\n\n不能在单个工作流中使用 `paths` 和 `paths-ignore` 筛选同一事件。 如果要同时包括和排除单个事件的路径模式，请使用前缀为 `!` 字符的 `paths` 筛选器来指示应排除哪些路径。\n\n如果使用 `!` 字符定义路径，则还必须定义至少一个不带 `!` 字符的路径。 如果只想排除路径，请改用 `paths-ignore`。\n\n您定义 `paths` 模式事项的顺序：\n\n* 肯定匹配后的匹配否定模式（前缀为 `!`）将排除路径。\n* 否定匹配后的匹配肯定模式将再次包含路径。\n\n只要 `push` 事件包括 `sub-project` 目录或其子目录中的文件，此示例就会运行，除非该文件在 `sub-project/docs` 目录中。 例如，更改了 `sub-project/index.js` 或 `sub-project/src/index.js` 的推送将会触发工作流运行，但只更改 `sub-project/docs/readme.md` 的推送不会触发。\n\n```yaml\non:\n  push:\n    paths:\n      - 'sub-project/**'\n      - '!sub-project/docs/**'\n```\n\n### Git 差异比较\n\n筛选器通过评估更改的文件并针对 `paths-ignore` 或 `paths` 列表运行它们来确定是否应运行工作流。 如果没有更改文件，工作流程将不会运行。\n\nGitHub 对于推送使用双点差异比较，对于拉取请求使用三点差异比较来生成已更改文件的列表：\n\n* **拉取请求：** 三点比较是指对主题分支的最新版本与主题分支上次与基础分支同步时所在提交之间的比较。\n* **推送到现有分支：** 双点差异直接相互比较头部和基础 SHA。\n* **推送到新分支：** 根据已推送最深提交的上级父项的两点差异。\n\n在某些情况下， GitHub Actions 应用更改筛选工作流运行方式的限制：\n\n* 如果推送包含超过 1,000 个提交，工作流 **将始终** 运行。\n* 如果生成差异超时，工作流 **将始终** 运行。\n* 如果生成的差异包含 3,000 多个文件，并且工作流筛选器匹配的文件不在筛选器返回的前 3,000 个文件中，则工作流 **将不会** 运行。\n\n如果观察到这些行为，则可能需要使筛选器更加具体，或更改处理推送和拉取请求的方式，以生成更简单的差异。\n\n有关详细信息，请参阅“[分支](/zh/pull-requests/reference/branches)”。\n\n## `on.schedule`\n\n可以使用 `on.schedule` 定义工作流的时间计划。\n\n使用 [POSIX cron 语法](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html#tag_20_25_07) 计划工作流在特定时间运行。\n默认情况下，计划的工作流以 UTC 方式运行。 可以选择使用 [IANA 时区字符串](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)指定时区，以 UTC工作流。 计划的工作流在默认分支的最新提交上运行。 您可以运行预定工作流程的最短间隔是每 5 分钟一次。\n\n> \\[!NOTE]\n> 对于设置为 `timezone` 观察夏令时（DST）的时区（DST）的计划，在 DST 春季前移转换期间，计划工作流将提前数小时前进到下一个有效时间。 例如，上午 2：30 的计划将提前到凌晨 3：00。\n\n计划任务语法有五个字段，中间用空格分隔，每个字段代表一个时间单位。\n\n```text\n┌───────────── minute (0 - 59)\n│ ┌───────────── hour (0 - 23)\n│ │ ┌───────────── day of the month (1 - 31)\n│ │ │ ┌───────────── month (1 - 12 or JAN-DEC)\n│ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)\n│ │ │ │ │\n* * * * *\n```\n\n你可在这五个字段中使用以下运算符：\n\n| 运算符                                                              | 说明     | 示例 |\n| ---------------------------------------------------------------- | ------ | -- |\n| \\*                                                               | 任何值    |    |\n| `15 * * * *` 在每天每小时的每个第 15 分钟运行。                                 |        |    |\n| \"                                                                | 值列表分隔符 |    |\n| `2,10 4,5 * * *` 在每天第 4 和第 5 小时的第 2 和第 10 分钟运行。                  |        |    |\n| -                                                                | 值的范围   |    |\n| `30 4-6 * * *` 在第 4、5 和 6 小时的第 30 分钟运行。                          |        |    |\n| /                                                                | 步骤值    |    |\n| `20/15 * * * *` 从第 20 分钟到第 59 分钟之间每隔 15 分钟运行一次（第 20、35 和 50 分钟）。 |        |    |\n\n本示例触发工作流在美国/纽约时区每周一到周五的凌晨5:30运行。\n\n```yaml\non:\n  schedule:\n    - cron: '30 5 * * 1-5'\n      timezone: \"America/New_York\"\n```\n\n多个 `schedule` 事件可以触发单个工作流。 通过 `schedule` 上下文访问触发工作流的 `github.event.schedule` 事件。 此示例触发工作流在每周一至周四 UTC 时间 5:30 以及周二和周四 UTC 时间 17:30 运行，但在周一和周三跳过 `Not on Monday or Wednesday` 步骤。\n\n```yaml\non:\n  schedule:\n    - cron: '30 5 * * 1,3'\n    - cron: '30 5,17 * * 2,4'\n\njobs:\n  test_schedule:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Not on Monday or Wednesday\n        if: github.event.schedule != '30 5 * * 1,3'\n        run: echo \"This step will be skipped on Monday and Wednesday\"\n      - name: Every time\n        run: echo \"This step will always run\"\n```\n\n有关 `schedule` 事件的详细信息，请参阅 [触发工作流的事件](/zh/actions/reference/workflows-and-actions/events-that-trigger-workflows#schedule)。\n\n## `on.workflow_call`\n\n使用 `on.workflow_call` 定义可重用工作流的输入和输出。 您还可以映射可用于被调用工作流程的机密。 有关可重用工作流的详细信息，请参阅“[重用工作流](/zh/actions/how-tos/reuse-automations/reuse-workflows)”。\n\n## `on.workflow_call.inputs`\n\n使用 `workflow_call` 关键字时，可以选择指定从调用方工作流传递到被调用工作流的输入。 有关 `workflow_call` 关键字的详细信息，请参阅 [触发工作流的事件](/zh/actions/reference/workflows-and-actions/events-that-trigger-workflows#workflow_call)。\n\n除了可用的标准输入参数外，`on.workflow_call.inputs` 还需要一个 `type` 参数。 有关详细信息，请参阅 [`on.workflow_call.inputs.<input_id>.type`](#onworkflow_callinputsinput_idtype)。\n\n如果未设置 `default` 参数，则对布尔值、数字和字符串来说，输入的默认值依次为 `false`、`0` 和 `\"\"`。\n\n在被调用的工作流中，可以使用 `inputs` 上下文来引用输入。 有关详细信息，请参阅“[上下文参考](/zh/actions/reference/workflows-and-actions/contexts#inputs-context)”。\n\n如果调用方工作流程传递的输入未在被调用工作流程中指定，则会导致错误。\n\n### `on.workflow_call.inputs` 的示例\n\n```yaml\non:\n  workflow_call:\n    inputs:\n      username:\n        description: 'A username passed from the caller workflow'\n        default: 'john-doe'\n        required: false\n        type: string\n\njobs:\n  print-username:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Print the input name to STDOUT\n        run: echo The username is ${{ inputs.username }}\n```\n\n有关详细信息，请参阅“[重用工作流](/zh/actions/how-tos/reuse-automations/reuse-workflows)”。\n\n## `on.workflow_call.inputs.<input_id>.type`\n\n如果为 `on.workflow_call` 关键字定义了输入，则为必需。 此参数的值是指定输入的数据类型的字符串。 其必须是 `boolean`、`number` 或 `string`。\n\n## `on.workflow_call.outputs`\n\n被调用工作流程的输出映射。 调用的工作流程输出可用于调用方工作流程中的所有下游作业。 每个输出都有一个标识符、一个可选 `description,` 和一个 `value.`。必须将 `value` 设置为被调用工作流内作业中的输出值。\n\n在下面的示例中，为此可重用工作流定义了两个输出：`workflow_output1` 和 `workflow_output2`。 这些输出被映射为 `job_output1` 和 `job_output2`，两者均来自称为 `my_job` 的作业。\n\n### `on.workflow_call.outputs` 的示例\n\n```yaml\non:\n  workflow_call:\n    # Map the workflow outputs to job outputs\n    outputs:\n      workflow_output1:\n        description: \"The first job output\"\n        value: ${{ jobs.my_job.outputs.job_output1 }}\n      workflow_output2:\n        description: \"The second job output\"\n        value: ${{ jobs.my_job.outputs.job_output2 }}\n```\n\n有关如何引用作业输出的信息，请参阅 [`jobs.<job_id>.outputs`](#jobsjob_idoutputs)。 有关详细信息，请参阅“[重用工作流](/zh/actions/how-tos/reuse-automations/reuse-workflows)”。\n\n## `on.workflow_call.secrets`\n\n可在被调用工作流程中使用的机密的映射。\n\n在调用的工作流中，可以使用 `secrets` 上下文来引用机密。\n\n> \\[!NOTE]\n> 如果要将机密传递给嵌套的可重用工作流，则必须再次使用 [`jobs.<job_id>.secrets`](#jobsjob_idsecrets) 来传递机密。 有关详细信息，请参阅“[重用工作流](/zh/actions/how-tos/reuse-automations/reuse-workflows#passing-secrets-to-nested-workflows)”。\n\n如果调用方工作流程传递的机密未在被调用的工作流程中指定，则会导致错误。\n\n### `on.workflow_call.secrets` 的示例\n\n```yaml\non:\n  workflow_call:\n    secrets:\n      access-token:\n        description: 'A token passed from the caller workflow'\n        required: false\n\njobs:\n\n  pass-secret-to-action:\n    runs-on: ubuntu-latest\n    steps:\n    # passing the secret to an action\n      - name: Pass the received secret to an action\n        uses: ./.github/actions/my-action\n        with:\n          token: ${{ secrets.access-token }}\n\n  # passing the secret to a nested reusable workflow\n  pass-secret-to-workflow:\n    uses: ./.github/workflows/my-workflow\n    secrets:\n       token: ${{ secrets.access-token }}\n```\n\n## `on.workflow_call.secrets.<secret_id>`\n\n用于与机密关联的字符串标识符。\n\n## `on.workflow_call.secrets.<secret_id>.required`\n\n指定一个布尔变量来表明该机密值是否必须提供。\n\n## `on.workflow_run.<branches|branches-ignore>`\n\n使用 `workflow_run` 事件时，可以指定触发工作流必须在哪些分支上运行才能触发工作流。\n\n`branches` 和 `branches-ignore` 筛选器接受使用 `*`、`**`、`+`、`?` 和 `!` 等字符匹配多个分支名称的 glob 模式。 如果名称包含这些字符中的任意一个，而你想按字面匹配，则需要使用 \\_\\_ 对这些特殊字符中的每一个进行 `\\`。 有关 glob 模式的详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/reference/workflows-and-actions/workflow-syntax#filter-pattern-cheat-sheet)”。\n\n例如，仅当名为 `Build` 的工作流在名称以 `releases/` 开头的分支上运行时，具有以下触发器的工作流才会运行：\n\n```yaml\non:\n  workflow_run:\n    workflows: [\"Build\"]\n    types: [requested]\n    branches:\n      - 'releases/**'\n```\n\n仅当名为 `Build` 的工作流不在名为 `canary` 的分支上运行时，具有以下触发器的工作流才会运行：\n\n```yaml\non:\n  workflow_run:\n    workflows: [\"Build\"]\n    types: [requested]\n    branches-ignore:\n      - \"canary\"\n```\n\n不能对工作流中的同一事件同时使用 `branches` 和 `branches-ignore` 筛选器。 如果要同时包括和排除单个事件的分支模式，请使用 `branches` 筛选器以及 `!` 字符来指示应排除哪些分支。\n\n您定义模式的顺序很重要。\n\n* 在正向匹配之后，如果又匹配到一个否定模式（前缀为 `!`），则该分支将被排除。\n* 在否定匹配之后，匹配的肯定模式会再次包含该分支。\n\n例如，当名为 `Build` 的工作流在名为 `releases/10` 或 `releases/beta/mona` 但不在名为 `releases/10-alpha`、`releases/beta/3-alpha` 或 `main` 的分支上运行时，具有以下触发器的工作流将运行。 <!-- markdownlint-disable-line outdated-release-phase-terminology -->\n\n```yaml\non:\n  workflow_run:\n    workflows: [\"Build\"]\n    types: [requested]\n    branches:\n      - 'releases/**'\n      - '!releases/**-alpha'\n```\n\n## `on.workflow_dispatch`\n\n使用 `workflow_dispatch` 事件时，你可以选择性指定传递到工作流的输入。\n\n此触发器仅当工作流文件位于默认分支时接收事件。\n\n## `on.workflow_dispatch.inputs`\n\n触发的工作流接收 `inputs` 上下文中的输入。 有关详细信息，请参阅“[上下文](/zh/actions/reference/workflows-and-actions/contexts#inputs-context)”。\n\n> \\[!NOTE]\n>\n> * 工作流还将接收 `github.event.inputs` 上下文中的输入。\n>   `inputs` 上下文和 `github.event.inputs` 上下文中的信息完全相同，但 `inputs` 上下文将布尔值保留为布尔值，而不是将它们转换为字符串。\n>   `choice` 类型解析为字符串，是单个可选选项。\n> * 顶级属性 `inputs` 的最大数目为 25 。\n> *\n\n`inputs` 的最大有效负载为 65,535 个字符。\n\n### `on.workflow_dispatch.inputs` 的示例\n\n```yaml\non:\n  workflow_dispatch:\n    inputs:\n      logLevel:\n        description: 'Log level'\n        required: true\n        default: 'warning'\n        type: choice\n        options:\n          - info\n          - warning\n          - debug\n      print_tags:\n        description: 'True to print to STDOUT'\n        required: true\n        type: boolean\n      tags:\n        description: 'Test scenario tags'\n        required: true\n        type: string\n      environment:\n        description: 'Environment to run tests against'\n        type: environment\n        required: true\n\njobs:\n  print-tag:\n    runs-on: ubuntu-latest\n    if: ${{ inputs.print_tags }} \n    steps:\n      - name: Print the input tag to STDOUT\n        run: echo  The tags are ${{ inputs.tags }} \n```\n\n## `on.workflow_dispatch.inputs.<input_id>.required`\n\n指定是否必须提供输入的布尔值。\n\n## `on.workflow_dispatch.inputs.<input_id>.type`\n\n此参数的值是指定输入的数据类型的字符串。 这必须是 `boolean`、`choice`、`number`、`environment` 或 `string`。\n\n## `permissions`\n\n可以使用 `permissions` 修改授予 `GITHUB_TOKEN` 的默认权限，根据需要添加或删除访问权限，以便只授予所需的最低访问权限。 有关详细信息，请参阅“[在工作流中使用 GITHUB\\_TOKEN 进行身份验证](/zh/actions/tutorials/authenticate-with-github_token#modifying-the-permissions-for-the-github_token)”。\n\n可以使用 `permissions` 作为顶级密钥，以应用于工作流中的所有作业或特定作业。 当你在特定作业中添加 `permissions` 密钥时，该作业中使用 `GITHUB_TOKEN` 的所有操作和运行命令都将获得你指定的访问权限。 有关详细信息，请参阅 [`jobs.<job_id>.permissions`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idpermissions)。\n\n组织 的所有者可以在存储库级别限制 `GITHUB_TOKEN` 的写入权限。 有关详细信息，请参阅 [禁用或限制组织的 GitHub Actions](/zh/organizations/managing-organization-settings/disabling-or-limiting-github-actions-for-your-organization#setting-the-permissions-of-the-github_token-for-your-organization)。\n\n当工作流由 [`pull_request_target`](/zh/actions/reference/workflows-and-actions/events-that-trigger-workflows#pull_request_target) 事件触发时，将授予 `GITHUB_TOKEN` 读/写存储库权限，即使从公共分支触发也是如此。 有关详细信息，请参阅“[触发工作流的事件](/zh/actions/reference/workflows-and-actions/events-that-trigger-workflows#pull_request_target)”。\n\n对于下表中显示的每个可用权限，可以分配以下访问级别之一：`read`（如果适用）、`write` 或 `none`。\n`write` 包括 `read`。 如果你指定其中任何权限的访问权限，则所有未指定的作用域都被设置为 `none`。\n\n可用的权限以及每个权限允许执行的操作的详细信息：\n\n| 权限                                                                                                                                                                                                                                                                                                                                   | 允许操作使用 `GITHUB_TOKEN`                                                                                                                                                                                                                                                                                                                                     |\n| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `actions`                                                                                                                                                                                                                                                                                                                            | 使用 GitHub Actions。 例如，`actions: write` 允许操作取消工作流运行。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-actions)”。                                                                                                                                                   |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `artifact-metadata`                                                                                                                                                                                                                                                                                                                  | 使用项目元数据。 例如，`artifact-metadata: write` 允许采取行动以代表生成项目创建存储记录。 有关详细信息，请参阅“[工件元数据的 REST API 终结点](/zh/rest/orgs/artifact-metadata?apiVersion=2022-11-28)”。                                                                                                                                                                                                     |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `attestations`                                                                                                                                                                                                                                                                                                                       | 使用项目证明。 例如，`attestations: write` 允许一个操作为生成生成项目证明。 有关详细信息，请参阅 [使用项目证明确立生成的来源](/zh/actions/how-tos/secure-your-work/use-artifact-attestations/use-artifact-attestations)                                                                                                                                                                                    |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `checks`                                                                                                                                                                                                                                                                                                                             | 使用检查运行和检查套件。 例如，`checks: write` 允许操作创建检查运行。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-checks)”。                                                                                                                                                            |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `code-quality`                                                                                                                                                                                                                                                                                                                       | 处理代码质量。 例如， `code-quality: write` 允许某个操作上传代码覆盖率报告。 有关详细信息，请参阅“[GitHub 代码质量](/zh/code-security/concepts/code-quality/code-quality)”。                                                                                                                                                                                                                       |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `contents`                                                                                                                                                                                                                                                                                                                           | 处理存储库的内容。 例如，`contents: read` 允许操作列出提交，`contents: write` 允许操作创建发布。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents)”。                                                                                                                                   |\n| `deployments`                                                                                                                                                                                                                                                                                                                        | 处理部署。 例如，`deployments: write` 允许操作创建新部署。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-deployments)”。                                                                                                                                                          |\n| `discussions`                                                                                                                                                                                                                                                                                                                        | 使用 GitHub Discussions。 例如，`discussions: write` 允许操作关闭或删除讨论。 有关详细信息，请参阅“[使用 GraphQL API 进行讨论](/zh/graphql/guides/using-the-graphql-api-for-discussions)”。                                                                                                                                                                                                  |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `id-token`                                                                                                                                                                                                                                                                                                                           | 提取 OpenID Connect (OIDC) 令牌。 这需要 `id-token: write`。 有关详细信息，请参阅 [OpenID Connect](/zh/actions/concepts/security/openid-connect#updating-your-workflows-for-oidc)                                                                                                                                                                                            |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `issues`                                                                                                                                                                                                                                                                                                                             | 处理问题。 例如，`issues: write` 允许操作向问题添加注释。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-issues)”。                                                                                                                                                                  |\n| `packages`                                                                                                                                                                                                                                                                                                                           | 使用 GitHub Packages。 例如，`packages: write` 允许操作在 GitHub Packages 上上传和发布包。 有关详细信息，请参阅“[关于 GitHub Packages 的权限](/zh/packages/learn-github-packages/about-permissions-for-github-packages#about-scopes-and-permissions-for-package-registries)”。                                                                                                               |\n| `pages`                                                                                                                                                                                                                                                                                                                              | 使用 GitHub Pages。 例如，`pages: write` 允许操作请求 GitHub Pages 生成。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-pages)”。                                                                                                                                              |\n| `pull-requests`                                                                                                                                                                                                                                                                                                                      | 处理拉取请求。 例如，`pull-requests: write` 允许操作向拉取请求添加标签。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-pull-requests)”。                                                                                                                                                |\n| `security-events`                                                                                                                                                                                                                                                                                                                    | 处理 GitHub 代码扫描警报。 例如，`security-events: read` 允许操作列出存储库的代码扫描警报，而 `security-events: write` 允许操作更新代码扫描警报的状态。 有关详细信息，请参阅 [“代码扫描警报”的存储库权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-code-scanning-alerts)。 <br><br>                                                                       |\n| 对于 Dependabot 警报，请使用 `vulnerability-alerts` 权限。 无法通过此权限读取机密扫描警报，必须使用 GitHub App 或 personal access token。 有关详细信息，请参阅“GitHub 应用所需权限”中的“机密扫描警报的存储库权限”。[](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-secret-scanning-alerts)Dependabot 和机密扫描警报无法通过此权限读取，需要 GitHub 应用或 |                                                                                                                                                                                                                                                                                                                                                           |\n| `statuses`                                                                                                                                                                                                                                                                                                                           | 处理提交状态。 例如，`statuses:read` 允许操作列出给定引用的提交状态。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-commit-statuses)”。                                                                                                                                                   |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `vulnerability-alerts`                                                                                                                                                                                                                                                                                                               | 查看 Dependabot 警报。 例如， `vulnerability-alerts: read` 允许某个操作列出存储库的 Dependabot 警报。 仅 `read` 受支持且 `none` 不受支持; `write` 无效。 当使用`write-all`或`read-all`时，`vulnerability-alerts`将自动包含为`read`。 有关详细信息，请参阅 [“Dependabot 警报”的存储库权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-dependabot-alerts)。 |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n\n### 为 `GITHUB_TOKEN` 范围定义访问权限\n\n可以通过将 `GITHUB_TOKEN`、`read` 或 `write` 指定为 `none` 键中可用权限的值来定义 `permissions` 将允许的访问。\n\n```yaml\npermissions:\n  actions: read|write|none\n  artifact-metadata: read|write|none\n  attestations: read|write|none\n  checks: read|write|none\n  code-quality: read|write|none\n  contents: read|write|none\n  deployments: read|write|none\n  id-token: write|none\n  issues: read|write|none\n  discussions: read|write|none\n  packages: read|write|none\n  pages: read|write|none\n  pull-requests: read|write|none\n\n  security-events: read|write|none\n  statuses: read|write|none\n  vulnerability-alerts: read|none\n```\n\n如果为其中任何权限指定了访问权限，则所有未指定的权限都将设置为 `none`。\n\n可以使用以下语法来定义所有可用权限中的一种访问类型：`read-all` 或 `write-all` 访问。\n\n```yaml\npermissions: read-all\n```\n\n```yaml\npermissions: write-all\n```\n\n可以使用以下语法来禁用所有可用的权限：\n\n```yaml\npermissions: {}\n```\n\n#### 更改分支存储库中的权限\n\n可以使用 `permissions` 密钥添加和删除分叉存储库的读取权限，但通常不能授予其写入权限。 此行为的例外情况是，管理员用户在设置中选择了“从拉取请求发送写入令牌到工作流”选项。 有关详细信息，请参阅“[管理存储库的GitHub Actions设置](/zh/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#enabling-workflows-for-forks-of-private-repositories)”。\n\n### 如何计算工作流作业的权限\n\n`GITHUB_TOKEN` 的权限最初设置为企业、组织或存储库的默认设置。 如果默认设置为任何一个级别的限制权限，则将适用于相关的库。 例如，如果您在组织级别选择受限制的默认值，则该组织中的所有仓库将使用限制的权限作为默认值。 然后根据工作流程文件中的任何配置（首先在工作流程级别，然后在作业级别）对权限进行调整。 最后，如果工作流是由分叉存储库以外的 `pull_request_target` 拉取请求事件触发的，并且未选择 **从拉取请求设置将写入令牌发送到工作流** ，则会调整权限以将任何写入权限更改为只读。\n\n### 为工作流中的所有作业设置 `GITHUB_TOKEN` 权限\n\n可以在工作流的顶层指定 `permissions`，以便设置应用于工作流中的所有作业。\n\n#### 示例：为整个工作流设置 `GITHUB_TOKEN` 权限\n\n此示例显示为将要应用到工作流中所有作业的 `GITHUB_TOKEN` 设置的权限。 所有权限都被授予读取权限。\n\n```yaml\nname: \"My workflow\"\n\non: [ push ]\n\npermissions: read-all\n\njobs:\n  ...\n```\n\n### 对分支存储库使用 `permissions` 键\n\n可以使用 `permissions` 键为分支存储库添加和删除 `read` 权限，但通常不能授予 `write` 访问权限。 此行为的例外情况是管理员用户在 \\*\\*\\*\\* 设置中选择了“从拉取请求向工作流发送写入令牌”GitHub Actions选项。 有关详细信息，请参阅“[管理存储库的GitHub Actions设置](/zh/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#enabling-workflows-for-forks-of-private-repositories)”。\n\n### Dependabot 触发的工作流运行权限\n\n由 Dependabot 拉取请求触发的工作流运行被视为来自分支存储库，因此会使用只读的 `GITHUB_TOKEN`。 这些工作流运行无法访问任何机密信息。 有关保护这些工作流安全的策略的信息，请参阅“[安全使用指南](/zh/actions/reference/security/secure-use)”。\n\n## `env`\n\n可用于工作流中所有作业步骤的变量集合 `map`。 还可以设置仅适用于单个作业的步骤或单个步骤的变量。 有关详细信息，请参阅 [`jobs.<job_id>.env`](#jobsjob_idenv) 和 [`jobs.<job_id>.steps[*].env`](#jobsjob_idstepsenv)。\n\n`env` 映射中的变量不能根据映射中的其他变量进行定义。\n\n当多个环境变量使用相同的名称定义时，GitHub 会使用最特定的变量。 例如，步骤中定义的环境变量在步骤执行时将覆盖名称相同的作业和工作流环境变量。 为作业定义的环境变量在作业执行时将覆盖名称相同的工作流变量。\n\n### `env` 的示例\n\n```yaml\nenv:\n  SERVER: production\n```\n\n## `defaults`\n\n使用 `defaults` 创建将应用于工作流中所有作业的默认设置的 `map`。 您也可以设置只可用于作业的默认设置。 有关详细信息，请参阅 [`jobs.<job_id>.defaults`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_iddefaults)。\n\n使用相同名称定义了多个默认设置时，GitHub 会使用最具体的默认设置。 例如，在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。\n\n## `defaults.run`\n\n你可以使用 `defaults.run` 为工作流中所有 `working-directory` 步骤提供默认的 `run` 和 [](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsrun) 选项。 你也可以为只可用于作业的 `run` 设定默认设置。 有关详细信息，请参阅 [`jobs.<job_id>.defaults.run`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_iddefaultsrun)。 您不能在此关键词中使用上下文或表达式。\n\n使用相同名称定义了多个默认设置时，GitHub 会使用最具体的默认设置。 例如，在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。\n\n### 示例：设置默认 shell 和工作目录\n\n```yaml\ndefaults:\n  run:\n    shell: bash\n    working-directory: ./scripts\n```\n\n## `defaults.run.shell`\n\n使用 `shell` 为步骤定义 `shell`。 此关键字可以引用多个上下文。 有关详细信息，请参阅“[上下文](/zh/actions/reference/workflows-and-actions/contexts#context-availability)”。\n\n| 支持的平台       | `shell` 参数   | 说明                                                                                                                                   | 内部运行命令                                          |\n| ----------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------- |\n| Linux/macOS | unspecified  | 非 Windows 平台上的默认 shell。 请注意，这与显式指定 `bash` 时运行的命令不同。 如果在路径中找不到 `bash`，则将其视为 `sh`。                                                     | `bash -e {0}`                                   |\n| All         | `bash`       | 非 Windows 平台上回退到 `sh` 的默认 shell。 指定 Windows 上的 bash shell 时，将使用 Git for Windows 随附的 bash shel。                                       | `bash --noprofile --norc -eo pipefail {0}`      |\n| 全部          | `pwsh`       | PowerShell Core。 GitHub 将扩展名 `.ps1` 追加到你的脚本名称。                                                                                       | `pwsh -command \". '{0}'\"`                       |\n| All         | `python`     | 执行 python 命令。                                                                                                                        | `python {0}`                                    |\n| Linux/macOS | `sh`         | 未提供 shell 且在路径中找不到 `bash` 时的非 Windows 平台的后退行为。                                                                                       | `sh -e {0}`                                     |\n| Windows     | `cmd`        | GitHub 将扩展名 `.cmd` 追加到你的脚本名称并替换 `{0}`。                                                                                               | `%ComSpec% /D /E:ON /V:OFF /S /C \"CALL \"{0}\"\"`。 |\n| Windows     | `pwsh`       | 这是 Windows 上使用的默认 shell。 PowerShell Core。 GitHub 将扩展名 `.ps1` 追加到你的脚本名称。 如果自承载 Windows 运行器未安装 PowerShell Core，则改用 PowerShell Desktop。 | `pwsh -command \". '{0}'\"`。                      |\n| Windows     | `powershell` | PowerShell 桌面。 GitHub 将扩展名 `.ps1` 追加到你的脚本名称。                                                                                         | `powershell -command \". '{0}'\"`。                |\n\n使用相同名称定义了多个默认设置时，GitHub 会使用最具体的默认设置。 例如，在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。\n\n## `defaults.run.working-directory`\n\n使用 `working-directory` 为步骤定义用于 `shell` 的工作目录。 此关键字可以引用多个上下文。 有关详细信息，请参阅“[上下文](/zh/actions/reference/workflows-and-actions/contexts#context-availability)”。\n\n> \\[!TIP]\n> 在运行 shell 之前，请确保你分配的 `working-directory` 在运行器上存在。\n> 使用相同名称定义了多个默认设置时，GitHub 会使用最具体的默认设置。 例如，在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。\n\n## `concurrency`\n\n使用 `concurrency` 以确保只有使用相同并发组的单一作业或工作流才会同时运行。 并发组可以是任何字符串或表达式。 表达式只能使用 [`github`](/zh/actions/reference/workflows-and-actions/contexts#github-context)、[`inputs`](/zh/actions/reference/workflows-and-actions/contexts#inputs-context) 和 [`vars`](/zh/actions/reference/workflows-and-actions/contexts#vars-context) 上下文。 有关表达式的详细信息，请参阅“[对工作流和操作中的表达式求值](/zh/actions/reference/workflows-and-actions/expressions)”。\n\n你还可以在作业级别指定 `concurrency`。 有关详细信息，请参阅 [`jobs.<job_id>.concurrency`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idconcurrency)。\n\n这意味着，并发组中最多可以有一个正在运行的作业或工作流。 当并发作业或工作流排队时，如果存储库中使用同一并发组的其他作业或工作流正在运行，则排队的作业或工作流将为 `pending`。 默认情况下，将取消同一并发组中的任何现有 `pending` 作业或工作流，新的排队作业或工作流将取代其位置。\n\n若还要取消同一并发组中任何当前正在运行的作业或工作流，请指定 `cancel-in-progress: true`。 若要有条件地取消同一并发组中当前正在运行的作业或工作流，可以将 `cancel-in-progress` 指定为具有任何允许的表达式上下文的表达式。\n\n若要允许多个作业或工作流运行在同一 `pending` 并发组中等待，请使用可选 `queue` 属性。 该 `queue` 属性接受以下值：\n\n* `single` （默认值）：最多可以有一个作业或工作流运行在 `pending` 并发组中。 当新任务或工作流运行排队时，同一组中的任何现有任务或工作流运行将被取消并替换。\n* `max`：最多可以有 100 个作业或工作流运行在 `pending` 并发组中。 队列已满时，任何新增作业或工作流运行将被取消。\n\n组合 `queue: max` 和 `cancel-in-progress: true` 不允许，并将导致工作流验证错误。\n\n> \\[!NOTE]\n>\n> * 并发组名称不区分大小写。 例如，`prod` 和 `Prod` 将被视为同一个并发组。\n> * 作业或工作流在同一并发组中运行时，按照每个作业开始等待该并发组的时间，以先进先出（FIFO）的顺序处理，而不是按照每个工作流的分派时间。 由于作业或运行的实际开始时间可能有所不同，因此不能保证排序。\n\n### 示例：使用并发和默认行为\n\n默认情况下，GitHub Actions 允许多个作业或工作流同时运行。 使用`concurrency` 关键字可以控制工作流运行的并发性。\n\n例如，可以在定义触发器条件以限制特定分支的整个工作流运行的并发之后立即使用 `concurrency` 关键字：\n\n```yaml\non:\n  push:\n    branches:\n      - main\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n```\n\n还可以通过在作业级别使用 `concurrency` 关键字来限制工作流中作业的并发性：\n\n```yaml\non:\n  push:\n    branches:\n      - main\n\njobs:\n  job-1:\n    runs-on: ubuntu-latest\n    concurrency:\n      group: example-group\n      cancel-in-progress: true\n```\n\n### 示例：并发组\n\n并发组提供了一种方法，用于管理和限制共享相同并发密钥的工作流运行或作业的执行。\n\n该 `concurrency` 密钥用于将工作流或作业组合到并发组中。 定义 `concurrency` 密钥时， GitHub Actions 请确保在任何给定时间只运行具有该密钥的一个工作流或作业。 如果新的工作流运行或作业以相同的 `concurrency` 密钥启动， GitHub Actions 将取消已使用该密钥运行的任何工作流或作业。 键 `concurrency` 可以是硬编码字符串，也可以是包含上下文变量的动态表达式。\n\n可以在工作流中定义并发条件，以便工作流或作业是并发组的一部分。\n\n这意味着，当工作流运行或作业启动时，GitHub 将取消同一并发组中正在进行的任何工作流运行或作业。 在想要防止对特定工作流或作业（例如用于部署到过渡环境的工作流或作业）进行并行运行的情况下，这非常有用，以防止可能导致冲突或消耗比必要资源更多的操作。\n\n在此示例中，`job-1` 是名为 `staging_environment` 的并发组的一部分。 如果新运行的 `job-1` 被触发，那么在并发组 `staging_environment` 中已在进行的任何同一作业的运行都将被取消。\n\n```yaml\njobs:\n  job-1:\n    runs-on: ubuntu-latest\n    concurrency:\n      group: staging_environment\n      cancel-in-progress: true\n```\n\n或者，在工作流中使用动态表达式 `concurrency: ci-${{ github.ref }}` 意味着工作流或作业将成为并发组 `ci-` 的一部分，后跟触发工作流的分支或标记的引用。 在此示例中，如果在上一次运行仍在进行中时将新的提交推送到主分支，则会取消上一次运行，并且新运行将启动：\n\n```yaml\non:\n  push:\n    branches:\n      - main\n\nconcurrency:\n  group: ci-${{ github.ref }}\n  cancel-in-progress: true\n```\n\n### 示例：对多个待处理任务进行排队\n\n默认情况下，每次只能`pending`一个作业或工作流在并发组中运行。 若要允许多个运行排入队列而不是取消，请设置 `queue: max`。 在 `queue: max` 的情况下，最多可以有 100 个作业或工作流在并发组中等待运行；队列满后，将取消任何其他作业。\n\n例如，以下工作流将部署到 `production` 环境，根据每个运行开始等待并发组的时间逐个处理它们：\n\n```yaml\non:\n  push:\n    branches:\n      - main\n\nconcurrency:\n  group: production-deploy\n  queue: max\n```\n\n请注意， `queue: max` 不能与 `cancel-in-progress: true`这两个选项结合使用，因为两个选项描述了处理正在进行的运行时发生的冲突行为。\n\n### 示例：使用并发取消任何当前作业或运行\n\n若要使用并发来取消任何正在进行的任务或运行，可以使用密钥`concurrency`，并将选项`cancel-in-progress`设置为`true`：\n\n```yaml\nconcurrency:\n  group: ${{ github.ref }}\n  cancel-in-progress: true\n```\n\n请注意，在此示例中，如果不定义特定的并发组，GitHub Actions 将取消任何正在进行的\\_作业或工作流\\_的运行。\n\n### 示例：使用回退值\n\n如果使用仅为特定事件定义的属性生成组名称，则可以使用回退值。 例如，`github.head_ref` 仅对 `pull_request` 事件定义。 如果工作流响应除了 `pull_request` 事件之外的其他事件，你将需要提供回退以避免语法错误。 以下并发组仅取消针对 `pull_request` 事件正在进行的作业或运行；如果 `github.head_ref` 未定义，并发组将回退到运行 ID，该 ID 保证是唯一的，并且是为该运行定义的。\n\n```yaml\nconcurrency:\n  group: ${{ github.head_ref || github.run_id }}\n  cancel-in-progress: true\n```\n\n### 示例：仅取消当前工作流中正在进行的作业或运行\n\n如果在同一个存储库中有多个工作流，则并发组名称在工作流中必须是唯一的，以避免从其他工作流取消正在进行的作业或运行。 否则，任何先前进行中或挂起的任务都将被取消，无论工作流如何。\n\n若要仅取消同一工作流中正在进行的运行，可以使用 `github.workflow` 属性来构建并发组。\n\n```yaml\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n```\n\n### 示例：仅取消特定分支上正在进行的作业\n\n如果你想取消某些分支上正在进行的作业，但不想取消其他分支上正在进行的作业，则可以将条件表达式与 `cancel-in-progress` 一起使用。 例如，如果你想取消开发分支上正在进行的作业，但不想取消发布分支上正在进行的作业，则可以执行此操作。\n\n若要仅在未在发布分支上运行时取消同一工作流正在进行的运行，则可以设置表达式的 `cancel-in-progress`，如下所示：\n\n```yaml\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: ${{ !contains(github.ref, 'release/')}}\n```\n\n在此示例中，多次推送到 `release/1.2.3` 分支不会取消正在进行的运行。 推送到另一个分支（例如 `main`）将取消正在进行的运行。\n\n## `jobs`\n\n工作流运行由一个或多个 `jobs` 组成，默认情况下并行运行。 若要按顺序运行作业，可以使用 `jobs.<job_id>.needs` 关键字定义对其他作业的依赖关系。\n\n每个作业在 `runs-on` 指定的运行器环境中运行。\n\n在工作流程的使用限制之内可运行无限数量的作业。 有关详细信息，请参阅 [](/zh/actions/concepts/billing-and-usage) 托管运行器的 GitHub 和自托管运行器使用限制的 [Actions 限制](/zh/actions/reference/limits)。\n\n如果需要查找工作流运行中运行的作业的唯一标识符，可以使用 GitHub API。 有关详细信息，请参阅“[GitHub Actions 的 REST API 端点](/zh/rest/actions#workflow-jobs)”。\n\n## `jobs.<job_id>`\n\n使用 `jobs.<job_id>` 为作业提供唯一标识符。 键 `job_id` 是一个字符串，其值是作业配置数据的映射。 必须将 `<job_id>` 替换为对于 `jobs` 对象的唯一字符串。 `<job_id>` 必须以字母或 `_` 开头，并且只能包含字母数字字符、`-` 或 `_`。\n\n### 示例：创建作业\n\n在此示例中，已创建两个作业，其 `job_id` 值为 `my_first_job` 和 `my_second_job`。\n\n```yaml\njobs:\n  my_first_job:\n    name: My first job\n  my_second_job:\n    name: My second job\n```\n\n## `jobs.<job_id>.name`\n\n使用 `jobs.<job_id>.name` 设置作业名称，该名称显示在 GitHub UI 中。\n\n## `jobs.<job_id>.permissions`\n\n在特定的作业中，你可以使用 `jobs.<job_id>.permissions` 修改授予 `GITHUB_TOKEN` 的默认权限，根据需要添加或删除访问权限，以便只授予所需的最低访问权限。 有关详细信息，请参阅“[在工作流中使用 GITHUB\\_TOKEN 进行身份验证](/zh/actions/tutorials/authenticate-with-github_token#modifying-the-permissions-for-the-github_token)”。\n\n通过在作业定义中指定权限，可根据需要为每个作业的 `GITHUB_TOKEN` 配置一组不同的权限。 或者，您也可以为工作流程中的所有作业指定权限。 有关在工作流级别定义权限的信息，请参阅 [`permissions`](/zh/actions/reference/workflows-and-actions/workflow-syntax#permissions)。\n\n对于下表中显示的每个可用权限，可以分配以下访问级别之一：`read`（如果适用）、`write` 或 `none`。\n`write` 包括 `read`。 如果你指定其中任何权限的访问权限，则所有未指定的作用域都被设置为 `none`。\n\n可用的权限以及每个权限允许执行的操作的详细信息：\n\n| 权限                                                                                                                                                                                                                                                                                                                                   | 允许操作使用 `GITHUB_TOKEN`                                                                                                                                                                                                                                                                                                                                     |\n| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `actions`                                                                                                                                                                                                                                                                                                                            | 使用 GitHub Actions。 例如，`actions: write` 允许操作取消工作流运行。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-actions)”。                                                                                                                                                   |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `artifact-metadata`                                                                                                                                                                                                                                                                                                                  | 使用项目元数据。 例如，`artifact-metadata: write` 允许采取行动以代表生成项目创建存储记录。 有关详细信息，请参阅“[工件元数据的 REST API 终结点](/zh/rest/orgs/artifact-metadata?apiVersion=2022-11-28)”。                                                                                                                                                                                                     |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `attestations`                                                                                                                                                                                                                                                                                                                       | 使用项目证明。 例如，`attestations: write` 允许一个操作为生成生成项目证明。 有关详细信息，请参阅 [使用项目证明确立生成的来源](/zh/actions/how-tos/secure-your-work/use-artifact-attestations/use-artifact-attestations)                                                                                                                                                                                    |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `checks`                                                                                                                                                                                                                                                                                                                             | 使用检查运行和检查套件。 例如，`checks: write` 允许操作创建检查运行。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-checks)”。                                                                                                                                                            |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `code-quality`                                                                                                                                                                                                                                                                                                                       | 处理代码质量。 例如， `code-quality: write` 允许某个操作上传代码覆盖率报告。 有关详细信息，请参阅“[GitHub 代码质量](/zh/code-security/concepts/code-quality/code-quality)”。                                                                                                                                                                                                                       |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `contents`                                                                                                                                                                                                                                                                                                                           | 处理存储库的内容。 例如，`contents: read` 允许操作列出提交，`contents: write` 允许操作创建发布。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents)”。                                                                                                                                   |\n| `deployments`                                                                                                                                                                                                                                                                                                                        | 处理部署。 例如，`deployments: write` 允许操作创建新部署。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-deployments)”。                                                                                                                                                          |\n| `discussions`                                                                                                                                                                                                                                                                                                                        | 使用 GitHub Discussions。 例如，`discussions: write` 允许操作关闭或删除讨论。 有关详细信息，请参阅“[使用 GraphQL API 进行讨论](/zh/graphql/guides/using-the-graphql-api-for-discussions)”。                                                                                                                                                                                                  |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `id-token`                                                                                                                                                                                                                                                                                                                           | 提取 OpenID Connect (OIDC) 令牌。 这需要 `id-token: write`。 有关详细信息，请参阅 [OpenID Connect](/zh/actions/concepts/security/openid-connect#updating-your-workflows-for-oidc)                                                                                                                                                                                            |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `issues`                                                                                                                                                                                                                                                                                                                             | 处理问题。 例如，`issues: write` 允许操作向问题添加注释。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-issues)”。                                                                                                                                                                  |\n| `packages`                                                                                                                                                                                                                                                                                                                           | 使用 GitHub Packages。 例如，`packages: write` 允许操作在 GitHub Packages 上上传和发布包。 有关详细信息，请参阅“[关于 GitHub Packages 的权限](/zh/packages/learn-github-packages/about-permissions-for-github-packages#about-scopes-and-permissions-for-package-registries)”。                                                                                                               |\n| `pages`                                                                                                                                                                                                                                                                                                                              | 使用 GitHub Pages。 例如，`pages: write` 允许操作请求 GitHub Pages 生成。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-pages)”。                                                                                                                                              |\n| `pull-requests`                                                                                                                                                                                                                                                                                                                      | 处理拉取请求。 例如，`pull-requests: write` 允许操作向拉取请求添加标签。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-pull-requests)”。                                                                                                                                                |\n| `security-events`                                                                                                                                                                                                                                                                                                                    | 处理 GitHub 代码扫描警报。 例如，`security-events: read` 允许操作列出存储库的代码扫描警报，而 `security-events: write` 允许操作更新代码扫描警报的状态。 有关详细信息，请参阅 [“代码扫描警报”的存储库权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-code-scanning-alerts)。 <br><br>                                                                       |\n| 对于 Dependabot 警报，请使用 `vulnerability-alerts` 权限。 无法通过此权限读取机密扫描警报，必须使用 GitHub App 或 personal access token。 有关详细信息，请参阅“GitHub 应用所需权限”中的“机密扫描警报的存储库权限”。[](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-secret-scanning-alerts)Dependabot 和机密扫描警报无法通过此权限读取，需要 GitHub 应用或 |                                                                                                                                                                                                                                                                                                                                                           |\n| `statuses`                                                                                                                                                                                                                                                                                                                           | 处理提交状态。 例如，`statuses:read` 允许操作列出给定引用的提交状态。 有关详细信息，请参阅“[GitHub应用所需的权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-commit-statuses)”。                                                                                                                                                   |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n| `vulnerability-alerts`                                                                                                                                                                                                                                                                                                               | 查看 Dependabot 警报。 例如， `vulnerability-alerts: read` 允许某个操作列出存储库的 Dependabot 警报。 仅 `read` 受支持且 `none` 不受支持; `write` 无效。 当使用`write-all`或`read-all`时，`vulnerability-alerts`将自动包含为`read`。 有关详细信息，请参阅 [“Dependabot 警报”的存储库权限](/zh/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-dependabot-alerts)。 |\n|                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                           |\n\n### 为 `GITHUB_TOKEN` 范围定义访问权限\n\n可以通过将 `GITHUB_TOKEN`、`read` 或 `write` 指定为 `none` 键中可用权限的值来定义 `permissions` 将允许的访问。\n\n```yaml\npermissions:\n  actions: read|write|none\n  artifact-metadata: read|write|none\n  attestations: read|write|none\n  checks: read|write|none\n  code-quality: read|write|none\n  contents: read|write|none\n  deployments: read|write|none\n  id-token: write|none\n  issues: read|write|none\n  discussions: read|write|none\n  packages: read|write|none\n  pages: read|write|none\n  pull-requests: read|write|none\n\n  security-events: read|write|none\n  statuses: read|write|none\n  vulnerability-alerts: read|none\n```\n\n如果为其中任何权限指定了访问权限，则所有未指定的权限都将设置为 `none`。\n\n可以使用以下语法来定义所有可用权限中的一种访问类型：`read-all` 或 `write-all` 访问。\n\n```yaml\npermissions: read-all\n```\n\n```yaml\npermissions: write-all\n```\n\n可以使用以下语法来禁用所有可用的权限：\n\n```yaml\npermissions: {}\n```\n\n#### 更改分支存储库中的权限\n\n可以使用 `permissions` 密钥添加和删除分叉存储库的读取权限，但通常不能授予其写入权限。 此行为的例外情况是，管理员用户在设置中选择了“从拉取请求发送写入令牌到工作流”选项。 有关详细信息，请参阅“[管理存储库的GitHub Actions设置](/zh/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#enabling-workflows-for-forks-of-private-repositories)”。\n\n#### 示例：为工作流中的一个作业设置 `GITHUB_TOKEN` 权限\n\n本示例显示为将仅应用到作业 `stale` 的 `GITHUB_TOKEN` 设置的权限。 为 `issues` 和 `pull-requests` 权限授予写入权限。 所有其他权限均无权访问。\n\n```yaml\njobs:\n  stale:\n    runs-on: ubuntu-latest\n\n    permissions:\n      issues: write\n      pull-requests: write\n\n    steps:\n      - uses: actions/stale@v10\n```\n\n## `jobs.<job_id>.needs`\n\n使用 `jobs.<job_id>.needs` 标识运行此作业之前必须成功完成的所有作业。 它可以是一个字符串，也可以是字符串数组。 如果某个作业失败或跳过，则所有需要它的作业都会被跳过，除非这些作业使用让该作业继续的条件表达式。 如果某次运行包含一系列彼此依赖的作业，那么一旦某个作业失败或被跳过，从该作业开始，依赖链中的所有后续作业都会受到影响。 如果希望某个作业在其依赖的作业未成功时也能运行，请在 `always()` 中使用 `jobs.<job_id>.if` 条件表达式。\n\n### 示例：要求成功的依赖项作业\n\n```yaml\njobs:\n  job1:\n  job2:\n    needs: job1\n  job3:\n    needs: [job1, job2]\n```\n\n在此示例中，`job1` 必须在 `job2` 开始之前成功完成，并且 `job3` 等待 `job1` 和 `job2` 完成。\n\n此示例中的作业按顺序运行：\n\n1. `job1`\n2. `job2`\n3. `job3`\n\n### 示例：不要求成功的依赖项作业\n\n```yaml\njobs:\n  job1:\n  job2:\n    needs: job1\n  job3:\n    if: ${{ always() }}\n    needs: [job1, job2]\n```\n\n在此示例中，`job3` 使用 `always()` 条件表达式，确保始终在 `job1` 和 `job2` 完成（无论是否成功）后运行。 有关详细信息，请参阅“[对工作流和操作中的表达式求值](/zh/actions/reference/workflows-and-actions/expressions#status-check-functions)”。\n\n## `jobs.<job_id>.if`\n\n您可以使用 `jobs.<job_id>.if` 条件判断来防止作业运行，除非满足某个条件。 您可以使用任何支持上下文和表达式来创建条件。 有关此键中支持哪些上下文的详细信息，请参阅“[上下文参考](/zh/actions/reference/workflows-and-actions/contexts#context-availability)”。\n\n> \\[!NOTE]\n> `jobs.<job_id>.if` 条件在应用 [`jobs.<job_id>.strategy.matrix`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategymatrix) 之前进行评估。\n\n在 `if` 条件中使用表达式时，可以有选择地忽略 `${{ }}` 表达式语法，因为 GitHub Actions 自动将 `if` 条件作为表达式求值。 但此例外并非适用于所有情况。\n\n必须始终使用 `${{ }}` 表达式语法，或者当表达式以`!`开头时，必须使用 `''`、`\"\"`、`()` 进行转义，因为 `!` 是 YAML 格式的保留表示法。 例如：\n\n```yaml\nif: ${{ ! startsWith(github.ref, 'refs/tags/') }}\n```\n\n有关详细信息，请参阅 [对工作流和操作中的表达式求值](/zh/actions/reference/workflows-and-actions/expressions)。\n\n### 示例：仅针对特定存储库运行作业\n\n此示例使用 `if` 控制 `production-deploy` 作业何时可以运行。 仅当存储库名为 `octo-repo-prod` 且位于 `octo-org` 组织内时，它才会运行。 否则，作业将被标记为“跳过”。\n\n```yaml copy\nname: example-workflow\non: [push]\njobs:\n  production-deploy:\n    if: github.repository == 'octo-org/octo-repo-prod'\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-node@v7\n        with:\n          node-version: '14'\n      - run: npm install -g bats\n```\n\n## `jobs.<job_id>.runs-on`\n\n使用 `jobs.<job_id>.runs-on` 定义要运行作业的计算机类型。\n\n* 目标计算机可以是一个[GitHub托管运行器](#choosing-github-hosted-runners)、[大型运行器](#choosing-runners-in-a-group)，或是一个[自托管运行器](#choosing-self-hosted-runners)。\n\n* 你可以根据分配给运行器的标签、其组成员身份，或两者的组合来指定目标运行器。\n\n* 您可以按以下方式提供 `runs-on`：\n  * 单个字符串\n  * 包含字符串的单个变量\n  * 字符串数组、包含字符串的变量或两者的组合\n  * 使用 `key: value` 或 `group` 键的 `labels` 对\n\n* 如果指定字符串或变量数组，工作流将在任何与所有指定的 `runs-on` 值匹配的运行器上执行。 例如，此处的作业将仅在具有标签 `linux`、`x64` 和 `gpu` 的自托管运行器上运行：\n\n  ```yaml\n  runs-on: [self-hosted, linux, x64, gpu]\n  ```\n\n  有关详细信息，请参阅[选择自托管运行器](#choosing-self-hosted-runners)。\n\n* 可以在数组中混合使用字符串和变量。 例如：\n\n  ```yaml\n  on:\n    workflow_dispatch:\n      inputs:\n        chosen-os:\n          required: true\n          type: choice\n          options:\n          - Ubuntu\n          - macOS\n\n  jobs:\n    test:\n      runs-on: [self-hosted, \"${{ inputs.chosen-os }}\"]\n      steps:\n      - run: echo Hello world!\n  ```\n\n* 如果要在多台计算机上运行工作流，请使用 [`jobs.<job_id>.strategy`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategy)。\n\n> \\[!NOTE]\n> 在简单字符串（如） `self-hosted`周围不需要引号，但表达式 `\"${{ inputs.chosen-os }}\"`需要引号。\n\n### 选择 GitHub-hosted runners\n\n如果使用 GitHub托管运行程序，则每个作业在由 `runs-on`指定的运行程序映像的新实例中运行。\n\n当你使用 GitHub 托管运行器时，runs-on 的值可以是工作流标签或运行器组的名称。 下列表格显示了标准 GitHub 托管运行器的标签。\n\n有关详细信息，请参阅“[GitHub 托管的运行程序](/zh/actions/concepts/runners/github-hosted-runners)”。\n\n### 公共存储库的标准 GitHub 托管运行器\n\n对于公共存储库，使用下表中显示的工作流标签的作业将与关联的规范一起运行。\n除单 CPU 运行器外，每个 GitHub 托管的运行器都是由 GitHub 托管的新虚拟机（VM）。 单 CPU 运行器托管在共享 VM 上的容器中；请参阅[GitHub 托管的运行器参考](/zh/actions/reference/runners/github-hosted-runners#single-cpu-runners)。 使用标准 GitHub托管运行器在公共存储库上免费且不受限制。\n\n<table style=\"width:100%\">\n  <thead>\n    <tr>\n      <th scope=\"col\">\n<b>虚拟机/容器</b></th>\n      <th scope=\"col\">\n<b>处理器 (CPU)</b></th>\n      <th scope=\"col\">\n<b>内存 (RAM)</b></th>\n      <th scope=\"col\">\n<b>存储 (SSD)</b></th>\n      <th scope=\"col\">\n<b>建筑</b></th>\n      <th scope=\"col\">\n<b>工作流标签</b></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n          <td>Linux</td>\n          <td>1</td>\n          <td>5 GB</td>\n          <td>14 GB</td>\n          <td> x64 </td>\n          <td>\n            <code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu-slim/ubuntu-slim-Readme.md\">ubuntu-slim</a></code>\n          </td>\n        </tr>\n    <tr>\n      <td>Linux</td>\n      <td>4</td>\n      <td>16 GB</td>\n      <td>14 GB</td>\n      <td> X64 </td>\n      <td>\n\n```\n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md\">ubuntu-latest</a></code>、、<code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md\">ubuntu-24.04</a></code><code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2204-Readme.md\">ubuntu-22.04</a></code>、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2604-Readme.md\">ubuntu-26.04</a></code> （公共预览） </td>\n</tr>\n<tr>\n  <td>Windows</td>\n  <td>4</td>\n  <td>16 GB</td>\n  <td>14 GB</td>\n  <td> X64 </td>\n  <td>\n          \n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md\">windows-latest</a></code>、、<code><a href=\"https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md\">windows-2025</a></code><code><a href=\"https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-VS2026-Readme.md\">windows-2025-vs2026</a></code>、、<code><a href=\"https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md\">windows-2022</a></code></td>\n</tr>\n<tr>\n  <td>Linux</td>\n  <td>4</td>\n  <td>16 GB</td>\n  <td>14 GB</td>\n  <td> arm64 </td>\n  <td>\n          \n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Arm64-Readme.md\">ubuntu-24.04-arm</a></code>、、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2204-Arm64-Readme.md\">ubuntu-22.04-arm</a></code><code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2604-Arm64-Readme.md\">ubuntu-26.04-arm</a></code> （公共预览） </td>\n</tr>\n<tr>\n  <td>Windows</td>\n  <td>4</td>\n  <td>16 GB</td>\n  <td>14 GB</td>\n  <td>arm64</td>\n  <td>\n          \n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/windows/Windows11-Arm64-Readme.md\">windows-11-arm</a></code>、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/windows/Windows11-VS2026-Arm64-Readme.md\">windows-11-vs2026-arm</a></code></td>\n</tr>\n<tr>\n  <td>macOS</td>\n  <td>4</td>\n  <td>14 GB</td>\n  <td>14 GB</td>\n  <td> Intel </td>\n  <td>\n          \n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md\">macos-15-intel</a></code>、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-26-Readme.md\">macos-26-intel</a></code></td>\n</tr>\n<tr>\n  <td>macOS</td>\n  <td>3 （M1）</td>\n  <td>7 GB</td>\n  <td>14 GB</td>\n  <td> arm64 </td>\n  <td>\n          \n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-26-arm64-Readme.md\">macos-latest</a></code>、、<code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md\">macos-14</a></code><code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md\">macos-15</a></code>、<code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-26-arm64-Readme.md\">macos-26</a></code>、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/xcode-27-arm64-Readme.md\">xcode-27</a></code> （公共预览） </td>\n</tr>\n```\n\n  </tbody>\n\n</table>\n\n### 标准 GitHub 托管运行器适用于专用存储库\n\n对于  专用存储库，使用下表中显示的工作流标签的作业将在具有关联规范的虚拟机上运行。 这些运行器会使用你的 GitHub 帐户中的免费分钟数，之后按每分钟费率收费。 请参阅“[Actions 运行程序定价](/zh/billing/reference/actions-runner-pricing)”。\n\n<table style=\"width:100%\">\n  <thead>\n    <tr>\n      <th scope=\"col\">\n<b>虚拟机</b></th>\n      <th scope=\"col\">\n<b>处理器 (CPU)</b></th>\n      <th scope=\"col\">\n<b>内存 (RAM)</b></th>\n      <th scope=\"col\">\n<b>存储 (SSD)</b></th>\n      <th scope=\"col\">\n<b>建筑</b></th>\n      <th scope=\"col\">\n<b>工作流标签</b></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n          <td>Linux</td>\n          <td>1</td>\n          <td>5 GB</td>\n          <td>14 GB</td>\n          <td> x64 </td>\n          <td>\n            <code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu-slim/ubuntu-slim-Readme.md\">ubuntu-slim</a></code>\n          </td>\n        </tr>\n    <tr>\n      <td>Linux</td>\n      <td>2</td>\n      <td>8 GB</td>\n      <td>14 GB</td>\n      <td> X64 </td>\n      <td>\n\n```\n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md\">ubuntu-latest</a></code>、、<code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md\">ubuntu-24.04</a></code><code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2204-Readme.md\">ubuntu-22.04</a></code>、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2604-Readme.md\">ubuntu-26.04</a></code> （公共预览） </td>\n</tr>\n<tr>\n  <td>Windows</td>\n  <td>2</td>\n  <td>8 GB</td>\n  <td>14 GB</td>\n  <td> X64 </td>\n  <td>\n          \n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md\">windows-latest</a></code>、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md\">windows-2025</a></code>、、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md\">windows-2022</a></code></td>\n</tr>\n<tr>\n  <td>Linux</td>\n  <td>2</td>\n  <td>8 GB</td>\n  <td>14 GB</td>\n  <td> arm64 </td>\n  <td>\n          \n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Arm64-Readme.md\">ubuntu-24.04-arm</a></code>、、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2204-Arm64-Readme.md\">ubuntu-22.04-arm</a></code><code><a href=\"https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2604-Arm64-Readme.md\">ubuntu-26.04-arm</a></code> （公共预览） </td>\n</tr>\n<tr>\n  <td>Windows</td>\n  <td>2</td>\n  <td>8 GB</td>\n  <td>14 GB</td>\n  <td> arm64 </td>\n  <td>\n          \n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/windows/Windows11-Arm64-Readme.md\">windows-11-arm</a></code>、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/windows/Windows11-Arm64-VS2026-Readme.md\">windows-11-vs2026-arm</a></code></td>\n</tr>\n<tr>\n  <td>macOS</td>\n  <td>4</td>\n  <td>14 GB</td>\n  <td>14 GB</td>\n  <td> Intel </td>\n  <td>\n          \n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md\">macos-15-intel</a></code>、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-26-Readme.md\">macos-26-intel</a></code></td>\n</tr>\n<tr>\n  <td>macOS</td>\n  <td>3 （M1）</td>\n  <td>7 GB</td>\n  <td>14 GB</td>\n  <td> arm64 </td>\n  <td>\n          \n    <code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-26-arm64-Readme.md\">macos-latest</a></code>、、<code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md\">macos-14</a></code><code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md\">macos-15</a></code>、<code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/macos-26-arm64-Readme.md\">macos-26</a></code>、 <code><a href=\"https://github.com/actions/runner-images/blob/main/images/macos/xcode-27-arm64-Readme.md\">xcode-27</a></code> （公共预览） </td>\n</tr>\n```\n\n  </tbody>\n</table>\n\n除了标准的 GitHub 托管运行器外，GitHub 还为使用 GitHub Team 和 GitHub Enterprise Cloud 方案的客户提供一系列具有高级特性的托管虚拟机，例如更多内核和更大磁盘空间、配备 GPU 的机器以及基于 ARM 的机器。 有关详细信息，请参阅“[大型运行程序](/zh/actions/concepts/runners/larger-runners)”。\n\n> \\[!NOTE]\n> `-latest`运行器映像是GitHub提供的最新稳定映像，但可能并非操作系统供应商提供的该操作系统的最新版本。\n\n> \\[!WARNING]\n> Beta 版映像和弃用映像均“按原样”、“包含所有缺陷”且“按现有可用状态”提供，不在服务级别协议和保修范围内。 客户支持可能不会涵盖 Beta 版映像。\n\n#### 示例：指定操作系统\n\n```yaml\nruns-on: ubuntu-latest\n```\n\n有关详细信息，请参阅“[GitHub 托管的运行程序](/zh/actions/concepts/runners/github-hosted-runners)”。\n\n### 选择自托管运行器\n\n要为作业指定自托管运行器，请在工作流文件中使用自托管运行器标签配置 `runs-on`。\n\n自托管运行器可能具有 `self-hosted` 标签。 设置自托管运行器时，默认情况下，我们将包含标签 `self-hosted`。 可以传递 `--no-default-labels` 标志来阻止自托管标签的应用。 标签可用于为运行器创建目标选项（例如，操作系统或体系结构），建议提供以 `self-hosted` 开头的标签数组（必须首先列出），然后根据需要包含其他标签。 在指定标签集之后，作业将在拥有你所指定所有标签的运行器上排队。\n\n> \\[!NOTE] Actions Runner Controller 不支持 `self-hosted` 标签。\n\n#### 示例：使用标签进行运行器选择\n\n```yaml\nruns-on: [self-hosted, linux]\n```\n\n有关详细信息，请参阅 [自托管运行程序](/zh/actions/concepts/runners/self-hosted-runners) 和 [在工作流中使用自托管运行程序](/zh/actions/how-tos/manage-runners/self-hosted-runners/use-in-a-workflow)。\n\n### 在组中选择运行器\n\n可以使用 `runs-on` 定位运行器组，以便作业将在属于该组的任何运行器上执行。 若要进行更精细的控制，还可以将运行器组与标签组合在一起。\n\n运行器组的成员只能是[大型运行器](/zh/actions/concepts/runners/larger-runners)或[自托管运行器](/zh/actions/how-tos/manage-runners/self-hosted-runners)。\n\n#### 示例：使用群组来控制作业的运行位置\n\n在此示例中，运行器已添加到名为 `build-runners` 的组。\n`runs-on` 键将作业发送到 `build-runners` 组中的任何可用运行器：\n\n```yaml\nname: learn-github-actions\non: [push]\njobs:\n  check-bats-version:\n    runs-on: \n      group: build-runners\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-node@v7\n        with:\n          node-version: '14'\n      - run: npm install -g bats\n      - run: bats -v\n```\n\n#### 示例：将组和标签组合\n\n组合组和标签时，运行器必须满足这两项要求才能运行作业。\n\n在此示例中，`runs-on` 键结合了 `group` 和 `labels`，从而将该作业路由到组内任何具有匹配标签的可用运行器：\n\n```yaml\nname: learn-github-actions\non: [push]\njobs:\n  check-bats-version:\n    runs-on:\n      group: ubuntu-runners\n      labels: ubuntu-24.04-16core\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-node@v7\n        with:\n          node-version: '14'\n      - run: npm install -g bats\n      - run: bats -v\n```\n\n## `jobs.<job_id>.snapshot`\n\n可用于 `jobs.<job_id>.snapshot` 生成自定义映像。\n\n使用字符串语法或映射语法将快照关键字添加到作业，如 [生成自定义图像](/zh/actions/how-tos/manage-runners/larger-runners/use-custom-images#generating-a-custom-image)中所示。\n\n包含快照关键字的每个作业都会创建单独的映像。 若要仅生成一个映像或映像版本，请在单个作业中包含所有工作流步骤。 包含快照关键字的作业的每个成功运行都会创建该映像的新版本。\n\n有关详细信息，请参阅“[使用自定义映像](/zh/actions/how-tos/manage-runners/larger-runners/use-custom-images)”。\n\n## `jobs.<job_id>.environment`\n\n使用 `jobs.<job_id>.environment` 定义作业引用的环境。\n\n可以将环境仅作为环境 `name` 提供，也可以作为具有 `name` 和 `url` 的环境对象提供。 URL 将映射到部署 API 中的 `environment_url`。 有关部署 API 的详细信息，请参阅“[存储库的 REST API 终结点](/zh/rest/repos#deployments)”。\n\n> \\[!NOTE]\n> 在将引用环境的作业发送到运行器之前，必须通过所有部署保护规则。 有关详细信息，请参阅“[管理部署环境](/zh/actions/how-tos/deploy/configure-and-manage-deployments/manage-environments)”。\n\n### 使用单一环境名称的示例\n\n```yaml\nenvironment: staging_environment\n```\n\n### 使用环境名称和 URL 的示例\n\n```yaml\nenvironment:\n  name: production_environment\n  url: https://github.com\n```\n\n`url` 的值可以是一个表达式。 允许的表达式上下文：[`github`](/zh/actions/reference/workflows-and-actions/contexts#github-context)、[`inputs`](/zh/actions/reference/workflows-and-actions/contexts#inputs-context)、[`vars`](/zh/actions/reference/workflows-and-actions/contexts#vars-context)、[`needs`](/zh/actions/reference/workflows-and-actions/contexts#needs-context)、[`strategy`](/zh/actions/reference/workflows-and-actions/contexts#strategy-context)、[`matrix`](/zh/actions/reference/workflows-and-actions/contexts#matrix-context)、[`job`](/zh/actions/reference/workflows-and-actions/contexts#job-context)、[`runner`](/zh/actions/reference/workflows-and-actions/contexts#runner-context)、[`env`](/zh/actions/reference/workflows-and-actions/contexts#env-context) 和 [`steps`](/zh/actions/reference/workflows-and-actions/contexts#steps-context)。 有关表达式的详细信息，请参阅“[对工作流和操作中的表达式求值](/zh/actions/reference/workflows-and-actions/expressions)”。\n\n### 将输出用作 URL 的示例\n\n```yaml\nenvironment:\n  name: production_environment\n  url: ${{ steps.step_id.outputs.url_output }}\n```\n\n`name` 的值可以是一个表达式。 允许的表达式上下文：[`github`](/zh/actions/reference/workflows-and-actions/contexts#github-context)、[`inputs`](/zh/actions/reference/workflows-and-actions/contexts#inputs-context)、[`vars`](/zh/actions/reference/workflows-and-actions/contexts#vars-context)、[`needs`](/zh/actions/reference/workflows-and-actions/contexts#needs-context)、[`strategy`](/zh/actions/reference/workflows-and-actions/contexts#strategy-context) 和 [`matrix`](/zh/actions/reference/workflows-and-actions/contexts#matrix-context)。 有关表达式的详细信息，请参阅“[对工作流和操作中的表达式求值](/zh/actions/reference/workflows-and-actions/expressions)”。\n\n### 示例：使用表达式作为环境名称\n\n```yaml\nenvironment:\n  name: ${{ github.ref_name }}\n```\n\n### 示例：在不创建部署的情况下使用环境\n\n`false`设置为`deployment`在不创建部署对象的情况下使用环境的机密和变量。\n\n```yaml\nenvironment:\n  name: testing\n  deployment: false\n```\n\n设置 `deployment: false` 与自定义部署保护规则不兼容。\n有关详细信息，请参阅“[使用 GitHub Actions 进行部署](/zh/actions/how-tos/deploy/configure-and-manage-deployments/control-deployments#using-environments-without-deployments)”。\n\n## `jobs.<job_id>.concurrency`\n\n可以使用 `jobs.<job_id>.concurrency` 确保只有使用相同并发组的单一作业或工作流才会同时运行。 并发组可以是任何字符串或表达式。 允许的表达式上下文：[`github`](/zh/actions/reference/workflows-and-actions/contexts#github-context)、[`inputs`](/zh/actions/reference/workflows-and-actions/contexts#inputs-context)、[`vars`](/zh/actions/reference/workflows-and-actions/contexts#vars-context)、[`needs`](/zh/actions/reference/workflows-and-actions/contexts#needs-context)、[`strategy`](/zh/actions/reference/workflows-and-actions/contexts#strategy-context) 和 [`matrix`](/zh/actions/reference/workflows-and-actions/contexts#matrix-context)。 有关表达式的详细信息，请参阅“[对工作流和操作中的表达式求值](/zh/actions/reference/workflows-and-actions/expressions)”。\n\n还可以在工作流级别指定 `concurrency`。 有关详细信息，请参阅 [`concurrency`](/zh/actions/reference/workflows-and-actions/workflow-syntax#concurrency)。\n\n这意味着，并发组中最多可以有一个正在运行的作业或工作流。 当并发作业或工作流排队时，如果存储库中使用同一并发组的其他作业或工作流正在运行，则排队的作业或工作流将为 `pending`。 默认情况下，将取消同一并发组中的任何现有 `pending` 作业或工作流，新的排队作业或工作流将取代其位置。\n\n若还要取消同一并发组中任何当前正在运行的作业或工作流，请指定 `cancel-in-progress: true`。 若要有条件地取消同一并发组中当前正在运行的作业或工作流，可以将 `cancel-in-progress` 指定为具有任何允许的表达式上下文的表达式。\n\n若要允许多个作业或工作流运行在同一 `pending` 并发组中等待，请使用可选 `queue` 属性。 该 `queue` 属性接受以下值：\n\n* `single` （默认值）：最多可以有一个作业或工作流运行在 `pending` 并发组中。 当新任务或工作流运行排队时，同一组中的任何现有任务或工作流运行将被取消并替换。\n* `max`：最多可以有 100 个作业或工作流运行在 `pending` 并发组中。 队列已满时，任何新增作业或工作流运行将被取消。\n\n组合 `queue: max` 和 `cancel-in-progress: true` 不允许，并将导致工作流验证错误。\n\n> \\[!NOTE]\n>\n> * 并发组名称不区分大小写。 例如，`prod` 和 `Prod` 将被视为同一个并发组。\n> * 作业或工作流在同一并发组中运行时，按照每个作业开始等待该并发组的时间，以先进先出（FIFO）的顺序处理，而不是按照每个工作流的分派时间。 由于作业或运行的实际开始时间可能有所不同，因此不能保证排序。\n\n### 示例：使用并发和默认行为\n\n默认情况下，GitHub Actions 允许多个作业或工作流同时运行。 使用`concurrency` 关键字可以控制工作流运行的并发性。\n\n例如，可以在定义触发器条件以限制特定分支的整个工作流运行的并发之后立即使用 `concurrency` 关键字：\n\n```yaml\non:\n  push:\n    branches:\n      - main\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n```\n\n还可以通过在作业级别使用 `concurrency` 关键字来限制工作流中作业的并发性：\n\n```yaml\non:\n  push:\n    branches:\n      - main\n\njobs:\n  job-1:\n    runs-on: ubuntu-latest\n    concurrency:\n      group: example-group\n      cancel-in-progress: true\n```\n\n### 示例：并发组\n\n并发组提供了一种方法，用于管理和限制共享相同并发密钥的工作流运行或作业的执行。\n\n该 `concurrency` 密钥用于将工作流或作业组合到并发组中。 定义 `concurrency` 密钥时， GitHub Actions 请确保在任何给定时间只运行具有该密钥的一个工作流或作业。 如果新的工作流运行或作业以相同的 `concurrency` 密钥启动， GitHub Actions 将取消已使用该密钥运行的任何工作流或作业。 键 `concurrency` 可以是硬编码字符串，也可以是包含上下文变量的动态表达式。\n\n可以在工作流中定义并发条件，以便工作流或作业是并发组的一部分。\n\n这意味着，当工作流运行或作业启动时，GitHub 将取消同一并发组中正在进行的任何工作流运行或作业。 在想要防止对特定工作流或作业（例如用于部署到过渡环境的工作流或作业）进行并行运行的情况下，这非常有用，以防止可能导致冲突或消耗比必要资源更多的操作。\n\n在此示例中，`job-1` 是名为 `staging_environment` 的并发组的一部分。 如果新运行的 `job-1` 被触发，那么在并发组 `staging_environment` 中已在进行的任何同一作业的运行都将被取消。\n\n```yaml\njobs:\n  job-1:\n    runs-on: ubuntu-latest\n    concurrency:\n      group: staging_environment\n      cancel-in-progress: true\n```\n\n或者，在工作流中使用动态表达式 `concurrency: ci-${{ github.ref }}` 意味着工作流或作业将成为并发组 `ci-` 的一部分，后跟触发工作流的分支或标记的引用。 在此示例中，如果在上一次运行仍在进行中时将新的提交推送到主分支，则会取消上一次运行，并且新运行将启动：\n\n```yaml\non:\n  push:\n    branches:\n      - main\n\nconcurrency:\n  group: ci-${{ github.ref }}\n  cancel-in-progress: true\n```\n\n### 示例：对多个待处理任务进行排队\n\n默认情况下，每次只能`pending`一个作业或工作流在并发组中运行。 若要允许多个运行排入队列而不是取消，请设置 `queue: max`。 在 `queue: max` 的情况下，最多可以有 100 个作业或工作流在并发组中等待运行；队列满后，将取消任何其他作业。\n\n例如，以下工作流将部署到 `production` 环境，根据每个运行开始等待并发组的时间逐个处理它们：\n\n```yaml\non:\n  push:\n    branches:\n      - main\n\nconcurrency:\n  group: production-deploy\n  queue: max\n```\n\n请注意， `queue: max` 不能与 `cancel-in-progress: true`这两个选项结合使用，因为两个选项描述了处理正在进行的运行时发生的冲突行为。\n\n### 示例：使用并发取消任何当前作业或运行\n\n若要使用并发来取消任何正在进行的任务或运行，可以使用密钥`concurrency`，并将选项`cancel-in-progress`设置为`true`：\n\n```yaml\nconcurrency:\n  group: ${{ github.ref }}\n  cancel-in-progress: true\n```\n\n请注意，在此示例中，如果不定义特定的并发组，GitHub Actions 将取消任何正在进行的\\_作业或工作流\\_的运行。\n\n### 示例：使用回退值\n\n如果使用仅为特定事件定义的属性生成组名称，则可以使用回退值。 例如，`github.head_ref` 仅对 `pull_request` 事件定义。 如果工作流响应除了 `pull_request` 事件之外的其他事件，你将需要提供回退以避免语法错误。 以下并发组仅取消针对 `pull_request` 事件正在进行的作业或运行；如果 `github.head_ref` 未定义，并发组将回退到运行 ID，该 ID 保证是唯一的，并且是为该运行定义的。\n\n```yaml\nconcurrency:\n  group: ${{ github.head_ref || github.run_id }}\n  cancel-in-progress: true\n```\n\n### 示例：仅取消当前工作流中正在进行的作业或运行\n\n如果在同一个存储库中有多个工作流，则并发组名称在工作流中必须是唯一的，以避免从其他工作流取消正在进行的作业或运行。 否则，任何先前进行中或挂起的任务都将被取消，无论工作流如何。\n\n若要仅取消同一工作流中正在进行的运行，可以使用 `github.workflow` 属性来构建并发组。\n\n```yaml\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n```\n\n### 示例：仅取消特定分支上正在进行的作业\n\n如果你想取消某些分支上正在进行的作业，但不想取消其他分支上正在进行的作业，则可以将条件表达式与 `cancel-in-progress` 一起使用。 例如，如果你想取消开发分支上正在进行的作业，但不想取消发布分支上正在进行的作业，则可以执行此操作。\n\n若要仅在未在发布分支上运行时取消同一工作流正在进行的运行，则可以设置表达式的 `cancel-in-progress`，如下所示：\n\n```yaml\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: ${{ !contains(github.ref, 'release/')}}\n```\n\n在此示例中，多次推送到 `release/1.2.3` 分支不会取消正在进行的运行。 推送到另一个分支（例如 `main`）将取消正在进行的运行。\n\n## `jobs.<job_id>.outputs`\n\n可以使用 `jobs.<job_id>.outputs` 为作业创建输出`map`。 作业输出可用于所有依赖此作业的下游作业。 有关定义作业依赖项的详细信息，请参阅 [`jobs.<job_id>.needs`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds)。\n\n每个作业的输出最多可以为 1 MB。 工作流运行中所有输出的总和最大为 50 MB。 大小是基于 UTF-16 编码的近似值。\n\n包含表达式的作业输出会在每个作业结束时由运行器进行评估。 包含机密信息的输出会在运行器上进行脱敏处理，不会发送到 GitHub Actions。\n\n如果由于输出可能包含机密而跳过，则会看到以下警告消息：“跳过输出 `{output.Key}`，因为它可能包含机密。” 有关如何处理机密的详细信息，请参阅[示例：在作业或工作流之间屏蔽和传递机密](/zh/actions/reference/workflows-and-actions/workflow-commands#example-masking-and-passing-a-secret-between-jobs-or-workflows)。\n\n要在依赖的作业中使用作业输出, 可以使用 `needs` 上下文。 有关详细信息，请参阅“[上下文参考](/zh/actions/reference/workflows-and-actions/contexts#needs-context)”。\n\n### 示例：定义作业的输出\n\n```yaml\njobs:\n  job1:\n    runs-on: ubuntu-latest\n    # Map a step output to a job output\n    outputs:\n      output1: ${{ steps.step1.outputs.test }}\n      output2: ${{ steps.step2.outputs.test }}\n    steps:\n      - id: step1\n        run: echo \"test=hello\" >> \"$GITHUB_OUTPUT\"\n      - id: step2\n        run: echo \"test=world\" >> \"$GITHUB_OUTPUT\"\n  job2:\n    runs-on: ubuntu-latest\n    needs: job1\n    steps:\n      - env:\n          OUTPUT1: ${{needs.job1.outputs.output1}}\n          OUTPUT2: ${{needs.job1.outputs.output2}}\n        run: echo \"$OUTPUT1 $OUTPUT2\"\n```\n\n### 在矩阵作业中使用作业输出\n\n矩阵可用于生成不同名称的多个输出。 当使用矩阵时，作业输出将由矩阵内的所有作业组合而成。\n\n```yaml\njobs:\n  job1:\n    runs-on: ubuntu-latest\n    outputs:\n      output_1: ${{ steps.gen_output.outputs.output_1 }}\n      output_2: ${{ steps.gen_output.outputs.output_2 }}\n      output_3: ${{ steps.gen_output.outputs.output_3 }}\n    strategy:\n      matrix:\n        version: [1, 2, 3]\n    steps:\n      - name: Generate output\n        id: gen_output\n        run: |\n          version=\"${{ matrix.version }}\"\n          echo \"output_${version}=${version}\" >> \"$GITHUB_OUTPUT\"\n  job2:\n    runs-on: ubuntu-latest\n    needs: [job1]\n    steps:\n      # Will show\n      # {\n      #   \"output_1\": \"1\",\n      #   \"output_2\": \"2\",\n      #   \"output_3\": \"3\"\n      # }\n      - run: echo '${{ toJSON(needs.job1.outputs) }}'\n```\n\n> \\[!WARNING]\n> 操作不保证矩阵作业运行的顺序。 确保输出名称是唯一的，否则运行的最后一个矩阵作业将替代输出值。\n\n## `jobs.<job_id>.env`\n\n可用于作业中所有步骤的变量的 `map`。 可以设置用于整个工作流或单个步骤的变量。 有关详细信息，请参阅 [`env`](#env) 和 [`jobs.<job_id>.steps[*].env`](#jobsjob_idstepsenv)。\n\n当多个环境变量使用相同的名称定义时，GitHub 会使用最特定的变量。 例如，步骤中定义的环境变量在步骤执行时将覆盖名称相同的作业和工作流环境变量。 为作业定义的环境变量在作业执行时将覆盖名称相同的工作流变量。\n\n### `jobs.<job_id>.env` 的示例\n\n```yaml\njobs:\n  job1:\n    env:\n      FIRST_NAME: Mona\n```\n\n## `jobs.<job_id>.defaults`\n\n使用 `jobs.<job_id>.defaults` 创建将应用于作业中所有步骤的默认设置的 `map`。 您也可以设置整个工作流程的默认设置。 有关详细信息，请参阅 [`defaults`](/zh/actions/reference/workflows-and-actions/workflow-syntax#defaults)。\n\n使用相同名称定义了多个默认设置时，GitHub 会使用最具体的默认设置。 例如，在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。\n\n## `jobs.<job_id>.defaults.run`\n\n使用 `jobs.<job_id>.defaults.run` 为作业中的所有 `shell` 步骤提供默认的 `working-directory` 和 `run`。\n\n你可以为作业中所有 `working-directory` 步骤提供默认的 `run` 和 [](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsrun) 选项。 你也可以为整个工作流的 `run` 设置默认设置。 有关详细信息，请参阅 [`defaults.run`](/zh/actions/reference/workflows-and-actions/workflow-syntax#defaultsrun)。\n\n可以在 `jobs.<job_id>.defaults.run` 和 `jobs.<job_id>.steps[*].run` 级别覆盖这些值。\n\n使用相同名称定义了多个默认设置时，GitHub 会使用最具体的默认设置。 例如，在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。\n\n## `jobs.<job_id>.defaults.run.shell`\n\n使用 `shell` 为步骤定义 `shell`。 此关键字可以引用多个上下文。 有关详细信息，请参阅“[上下文](/zh/actions/reference/workflows-and-actions/contexts#context-availability)”。\n\n| 支持的平台       | `shell` 参数   | 说明                                                                                                                                   | 内部运行命令                                          |\n| ----------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------- |\n| Linux/macOS | unspecified  | 非 Windows 平台上的默认 shell。 请注意，这与显式指定 `bash` 时运行的命令不同。 如果在路径中找不到 `bash`，则将其视为 `sh`。                                                     | `bash -e {0}`                                   |\n| All         | `bash`       | 非 Windows 平台上回退到 `sh` 的默认 shell。 指定 Windows 上的 bash shell 时，将使用 Git for Windows 随附的 bash shel。                                       | `bash --noprofile --norc -eo pipefail {0}`      |\n| 全部          | `pwsh`       | PowerShell Core。 GitHub 将扩展名 `.ps1` 追加到你的脚本名称。                                                                                       | `pwsh -command \". '{0}'\"`                       |\n| All         | `python`     | 执行 python 命令。                                                                                                                        | `python {0}`                                    |\n| Linux/macOS | `sh`         | 未提供 shell 且在路径中找不到 `bash` 时的非 Windows 平台的后退行为。                                                                                       | `sh -e {0}`                                     |\n| Windows     | `cmd`        | GitHub 将扩展名 `.cmd` 追加到你的脚本名称并替换 `{0}`。                                                                                               | `%ComSpec% /D /E:ON /V:OFF /S /C \"CALL \"{0}\"\"`。 |\n| Windows     | `pwsh`       | 这是 Windows 上使用的默认 shell。 PowerShell Core。 GitHub 将扩展名 `.ps1` 追加到你的脚本名称。 如果自承载 Windows 运行器未安装 PowerShell Core，则改用 PowerShell Desktop。 | `pwsh -command \". '{0}'\"`。                      |\n| Windows     | `powershell` | PowerShell 桌面。 GitHub 将扩展名 `.ps1` 追加到你的脚本名称。                                                                                         | `powershell -command \". '{0}'\"`。                |\n\n使用相同名称定义了多个默认设置时，GitHub 会使用最具体的默认设置。 例如，在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。\n\n## `jobs.<job_id>.defaults.run.working-directory`\n\n使用 `working-directory` 为步骤定义用于 `shell` 的工作目录。 此关键字可以引用多个上下文。 有关详细信息，请参阅“[上下文](/zh/actions/reference/workflows-and-actions/contexts#context-availability)”。\n\n> \\[!TIP]\n> 在运行 shell 之前，请确保你分配的 `working-directory` 在运行器上存在。\n> 使用相同名称定义了多个默认设置时，GitHub 会使用最具体的默认设置。 例如，在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。\n\n### 示例：为作业设置默认 `run` 步骤选项\n\n```yaml\njobs:\n  job1:\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        shell: bash\n        working-directory: ./scripts\n```\n\n## `jobs.<job_id>.steps`\n\n作业包含一系列任务，称为 `steps`。 步骤可以运行命令、运行设置任务，或者运行您的仓库、公共仓库中的操作或 Docker 注册表中发布的操作。 并非所有步骤都会执行操作，但所有操作都会作为步骤执行。 每个步骤在运行器环境中以其自己的进程运行，且可以访问工作区和文件系统。 因为步骤以自己的进程运行，所以步骤之间不会保留环境变量的更改。\nGitHub 提供用于设置和完成作业的内置步骤。\n\nGitHub 仅显示前 1,000 个检查，但是，只要处于工作流使用限制内，就可以运行无限数量的步骤。 有关详细信息，请参阅 [](/zh/actions/concepts/billing-and-usage) 托管运行器的 GitHub 和自托管运行器使用限制的 [Actions 限制](/zh/actions/reference/limits)。\n\n### `jobs.<job_id>.steps` 的示例\n\n```yaml\nname: Greeting from Mona\n\non: push\n\njobs:\n  my-job:\n    name: My Job\n    runs-on: ubuntu-latest\n    steps:\n      - name: Print a greeting\n        env:\n          MY_VAR: Hi there! My name is\n          FIRST_NAME: Mona\n          MIDDLE_NAME: The\n          LAST_NAME: Octocat\n        run: |\n          echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.\n```\n\n## `jobs.<job_id>.steps[*].id`\n\n步骤的唯一标识符。 可以使用 `id` 在上下文中引用该步骤。 有关详细信息，请参阅“[上下文参考](/zh/actions/reference/workflows-and-actions/contexts)”。\n\n## `jobs.<job_id>.steps[*].if`\n\n可以使用 `if` 条件来阻止步骤运行，除非满足条件。 您可以使用任何支持上下文和表达式来创建条件。 有关此键中支持哪些上下文的详细信息，请参阅“[上下文参考](/zh/actions/reference/workflows-and-actions/contexts#context-availability)”。\n\n在 `if` 条件中使用表达式时，可以有选择地忽略 `${{ }}` 表达式语法，因为 GitHub Actions 自动将 `if` 条件作为表达式求值。 但此例外并非适用于所有情况。\n\n必须始终使用 `${{ }}` 表达式语法，或者当表达式以`!`开头时，必须使用 `''`、`\"\"`、`()` 进行转义，因为 `!` 是 YAML 格式的保留表示法。 例如：\n\n```yaml\nif: ${{ ! startsWith(github.ref, 'refs/tags/') }}\n```\n\n有关详细信息，请参阅 [对工作流和操作中的表达式求值](/zh/actions/reference/workflows-and-actions/expressions)。\n\n### 示例：使用上下文\n\n此步骤仅在事件类型为 `pull_request` 且事件操作为 `unassigned` 时运行。\n\n```yaml\nsteps:\n  - name: My first step\n    if: ${{ github.event_name == 'pull_request' && github.event.action == 'unassigned' }}\n    run: echo This event is a pull request that had an assignee removed.\n```\n\n### 示例：使用状态检查功能\n\n`my backup step` 仅在作业的上一步失败时运行。 有关详细信息，请参阅“[对工作流和操作中的表达式求值](/zh/actions/reference/workflows-and-actions/expressions#status-check-functions)”。\n\n```yaml\nsteps:\n  - name: My first step\n    uses: octo-org/action-name@main\n  - name: My backup step\n    if: ${{ failure() }}\n    uses: actions/heroku@1.0.0\n```\n\n### 示例：使用机密\n\n无法直接在 `if:` 条件中引用机密。 而应考虑将机密设置为作业级环境变量，然后引用环境变量以有条件地运行作业中的步骤。\n\n如果未设置机密，则引用机密的表达式的返回值（如 `${{ secrets.SuperSecret }}` 示例中）将为空字符串。\n\n```yaml\nname: Run a step if a secret has been set\non: push\njobs:\n  my-jobname:\n    runs-on: ubuntu-latest\n    env:\n      super_secret: ${{ secrets.SuperSecret }}\n    steps:\n      - if: ${{ env.super_secret != '' }}\n        run: echo 'This step will only run if the secret has a value set.'\n      - if: ${{ env.super_secret == '' }}\n        run: echo 'This step will only run if the secret does not have a value set.'\n```\n\n有关详细信息，请参阅 [上下文参考](/zh/actions/reference/workflows-and-actions/contexts#context-availability) 和 [在 GitHub Actions 中使用机密](/zh/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)。\n\n## `jobs.<job_id>.steps[*].name`\n\n在 GitHub 上显示的步骤名称。\n\n## `jobs.<job_id>.steps[*].uses`\n\n选择要作为作业中步骤的一部分运行的操作。 操作是一种可重复使用的代码单位。 可以使用在与工作流、公共存储库或[已发布的 Docker 容器映像](https://hub.docker.com/)相同的存储库中定义的操作。\n\n强烈建议您通过指定 Git ref、SHA 或 Docker 标签来包含您正在使用的操作版本。 如果不指定版本，在操作所有者发布更新时可能会中断您的工作流程或造成非预期的行为。\n\n* 使用已发行操作版本的 SHA 对于稳定性和安全性是最安全的。\n* 如果操作发布主版本标记，则应收到关键修补程序和安全修补程序，同时仍保持兼容性。 请注意，此行为由操作创建者决定。\n* 使用操作的默认分支可能很方便，但如果有人新发布具有突破性更改的主要版本，您的工作流程可能会中断。\n\n某些操作需要您使用 [`with`](#jobsjob_idstepswith) 关键字设置输入。 请查阅操作的自述文件，确定所需的输入。\n\n操作为 JavaScript 文件或 Docker 容器。 如果您使用的操作是 Docker 容器，则必须在 Linux 环境中运行作业。 有关详细信息，请参阅 [`runs-on`](#jobsjob_idruns-on)。\n\n### 示例：使用版本化操作\n\n```yaml\nsteps:\n  # Reference a specific commit\n  - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3\n  # Reference the major version of a release\n  - uses: actions/checkout@v6\n  # Reference a specific version\n  - uses: actions/checkout@v6.2.0\n  # Reference a branch\n  - uses: actions/checkout@main\n```\n\n### 示例：使用公共操作\n\n`{owner}/{repo}@{ref}`\n\n可以在公共 GitHub 存储库中指定分支、ref 或 SHA。\n\n```yaml\njobs:\n  my_first_job:\n    steps:\n      - name: My first step\n        # Uses the default branch of a public repository\n        uses: actions/heroku@main\n      - name: My second step\n        # Uses a specific version tag of a public repository\n        uses: actions/aws@v2.0.1\n```\n\n### 示例：在子目录中使用公共操作\n\n`{owner}/{repo}/{path}@{ref}`\n\n特定分支、ref 或 SHA 的公共 GitHub 存储库中的子目录。\n\n```yaml\njobs:\n  my_first_job:\n    steps:\n      - name: My first step\n        uses: actions/aws/ec2@main\n```\n\n### 示例：在正在运行的提交时使用与工作流相同的存储库中的操作（建议）\n\n`$/path/to/action`\n\n前缀 `$/` 是自存储库引用。 它引用与当前正在运行的工作流或操作存储在同一存储库中的操作，并在正在运行的提交时解析为该存储库（与正在运行的工作流或操作相同的 SHA）。 无需先签出存储库，因此建议在其自己的存储库中引用操作。\n\n语法 `$/` 在 . 中 GitHub Enterprise Server不可用。\n\n引用 `$/` 不得包含 `@{ref}` 后缀。 ref 始终是正在运行的工作流或操作正在使用的提交，因此引用（如 `$/actions/my-action@v1` 无效）。\n\n`$/` 始终针对其中显示的文件的存储库解析，而不是调用它的存储库。 例如，如果一个存储库中的可重用工作流由另一个存储库中的工作流调用， `$/` 则调用的工作流中的引用将解析为所调用工作流的存储库，而不是调用工作流的存储库。\n`$/`这使得操作组合可靠，其中相对`./`路径会针对调用方工作区中签出的任何内容进行解析。 有关在复合操作的步骤中使用 `$/` ，请参阅 [元数据语法参考](/zh/actions/reference/workflows-and-actions/metadata-syntax#runsstepsuses)。\n\n下表比较了引用操作的方法。\n\n| Syntax                 | 解析为                                                | 建议用于       |\n| ---------------------- | -------------------------------------------------- | ---------- |\n| `$/path/to/action`     | 在正在运行的提交时，与正在运行的工作流或操作相同的存储库                       | 同一存储库中的操作  |\n| `{owner}/{repo}@{ref}` | 指定 ref 处的指定存储库                                     | 另一个存储库中的操作 |\n| `./path/to/action`     | 运行程序签出工作区中相对于默认工作目录的路径 （`${{ github.workspace }}`） | 仅边缘事例      |\n\n```yaml\non: [push]\n\njobs:\n  my_first_job:\n    runs-on: ubuntu-latest\n    steps:\n      # References an action in the same repository at the running commit\n      - uses: $/.github/actions/hello-world-action\n```\n\n### 示例：使用工作流程所在仓库中操作\n\n`./path/to/dir`\n\n包含工作流程的仓库中操作的目录路径。 在使用操作之前，必须签出存储库，并且 `./` 路径针对运行程序的工作区而不是正在运行的工作流的存储库解析。 在大多数情况下，请改用上面所示的 `$/` 语法。\n\n示例仓库文件结构：\n\n```shell\n|-- hello-world (repository)\n|   |__ .github\n|       └── workflows\n|           └── my-first-workflow.yml\n|       └── actions\n|           |__ hello-world-action\n|               └── action.yml\n```\n\n路径为相对于 (`./`) 默认工作目录（`github.workspace`、`$GITHUB_WORKSPACE`）的路径。 如果操作将存储库签出到不同于该工作流的位置，则必须更新用于本地操作的相对路径。\n\n示例工作流程文件：\n\n```yaml\njobs:\n  my_first_job:\n    runs-on: ubuntu-latest\n    steps:\n      # This step checks out a copy of your repository.\n      - name: My first step - check out repository\n        uses: actions/checkout@v6\n      # This step references the directory that contains the action.\n      - name: Use local hello-world-action\n        uses: ./.github/actions/hello-world-action\n```\n\n### 示例：使用 Docker Hub 操作\n\n`docker://{image}:{tag}`\n\n发布于 [Docker 中心](https://hub.docker.com/)的 Docker 映像。\n\n```yaml\njobs:\n  my_first_job:\n    steps:\n      - name: My first step\n        uses: docker://alpine:3.8\n```\n\n### 示例：使用 GitHub PackagesContainer registry\n\n`docker://{host}/{image}:{tag}`\n\n公共 Docker 映像在 GitHub PackagesContainer registry 中。\n\n```yaml\njobs:\n  my_first_job:\n    steps:\n      - name: My first step\n        uses: docker://ghcr.io/OWNER/IMAGE_NAME\n```\n\n### 示例：使用 Docker 公共注册表操作\n\n`docker://{host}/{image}:{tag}`\n\n公共注册表中的 Docker 映像。 此示例使用 Google Container Registry 于 `gcr.io`。\n\n```yaml\njobs:\n  my_first_job:\n    steps:\n      - name: My first step\n        uses: docker://gcr.io/cloud-builders/gradle\n```\n\n### 示例：在不同于工作流程的私有仓库中使用操作\n\n如果操作位于内部存储库中，或者配置为允许从工作流存储库进行访问的专用存储库中，可以直接引用该操作。 有关详细信息，请参阅 [管理存储库的GitHub Actions设置](/zh/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository) 和 [管理存储库的GitHub Actions设置](/zh/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#allowing-access-to-components-in-a-private-repository)。\n\n如果该操作不在已配置为允许访问的存储库中，则需要检出该存储库并在本地引用该操作。 生成一个personal access token并将该令牌添加为密钥。 以下示例演示了用于引用操作的方法。 有关详细信息，请参阅 [管理个人访问令牌](/zh/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) 和 [在 GitHub Actions 中使用机密](/zh/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)。\n\n将示例中 `PERSONAL_ACCESS_TOKEN` 替换为机密名称。\n\n```yaml\njobs:\n  my_first_job:\n    steps:\n      - name: Check out repository\n        uses: actions/checkout@v6\n        with:\n          repository: octocat/my-private-repo\n          ref: v1.0\n          token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n          path: ./.github/actions/my-private-repo\n      - name: Run my action\n        uses: ./.github/actions/my-private-repo/my-action\n```\n\n或者，使用GitHub App而不是personal access token，以确保工作流在personal access token所有者离开后仍能继续运行。 有关详细信息，请参阅“[在GitHub Actions工作流中使用GitHub应用发出经过身份验证的 API 请求](/zh/apps/creating-github-apps/authenticating-with-a-github-app/making-authenticated-api-requests-with-a-github-app-in-a-github-actions-workflow)”。\n\n## `jobs.<job_id>.steps[*].run`\n\n使用操作系统的 shell 运行不超过 21,000 个字符的命令行程序。 如果不提供 `name`，步骤名称将默认为 `run` 命令中指定的文本。\n\n命令默认使用非登录 shell 运行。 您可以选择不同的 shell，也可以自定义用于运行命令的 shell。 有关详细信息，请参阅 [`jobs.<job_id>.steps[*].shell`](#jobsjob_idstepsshell)。\n\n每个 `run` 关键字代表运行器环境中一个新的进程和 shell。 当您提供多行命令时，每行都在同一个 shell 中运行。 例如：\n\n* 单行命令：\n\n  ```yaml\n  - name: Install Dependencies\n    run: npm install\n  ```\n\n* 多行命令：\n\n  ```yaml\n  - name: Clean install dependencies and build\n    run: |\n      npm ci\n      npm run build\n  ```\n\n## `jobs.<job_id>.steps[*].working-directory`\n\n使用 `working-directory` 关键字，你可以指定运行命令的工作目录位置。\n\n```yaml\n- name: Clean temp directory\n  run: rm -rf *\n  working-directory: ./temp\n```\n\n另外，可以为作业中的所有 `run` 步骤或整个工作流中的所有 `run` 步骤指定默认工作目录。 有关详细信息，请参阅 [`defaults.run.working-directory`](/zh/actions/reference/workflows-and-actions/workflow-syntax#defaultsrunworking-directory) 和 [`jobs.<job_id>.defaults.run.working-directory`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_iddefaultsrunworking-directory)。\n\n还可以使用 `run` 步骤来运行脚本。 有关详细信息，请参阅“[添加脚本到工作流程](/zh/actions/how-tos/write-workflows/choose-what-workflows-do/add-scripts)”。\n\n## `jobs.<job_id>.steps[*].shell`\n\n你可以使用 `shell` 关键字，覆盖运行器操作系统中的默认 Shell 设置，以及作业的默认值。 你可以使用内置的 `shell` 关键字，也可以自定义 shell 选项集。 内部运行的 shell 命令执行一个临时文件，其中包含 `run` 关键字中指定的命令。\n\n| 支持的平台       | `shell` 参数   | 说明                                                                                                                                   | 内部运行命令                                          |\n| ----------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------- |\n| Linux/macOS | unspecified  | 非 Windows 平台上的默认 shell。 请注意，这与显式指定 `bash` 时运行的命令不同。 如果在路径中找不到 `bash`，则将其视为 `sh`。                                                     | `bash -e {0}`                                   |\n| All         | `bash`       | 非 Windows 平台上回退到 `sh` 的默认 shell。 指定 Windows 上的 bash shell 时，将使用 Git for Windows 随附的 bash shel。                                       | `bash --noprofile --norc -eo pipefail {0}`      |\n| 全部          | `pwsh`       | PowerShell Core。 GitHub 将扩展名 `.ps1` 追加到你的脚本名称。                                                                                       | `pwsh -command \". '{0}'\"`                       |\n| All         | `python`     | 执行 python 命令。                                                                                                                        | `python {0}`                                    |\n| Linux/macOS | `sh`         | 未提供 shell 且在路径中找不到 `bash` 时的非 Windows 平台的后退行为。                                                                                       | `sh -e {0}`                                     |\n| Windows     | `cmd`        | GitHub 将扩展名 `.cmd` 追加到你的脚本名称并替换 `{0}`。                                                                                               | `%ComSpec% /D /E:ON /V:OFF /S /C \"CALL \"{0}\"\"`。 |\n| Windows     | `pwsh`       | 这是 Windows 上使用的默认 shell。 PowerShell Core。 GitHub 将扩展名 `.ps1` 追加到你的脚本名称。 如果自承载 Windows 运行器未安装 PowerShell Core，则改用 PowerShell Desktop。 | `pwsh -command \". '{0}'\"`。                      |\n| Windows     | `powershell` | PowerShell 桌面。 GitHub 将扩展名 `.ps1` 追加到你的脚本名称。                                                                                         | `powershell -command \". '{0}'\"`。                |\n\n另外，可以为作业中的所有 `run` 步骤或整个工作流中的所有 `run` 步骤指定默认 Shell。 有关详细信息，请参阅 [`defaults.run.shell`](/zh/actions/reference/workflows-and-actions/workflow-syntax#defaultsrunshell) 和 [`jobs.<job_id>.defaults.run.shell`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_iddefaultsrunshell)。\n\n### 示例：使用 bash 运行命令\n\n```yaml\nsteps:\n  - name: Display the path\n    shell: bash\n    run: echo $PATH\n```\n\n### 示例：使用 Windows `cmd` 运行命令\n\n```yaml\nsteps:\n  - name: Display the path\n    shell: cmd\n    run: echo %PATH%\n```\n\n### 示例：使用 PowerShell Core 运行命令\n\n```yaml\nsteps:\n  - name: Display the path\n    shell: pwsh\n    run: echo ${env:PATH}\n```\n\n### 示例：使用 PowerShell Desktop 运行命令\n\n```yaml\nsteps:\n  - name: Display the path\n    shell: powershell\n    run: echo ${env:PATH}\n```\n\n### 示例：运行 python 内联脚本\n\n```yaml\nsteps:\n  - name: Display the path\n    shell: python\n    run: |\n      import os\n      print(os.environ['PATH'])\n```\n\n### 自定义 shell\n\n可以使用 `shell` 将 `command [options] {0} [more_options]` 值设置为模板字符串。\nGitHub 将字符串的第一个带空格分隔的单词解释为命令，并在  处插入临时脚本 `{0}`的文件名。\n\n例如：\n\n```yaml\nsteps:\n  - name: Display the environment variables and their values\n    shell: perl {0}\n    run: |\n      print %ENV\n```\n\n此示例中使用的命令 `perl` 必须安装在运行器上。\n\n有关 GitHub 托管运行程序中包含的软件的信息，请参阅 [GitHub 托管的运行程序](/zh/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images)。\n\n### 退出码和错误处理偏好\n\n对于内置 shell 关键字，我们提供了以下由GitHub托管的运行器执行的默认值。 在运行 shell 脚本时，您应该使用这些指南。\n\n* `bash`\n  /\n  `sh`：\n  * 默认情况下，使用 `set -e` 对 `sh` 和 `bash` 强制实施快速失败行为。 指定 `shell: bash` 时，`-o pipefail` 也会被应用以强制使生成非零退出状态的管道提前退出。\n  * 你可以通过向 shell 选项提供模板字符串来完全控制 shell 参数。 例如，`bash {0}`。\n  * `sh` 类 shell 的退出代码是脚本中最后执行的命令的退出代码，这也是操作的默认行为。 运行程序将根据此退出代码将步骤的状态报告为失败/成功。\n\n* `powershell`/`pwsh`\n  * 可能时的快速失败行为。 对于 `pwsh` 和 `powershell` 内置 shell，我们将在脚本内容前面追加 `$ErrorActionPreference = 'stop'`。\n  * 我们追加 `if ((Test-Path -LiteralPath variable:\\LASTEXITCODE)) { exit $LASTEXITCODE }` 到 Powershell 脚本，以便操作状态反映脚本的最后一个退出代码。\n  * 用户始终可以选择退出，方法是不使用内置 shell，并按需提供 `pwsh -File {0}` 或 `powershell -Command \"& '{0}'\"` 等自定义 shell 选项。\n\n* `cmd`\n  * 除了编写脚本来检查每个错误代码并相应地响应之外，似乎没有办法完全启用快速失败机制。 由于我们默认不能实际提供该行为，因此您需要将此行为写入脚本。\n  * `cmd.exe` 在退出时带有其执行的最后一个程序的错误等级，并且会将错误代码返回到运行器。 此行为在内部与之前的 `sh` 和 `pwsh` 默认行为一致，并且是 `cmd.exe` 默认行为，因而此行为将保持不变。\n\n## `jobs.<job_id>.steps[*].with`\n\n由操作定义的输入参数的 `map`。 每个输入参数都是一个键/值对。 输入参数被设置为环境变量。 该变量的前缀为 `INPUT_`，并转换为大写。\n\n为 Docker 容器定义的输入参数必须使用 `args`。 有关详细信息，请参阅 [`jobs.<job_id>.steps[*].with.args`](#jobsjob_idstepswithargs)。\n\n### `jobs.<job_id>.steps[*].with` 的示例\n\n定义由 `first_name` 操作定义的三个输入参数（`middle_name`、`last_name` 和 `hello_world`）。 这些输入变量将作为 `hello-world`、`INPUT_FIRST_NAME` 和 `INPUT_MIDDLE_NAME` 环境变量由 `INPUT_LAST_NAME` 操作访问。\n\n```yaml\njobs:\n  my_first_job:\n    steps:\n      - name: My first step\n        uses: actions/hello_world@main\n        with:\n          first_name: Mona\n          middle_name: The\n          last_name: Octocat\n```\n\n## `jobs.<job_id>.steps[*].with.args`\n\n`string` 用于定义 Docker 容器的输入。\nGitHub 在容器启动时将 `args` 传递给容器的 `ENTRYPOINT` 。 此参数不支持 `array of strings`。 包含空格的单个参数应该用双引号 `\"\"` 括起来。\n\n### `jobs.<job_id>.steps[*].with.args` 的示例\n\n```yaml\nsteps:\n  - name: Explain why this job ran\n    uses: octo-org/action-name@main\n    with:\n      entrypoint: /bin/echo\n      args: The ${{ github.event_name }} event triggered this step.\n```\n\n`args` 用于代替 `CMD` 中的 `Dockerfile` 指令。 如果您在 `CMD` 中使用 `Dockerfile`，请遵循按优先顺序排列的指南：\n\n1. 在操作的自述文件中记录必要的参数，并在 `CMD` 指令的中忽略它们。\n2. 使用默认值，允许不指定任何 `args` 即可使用操作。\n3. 如果操作显示 `--help` 标记或类似项，请将其用作默认值，以便操作自行记录。\n\n## `jobs.<job_id>.steps[*].with.entrypoint`\n\n如果未指定该项，则替代 `ENTRYPOINT` 中的 Docker `Dockerfile`，否则对其进行设置。 与包含 shell 和 exec 表单的 Docker `ENTRYPOINT` 指令不同，`entrypoint` 关键字只接受定义要运行的可执行文件的单个字符串。\n\n### `jobs.<job_id>.steps[*].with.entrypoint` 的示例\n\n```yaml\nsteps:\n  - name: Run a custom command\n    uses: octo-org/action-name@main\n    with:\n      entrypoint: /a/different/executable\n```\n\n`entrypoint` 关键字旨在用于 Docker 容器操作，但你也可以将其用于未定义任何输入的 JavaScript 操作。\n\n## `jobs.<job_id>.steps[*].env`\n\n设置供步骤在运行器环境中使用的变量。 也可以设置用于整个工作流或某个作业的变量。 有关详细信息，请参阅 [`env`](#env) 和 [`jobs.<job_id>.env`](#jobsjob_idenv)。\n\n当多个环境变量使用相同的名称定义时，GitHub 会使用最特定的变量。 例如，步骤中定义的环境变量在步骤执行时将覆盖名称相同的作业和工作流环境变量。 为作业定义的环境变量在作业执行时将覆盖名称相同的工作流变量。\n\n公共动作可在 README 文件中指定预期变量。 如果要设置机密或敏感值（如密码或令牌），则必须使用 `secrets` 上下文来设置机密。 有关详细信息，请参阅“[上下文参考](/zh/actions/reference/workflows-and-actions/contexts)”。\n\n### `jobs.<job_id>.steps[*].env` 的示例\n\n```yaml\nsteps:\n  - name: My first action\n    env:\n      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      FIRST_NAME: Mona\n      LAST_NAME: Octocat\n```\n\n## `jobs.<job_id>.steps[*].continue-on-error`\n\n防止因某个步骤失败而导致整个作业失败。 设置为 `true` 以允许在此步骤失败时作业能够通过。\n\n## `jobs.<job_id>.steps[*].timeout-minutes`\n\n终止进程之前运行该步骤的最大分钟数。 最大值：GitHub 托管和自托管运行器均为 360。\n\n不支持小数值。\n`timeout-minutes` 必须是正整数。\n\n## `jobs.<job_id>.steps[*].background`\n\n以异步方式运行某个步骤，使作业无需等待其完成即可继续执行下一步。 对于需要与其他步骤同时运行的长期运行进程（例如数据库、服务器或监控任务），请使用 `background: true`。 稍后可使用 [`wait`](#jobsjob_idstepswait) 或 [`wait-all`](#jobsjob_idstepswait-all) 与后台步骤同步，或者使用 [`cancel`](#jobsjob_idstepscancel) 停止它们。\n\n你可以在使用 `background` 或 `run` 的步骤中使用 `uses`。 若要引用来自 [`wait`](#jobsjob_idstepswait) 或 [`cancel`](#jobsjob_idstepscancel) 的背景步骤，请为其指定一个 [`id`](#jobsjob_idstepsid)。 单个作业中最多可有 10 个后台步骤并发运行；其他后台步骤将排队等待，直到有空闲位置。\n\n只有在运行包含该后台步骤的 `wait` 或 `wait-all` 步骤后，该后台步骤的输出和环境变更才可用。 如果后台步骤失败，则该作业会在下一个包含该步骤的 `wait` 或 `wait-all` 处失败（除非为该步骤设置了 [`continue-on-error`](#jobsjob_idstepscontinue-on-error)）。 隐式 `wait-all` 会在任何作业后清理开始之前运行。\n\n在需要精细控制时，请使用 `background`：例如启动一个长期运行的进程（如服务器或数据库），使其在后续步骤运行时持续保持运行；使用 [`wait`](#jobsjob_idstepswait) 或 [`cancel`](#jobsjob_idstepscancel) 引用特定步骤；或者将后台任务与其他步骤交错执行。 如果相反，你有一组独立的步骤，并且这些步骤都应在作业继续之前完成，那么 [`parallel`](#jobsjob_idstepsparallel) 是一种更方便的简写方式。\n\n> \\[!NOTE]\n> 不能对复合操作中的步骤使用 `background` 。 复合操作本身可以作为后台步骤运行，但它不能在内部声明后台步骤。\n\n### 示例：在后台运行某个步骤\n\n```yaml\nsteps:\n  - name: Start server\n    id: server\n    run: npm start\n    background: true\n\n  - name: Run tests against the server\n    run: npm test\n\n  - name: Wait for the server step to finish\n    wait: server\n```\n\n## `jobs.<job_id>.steps[*].wait`\n\n暂停作业，直到一个或多个后台步骤完成。\n`wait` 步骤本身不执行任何工作，它只会阻止，直到引用的后台步骤完成为止。 以字符串的形式提供单个步骤 `id` ，或将多个步骤 `id`作为数组提供。\n\n步骤 `wait` 完成后，引用的后台步骤的输出将可供后续步骤使用。 如果引用的后台步骤失败，该 `wait` 步骤也会失败。\n\n> \\[!NOTE]\n> 步骤 `wait` 始终运行，不支持条件 [`if`](#jobsjob_idstepsif) 。\n\n### 示例：等待特定后台步骤\n\n```yaml\nsteps:\n  - name: Build frontend\n    id: build-frontend\n    run: npm run build:frontend\n    background: true\n\n  - name: Build backend\n    id: build-backend\n    run: npm run build:backend\n    background: true\n\n  - name: Run linter while builds run\n    run: npm run lint\n\n  - name: Wait for both builds to finish\n    wait: [build-frontend, build-backend]\n\n  - name: Run tests\n    run: npm test\n```\n\n## `jobs.<job_id>.steps[*].wait-all`\n\n暂停作业，直到所有正在运行的后台步骤完成。 当运行多个后台步骤，并且希望它们全部完成，然后继续操作时，这非常有用。 像 `wait` 一样，如果它等待的任何后台步骤失败，`wait-all` 步骤也会失败，除非你将 [`continue-on-error`](#jobsjob_idstepscontinue-on-error) 设置为 `true`。\n\n关键字 `wait-all` 不采用任何参数。\n\n> \\[!NOTE]\n> 步骤 `wait-all` 始终运行，不支持条件 [`if`](#jobsjob_idstepsif) 。\n\n### 示例：等待所有后台步骤完成\n\n```yaml\nsteps:\n  - name: Start database\n    id: db\n    run: docker run -d postgres:15\n    background: true\n\n  - name: Start cache\n    id: cache\n    run: docker run -d redis:7\n    background: true\n\n  - name: Run integration tests\n    run: npm run test:integration\n\n  - name: Wait for all services to stop\n    wait-all:\n```\n\n## `jobs.<job_id>.steps[*].cancel`\n\n正常终止正在运行的后台步骤。 运行器会向该步骤的进程发送终止信号（`SIGTERM`），以便它完成清理；如果该进程未在短暂的宽限期内退出，运行器会强制将其停止（`SIGKILL`）。\n`cancel` 关键字通过其 `id` 确定目标单个背景步骤。\n\n> \\[!NOTE]\n> 步骤 `cancel` 始终运行，不支持条件 [`if`](#jobsjob_idstepsif) 。\n\n### 示例：取消后台步骤\n\n```yaml\nsteps:\n  - name: Start long-running monitor\n    id: monitor\n    run: ./scripts/monitor.sh\n    background: true\n\n  - name: Run the main task\n    run: npm test\n\n  - name: Stop the monitor\n    cancel: monitor\n```\n\n## `jobs.<job_id>.steps[*].parallel`\n\n并发运行一组步骤，然后等待所有步骤完成，然后再继续。 关键字 `parallel` 是简写的：组中的每个步骤作为后台步骤运行，组末尾有隐式 `wait` 。 当你拥有可以同时运行的独立步骤组并且不需要单独引用这些步骤时，请使用它。\n\n当你有一组相对独立的步骤，且这些步骤都应在作业继续进行之前完成时，请使用 `parallel` ，例如同时构建多个组件。 需要更精细的控制时使用[`background`](#jobsjob_idstepsbackground)：启动长时间运行的进程（如服务器或数据库），在后续步骤运行时保持运行状态、引用特定步骤[`wait`](#jobsjob_idstepswait)[`cancel`](#jobsjob_idstepscancel)或交错后台处理其他步骤。 简言之， `parallel` 对于“一次性运行此组”的情况更为有限，但更方便，而 `background` 常规用途基元。\n\n组中的每个步骤都受到与其他后台步骤相同的 10 步并发限制。\n\n> \\[!NOTE]\n> 不能在复合操作中使用 `parallel`。\n\n### 示例：并行执行步骤\n\n```yaml\nsteps:\n  - uses: actions/checkout@v6\n\n  - parallel:\n      - name: Build frontend\n        run: npm run build:frontend\n\n      - name: Build backend\n        run: npm run build:backend\n\n      - name: Build docs\n        run: npm run build:docs\n\n  - name: Run tests after all builds complete\n    run: npm test\n```\n\n上述组等同于先使用 `background: true` 声明每个步骤，然后执行 `wait` 步骤。\n\n## `jobs.<job_id>.timeout-minutes`\n\n作业运行前允许的最大分钟数，之后 GitHub 会自动取消。 默认值：360\n\n如果超时超过运行器的作业执行时限，作业将在达到执行时限时取消。 有关作业执行时间限制的详细信息，请参阅 [](/zh/actions/concepts/billing-and-usage#usage-limits-and-policy) 托管运行器的 GitHub 和自托管运行器使用限制的 [Actions 限制](/zh/actions/reference/limits)。\n\n> \\[!NOTE]\n> `GITHUB_TOKEN` 在作业完成或最多 24 小时后过期。 对于自托管运行器，如果作业超时大于 24 小时，令牌可能是限制因素。 有关 `GITHUB_TOKEN` 的详细信息，请参阅“[在工作流中使用 GITHUB\\_TOKEN 进行身份验证](/zh/actions/tutorials/authenticate-with-github_token)”。\n\n## `jobs.<job_id>.strategy`\n\n使用 `jobs.<job_id>.strategy` 对作业使用矩阵策略。\n使用矩阵策略，可以在单个作业定义中使用变量自动创建基于变量组合的多个作业运行。 例如，可以使用矩阵策略在某个语言的多个版本或多个操作系统上测试代码。 有关详细信息，请参阅 [在工作流中运行作业变体](/zh/actions/how-tos/write-workflows/choose-what-workflows-do/run-job-variations)。\n\n## `jobs.<job_id>.strategy.matrix`\n\n使用 `jobs.<job_id>.strategy.matrix` 定义不同作业配置的矩阵。 有关详细信息，请参阅“[在工作流中运行作业变体](/zh/actions/how-tos/write-workflows/choose-what-workflows-do/run-job-variations)”。\n\n矩阵在每次工作流运行时最多将生成 256 个作业。 此限制适用于 GitHub 托管和自托管运行器。\n\n定义的变量将成为 `matrix` 上下文中的属性，你可以在工作流文件的其他区域中引用该属性。 在此示例中，可以使用 `matrix.version` 和 `matrix.os` 来访问作业正在使用的 `version` 和 `os` 的当前值。 有关详细信息，请参阅“[上下文参考](/zh/actions/reference/workflows-and-actions/contexts)”。\n\n默认情况下， GitHub 将根据运行程序可用性将并行运行的作业数最大化。 矩阵中变量的顺序决定了作业的创建顺序。 定义的第一个变量将是在工作流运行中创建的第一个作业。\n\n### 使用单维度矩阵\n\n以下工作流程使用值 `version` 定义变量 `[10, 12, 14]`。 工作流将运行三个作业，其中针对变量中的每个值提供一个作业。 每个作业都会通过 `version` 上下文访问 `matrix.version` 值，并此值作为 `node-version` 传递给 `actions/setup-node` 操作。\n\n```yaml\njobs:\n  example_matrix:\n    strategy:\n      matrix:\n        version: [10, 12, 14]\n    steps:\n      - uses: actions/setup-node@v7\n        with:\n          node-version: ${{ matrix.version }}\n```\n\n### 使用多维矩阵\n\n指定多个变量来创建多维矩阵。 将针对变量的每个可能组合运行作业。\n\n例如，以下工作流指定两个变量：\n\n* `os` 变量中指定的两个操作系统\n* `version` 变量中指定的三个 Node.js 版本\n\n工作流将运行六个作业，其中针对每个 `os` 和 `version` 变量组合提供一个作业。 每个作业都会将 `runs-on` 值设置为当前的 `os` 值，并将当前的 `version` 值传递给 `actions/setup-node` 操作。\n\n```yaml\njobs:\n  example_matrix:\n    strategy:\n      matrix:\n        os: [ubuntu-22.04, ubuntu-24.04]\n        version: [10, 12, 14]\n    runs-on: ${{ matrix.os }}\n    steps:\n      - uses: actions/setup-node@v7\n        with:\n          node-version: ${{ matrix.version }}\n```\n\n矩阵中的变量配置可以是 `array` 的 `object`。 例如，以下矩阵生成 4 个作业和相应的上下文。\n\n```yaml\nmatrix:\n  os:\n    - ubuntu-latest\n    - macos-latest\n  node:\n    - version: 14\n    - version: 20\n      env: NODE_OPTIONS=--openssl-legacy-provider\n```\n\n矩阵中的每个作业都将具有自己的 `os` 和 `node` 值组合，如下所示。\n\n```yaml\n- matrix.os: ubuntu-latest\n  matrix.node.version: 14\n- matrix.os: ubuntu-latest\n  matrix.node.version: 20\n  matrix.node.env: NODE_OPTIONS=--openssl-legacy-provider\n- matrix.os: macos-latest\n  matrix.node.version: 14\n- matrix.os: macos-latest\n  matrix.node.version: 20\n  matrix.node.env: NODE_OPTIONS=--openssl-legacy-provider\n```\n\n## `jobs.<job_id>.strategy.matrix.include`\n\n对于 `include` 列表中的每个对象，如果对象中的键:值对不覆盖任何原始矩阵值，则会将这些键:值对添加到每个矩阵组合中。 如果对象不能添加到任何矩阵组合中，将改为创建新的矩阵组合。 请注意，原始矩阵值不会被覆盖，但添加的矩阵值可以被覆盖。\n\n### 示例：扩展配置\n\n例如，以下工作流将运行四个作业，其中针对每个 `os` 和 `node` 变量组合提供一个作业。 当对应于 `windows-latest` 的 `os` 值和 `16` 的 `node` 值的作业运行时，作业中将包含一个被称为 `npm` 且值为 `6` 的其他变量。\n\n```yaml\njobs:\n  example_matrix:\n    strategy:\n      matrix:\n        os: [windows-latest, ubuntu-latest]\n        node: [14, 16]\n        include:\n          - os: windows-latest\n            node: 16\n            npm: 6\n    runs-on: ${{ matrix.os }}\n    steps:\n      - uses: actions/setup-node@v7\n        with:\n          node-version: ${{ matrix.node }}\n      - if: ${{ matrix.npm }}\n        run: npm install -g npm@${{ matrix.npm }}\n      - run: npm --version\n```\n\n### 示例：添加配置\n\n例如，此矩阵将运行 10 个作业，矩阵中每个 `os` 和 `version` 的组合一个作业，再加上一个用于 `windows-latest` 的 `os` 值和 `17` 的 `version` 值的作业。\n\n```yaml\njobs:\n  example_matrix:\n    strategy:\n      matrix:\n        os: [macos-latest, windows-latest, ubuntu-latest]\n        version: [12, 14, 16]\n        include:\n          - os: windows-latest\n            version: 17\n```\n\n如果未指定任何矩阵变量，则运行 `include` 下的所有配置。 例如，以下工作流将运行两个作业，每个 `include` 一个作业。 这样你可以利用矩阵策略，而无需完全填充矩阵。\n\n```yaml\njobs:\n  includes_only:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        include:\n          - site: \"production\"\n            datacenter: \"site-a\"\n          - site: \"staging\"\n            datacenter: \"site-b\"\n```\n\n## `jobs.<job_id>.strategy.matrix.exclude`\n\n排除的配置必须是部分匹配项，才能将其排除。\n\n所有 `include` 组合会在 `exclude` 之后处理。 这允许你使用 `include` 添加回以前排除的组合。\n\n## `jobs.<job_id>.strategy.fail-fast`\n\n你可以使用 `jobs.<job_id>.strategy.fail-fast` 和 `jobs.<job_id>.continue-on-error` 来控制如何处理作业失败。\n\n`jobs.<job_id>.strategy.fail-fast` 适用于整个矩阵。 如果 `jobs.<job_id>.strategy.fail-fast` 设置为 `true`，或者其表达式计算结果为 `true`，则在矩阵中的任何作业失败的情况下，GitHub 将取消矩阵中所有正在进行和在队列中的作业。 此属性的默认值为 `true`。\n\n`jobs.<job_id>.continue-on-error` 适用于单个作业。 如果 `jobs.<job_id>.continue-on-error` 为 `true`，即使具有 `jobs.<job_id>.continue-on-error: true` 的作业失败，矩阵中的其他作业也将继续运行。\n\n可以同时使用 `jobs.<job_id>.strategy.fail-fast` 和 `jobs.<job_id>.continue-on-error`。 例如，以下工作流将启动四个作业。 对于每个作业，`continue-on-error` 都由 `matrix.experimental` 的值确定。 如果任何具有 `continue-on-error: false` 的作业失败，所有正在进行或加入队列的作业都将被取消。 如果具有 `continue-on-error: true` 的作业失败，则其他作业将不会受到影响。\n\n```yaml\njobs:\n  test:\n    runs-on: ubuntu-latest\n    continue-on-error: ${{ matrix.experimental }}\n    strategy:\n      fail-fast: true\n      matrix:\n        version: [6, 7, 8]\n        experimental: [false]\n        include:\n          - version: 9\n            experimental: true\n```\n\n## `jobs.<job_id>.strategy.max-parallel`\n\n默认情况下， GitHub 将根据运行程序可用性将并行运行的作业数最大化。\n\n## `jobs.<job_id>.continue-on-error`\n\n`jobs.<job_id>.continue-on-error` 适用于单个作业。 如果 `jobs.<job_id>.continue-on-error` 为 `true`，即使具有 `jobs.<job_id>.continue-on-error: true` 的作业失败，矩阵中的其他作业也将继续运行。\n\n防止工作流程运行在作业失败时失败。 设置为 `true` 以允许工作流运行在此作业失败时通过。\n\n### 示例：防止特定失败的矩阵作业无法运行工作流程\n\n您可以允许作业矩阵中的特定作业失败，但工作流程运行不会失败。 例如，工作流运行不失败的情况下只允许在 `node` 设置为 `15` 的实验性作业失败。\n\n```yaml\nruns-on: ${{ matrix.os }}\ncontinue-on-error: ${{ matrix.experimental }}\nstrategy:\n  fail-fast: false\n  matrix:\n    node: [13, 14]\n    os: [macos-latest, ubuntu-latest]\n    experimental: [false]\n    include:\n      - node: 15\n        os: ubuntu-latest\n        experimental: true\n```\n\n## `jobs.<job_id>.container`\n\n> \\[!NOTE]\n> 如果工作流使用 Docker 容器操作、作业容器或服务容器，则必须使用 Linux 运行器：\n>\n> * 如果您要使用 GitHub 托管的运行器，则必须使用 Ubuntu 运行器。\n> * 如果您要使用自托管运行器，则必须使用 Linux 机器作为运行器，并且必须安装 Docker。\n\n使用 `jobs.<job_id>.container` 创建用于运行作业中尚未指定容器的任何步骤的容器。 如有步骤同时使用脚本和容器操作，则容器操作将运行为同一网络上使用相同卷挂载的同级容器。\n\n若不设置 `container`，所有步骤将直接在 `runs-on` 指定的主机上运行，除非步骤引用已配置为在容器中运行的操作。\n\n> \\[!NOTE]\n> 用于容器中的 `run` 步骤的默认 shell 是 `sh`，而不是 `bash`。 这可以使用 [`jobs.<job_id>.defaults.run`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_iddefaultsrun) 或 [`jobs.<job_id>.steps[*].shell`](/zh/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsshell) 进行替代。\n\n### 示例：在容器中运行作业\n\n```yaml copy\nname: CI\non:\n  push:\n    branches: [ main ]\njobs:\n  container-test-job:\n    runs-on: ubuntu-latest\n    container:\n      image: node:18\n      env:\n        NODE_ENV: development\n      ports:\n        - 80\n      volumes:\n        - my_docker_volume:/volume_mount\n      options: --cpus 1\n    steps:\n      - name: Check for dockerenv file\n        run: (ls /.dockerenv && echo Found dockerenv) || (echo No dockerenv)\n```\n\n只指定容器映像时，可以忽略 `image` 关键词。\n\n```yaml\njobs:\n  container-test-job:\n    runs-on: ubuntu-latest\n    container: node:18\n```\n\n## `jobs.<job_id>.container.image`\n\n使用 `jobs.<job_id>.container.image` 定义要用作运行操作的容器的 Docker 映像。 值可以是 Docker Hub 映像名称或注册表名称。\n\n> \\[!NOTE]\n> Docker Hub 通常会对推送和拉取操作设置速率限制，这将影响自托管运行程序上的作业。 不过，根据 GitHub 和 Docker 之间的协议，GitHub 托管的运行程序不受这些限制的约束。\n\n## `jobs.<job_id>.container.credentials`\n\n如果映像的容器注册表需要身份验证才能拉取映像，可以使用 `jobs.<job_id>.container.credentials` 设置 `username` 和 `password` 的 `map`。 凭据是你将提供给 [`docker login`](https://docs.docker.com/engine/reference/commandline/login/) 命令的相同值。\n\n### 示例：定义容器注册表的凭据\n\n```yaml\ncontainer:\n  image: ghcr.io/owner/image\n  credentials:\n     username: ${{ github.actor }}\n     password: ${{ secrets.github_token }}\n```\n\n## `jobs.<job_id>.container.env`\n\n使用 `jobs.<job_id>.container.env` 以在容器中设置环境变量的 `map`。\n\n## `jobs.<job_id>.container.ports`\n\n使用 `jobs.<job_id>.container.ports` 设置要在容器上显示的 `array` 个端口。\n\n## `jobs.<job_id>.container.volumes`\n\n使用 `jobs.<job_id>.container.volumes` 设置容器要使用的卷 `array`。 您可以使用卷分享作业中服务或其他步骤之间的数据。 可以指定命名的 Docker 卷、匿名的 Docker 卷或主机上的绑定挂载。\n\n要指定卷，需指定来源和目标路径：\n\n`<source>:<destinationPath>`。\n\n`<source>` 是主机上的卷名称或绝对路径，`<destinationPath>` 是容器中的绝对路径。\n\n### 示例：在容器中装载卷\n\n```yaml\nvolumes:\n  - my_docker_volume:/volume_mount\n  - /data/my_data\n  - /source/directory:/destination/directory\n```\n\n## `jobs.<job_id>.container.options`\n\n使用 `jobs.<job_id>.container.options` 配置其他 Docker 容器资源选项。 有关选项列表，请参阅“[`docker create` 选项](https://docs.docker.com/engine/reference/commandline/create/#options)”。\n\n> \\[!WARNING]\n> 不支持 `--network` 和 `--entrypoint` 选项。\n\n## `jobs.<job_id>.services`\n\n> \\[!NOTE]\n> 如果工作流使用 Docker 容器操作、作业容器或服务容器，则必须使用 Linux 运行器：\n>\n> * 如果您要使用 GitHub 托管的运行器，则必须使用 Ubuntu 运行器。\n> * 如果您要使用自托管运行器，则必须使用 Linux 机器作为运行器，并且必须安装 Docker。\n\n用于为工作流程中的作业托管服务容器。 服务容器可用于创建数据库或缓存服务（如 Redis）。 运行器自动创建 Docker 网络并管理服务容器的生命周期。\n\n如果将作业配置为在容器中运行，或者步骤使用容器操作，则无需映射端口来访问服务或操作。 Docker 会自动在同一个 Docker 用户定义的桥接网络上的容器之间显示所有端口。 您可以直接引用服务容器的主机名。 主机名会自动映射到您在工作流程中为服务配置的标签名称。\n\n如果配置作业直接在运行器机器上运行，且您的步骤不使用容器操作，则必须将任何必需的 Docker 服务容器端口映射到 Docker 主机（运行器机器）。 您可以使用 localhost 和映射的端口访问服务容器。\n\n有关网络服务容器之间的差异的详细信息，请参阅“[与 Docker 服务容器通信](/zh/actions/tutorials/use-containerized-services/use-docker-service-containers)”。\n\n### 示例：使用 localhost\n\n此示例创建了两个服务：nginx 和 redis。 当指定容器端口但未指定主机端口时，容器端口将随机分配给主机上的空闲端口。\nGitHub 在上下文中 `${{job.services.<service_name>.ports}}` 设置分配的主机端口。 在此示例中，可以使用`${{ job.services.nginx.ports['80'] }}`和`${{ job.services.redis.ports['6379'] }}`上下文访问服务主机端口。\n\n```yaml\nservices:\n  nginx:\n    image: nginx\n    # Map port 8080 on the Docker host to port 80 on the nginx container\n    ports:\n      - 8080:80\n  redis:\n    image: redis\n    # Map random free TCP port on Docker host to port 6379 on redis container\n    ports:\n      - 6379/tcp\nsteps:\n  - run: |\n      echo \"Redis available on 127.0.0.1:${{ job.services.redis.ports['6379'] }}\"\n      echo \"Nginx available on 127.0.0.1:${{ job.services.nginx.ports['80'] }}\"\n```\n\n## `jobs.<job_id>.services.<service_id>.image`\n\n用于作为服务容器来运行操作的 Docker 镜像。 值可以是 Docker Hub 映像名称或注册表名称。\n\n如果为 `jobs.<job_id>.services.<service_id>.image` 分配了空字符串，则服务不会启动。 可以使用此选项来设置条件服务，如下所示。\n\n```yaml\nservices:\n  nginx:\n    image: ${{ options.nginx == true && 'nginx' || '' }}\n```\n\n## `jobs.<job_id>.services.<service_id>.credentials`\n\n如果映像的容器注册表需要身份验证才能拉取映像，可以使用 `jobs.<job_id>.container.credentials` 设置 `username` 和 `password` 的 `map`。 凭据是你将提供给 [`docker login`](https://docs.docker.com/engine/reference/commandline/login/) 命令的相同值。\n\n### `jobs.<job_id>.services.<service_id>.credentials` 的示例\n\n```yaml\nservices:\n  myservice1:\n    image: ghcr.io/owner/myservice1\n    credentials:\n      username: ${{ github.actor }}\n      password: ${{ secrets.github_token }}\n  myservice2:\n    image: dockerhub_org/myservice2\n    credentials:\n      username: ${{ secrets.DOCKER_USER }}\n      password: ${{ secrets.DOCKER_PASSWORD }}\n```\n\n## `jobs.<job_id>.services.<service_id>.env`\n\n在服务容器中设置环境变量 `map`。\n\n## `jobs.<job_id>.services.<service_id>.ports`\n\n设置要在服务容器上显示的端口 `array`。\n\n## `jobs.<job_id>.services.<service_id>.volumes`\n\n设置服务容器要使用的卷 `array`。 您可以使用卷分享作业中服务或其他步骤之间的数据。 可以指定命名的 Docker 卷、匿名的 Docker 卷或主机上的绑定挂载。\n\n要指定卷，需指定来源和目标路径：\n\n`<source>:<destinationPath>`。\n\n`<source>` 是主机上的卷名称或绝对路径，`<destinationPath>` 是容器中的绝对路径。\n\n### `jobs.<job_id>.services.<service_id>.volumes` 的示例\n\n```yaml\nvolumes:\n  - my_docker_volume:/volume_mount\n  - /data/my_data\n  - /source/directory:/destination/directory\n```\n\n## `jobs.<job_id>.services.<service_id>.options`\n\nDocker 容器的附加资源选项。 有关选项列表，请参阅“[`docker create` 选项](https://docs.docker.com/engine/reference/commandline/create/#options)”。\n\n> \\[!WARNING]\n> `--network` 选项不受支持。\n\n## `jobs.<job_id>.services.<service_id>.command`\n\n替代 Docker 映像的默认命令（`CMD`）。 该值在命令中的 `docker create` 映像名称之后作为参数传递。 如果还指定 `entrypoint`， `command` 则提供该入口点的参数。\n\n### `jobs.<job_id>.services.<service_id>.command` 的示例\n\n```yaml\nservices:\n  mysql:\n    image: mysql:8\n    command: --sql_mode=STRICT_TRANS_TABLES --max_allowed_packet=512M\n    env:\n      MYSQL_ROOT_PASSWORD: test\n    ports:\n      - 3306:3306\n```\n\n## `jobs.<job_id>.services.<service_id>.entrypoint`\n\n覆盖 Docker 镜像的默认 `ENTRYPOINT`。 该值是定义要运行的可执行文件的单个字符串。 如果需要完全替换图像的入口点，请使用此选项。 可以结合`entrypoint``command`将参数传递给自定义入口点。\n\n### `jobs.<job_id>.services.<service_id>.entrypoint` 的示例\n\n```yaml\nservices:\n  etcd:\n    image: quay.io/coreos/etcd:v3.5.17\n    entrypoint: etcd\n    command: >-\n      --listen-client-urls http://0.0.0.0:2379\n      --advertise-client-urls http://0.0.0.0:2379\n    ports:\n      - 2379:2379\n```\n\n## `jobs.<job_id>.uses`\n\n要作为作业运行的可重用工作流程文件的位置和版本。 使用以下语法之一：\n\n* `$/.github/workflows/{filename}` 用于同一存储库中的可重用工作流。 这是引用同一存储库中可重用工作流的建议语法。 此语法在 . 中 GitHub Enterprise Server不可用。\n* ```\n            可重用工作流的 `{owner}/{repo}/.github/workflows/{filename}@{ref}`，这些工作流位于公共和私有存储库中。\n  ```\n* `./.github/workflows/{filename}` 用于同一存储库中的可重用工作流。\n\n使用 <<c1/>a0/> 引用可重用工作流<c0 />时，<c2 />可以是 SHA、发布标记或分支名称。 如果发布标记和分支具有相同的名称，则发布标记优先于分支名称。 出于稳定性和安全性考虑，使用提交 SHA 是最稳妥的选项。 有关详细信息，请参阅“[安全使用指南](/zh/actions/reference/security/secure-use#reusing-third-party-workflows)”。\n\n使用或`$/`（不使用）`./``{owner}/{repo}`在同一存储库`@{ref}`中引用可重用工作流时，调用的工作流与调用方工作流的提交相同。 引用 <c0 /> 不得包含 <c1 /> 后缀， <c2 /> 且在 < a0/> 中 <c3 />不可用。 不允许使用 `refs/heads` 和 `refs/tags` 等引用前缀。 您不能在此关键词中使用上下文或表达式。\n\n### `jobs.<job_id>.uses` 的示例\n\n```yaml\njobs:\n  call-workflow-1-in-local-repo:\n    uses: octo-org/this-repo/.github/workflows/workflow-1.yml@172239021f7ba04fe7327647b213799853a9eb89\n  call-workflow-2-in-local-repo:\n    uses: ./.github/workflows/workflow-2.yml\n  # The `$/` syntax is not available in GitHub Enterprise Server.\n  call-workflow-in-same-repo-at-running-commit:\n    uses: $/.github/workflows/workflow-2.yml\n  call-workflow-in-another-repo:\n    uses: octo-org/another-repo/.github/workflows/workflow.yml@v1\n```\n\n有关详细信息，请参阅“[重用工作流](/zh/actions/how-tos/reuse-automations/reuse-workflows)”。\n\n## `jobs.<job_id>.with`\n\n当作业用于调用可重用工作流时，可以使用 `with` 来提供传递到被调用工作流的输入的映射。\n\n传递的任何输入都必须与被调用工作流程中定义的输入规范匹配。\n\n与 [`jobs.<job_id>.steps[*].with`](#jobsjob_idstepswith) 不同，你使用 `jobs.<job_id>.with` 传递的输入不可作为环境变量用于被调用工作流中。 但你可以通过使用 `inputs` 上下文来引用输入。\n\n### `jobs.<job_id>.with` 的示例\n\n```yaml\njobs:\n  call-workflow:\n    uses: octo-org/example-repo/.github/workflows/called-workflow.yml@main\n    with:\n      username: mona\n```\n\n## `jobs.<job_id>.with.<input_id>`\n\n由输入的字符串标识符和输入的值组成的对。 标识符必须与被调用工作流中由 [`on.workflow_call.inputs.<inputs_id>`](/zh/actions/reference/workflows-and-actions/metadata-syntax#inputsinput_id) 定义的输入名称匹配。 值的数据类型必须与被调用工作流中定义的 [`on.workflow_call.inputs.<input_id>.type`](#onworkflow_callinputsinput_idtype) 类型匹配。\n\n允许的表达式上下文：`github` 和 `needs`。\n\n## `jobs.<job_id>.secrets`\n\n当作业用于调用可重用工作流时，可以使用 `secrets` 来提供传递到被调用工作流的机密的映射。\n\n传递的任何机密都必须与被调用工作流程中定义的名称匹配。\n\n### `jobs.<job_id>.secrets` 的示例\n\n```yaml\njobs:\n  call-workflow:\n    uses: octo-org/example-repo/.github/workflows/called-workflow.yml@main\n    secrets:\n      access-token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n```\n\n## `jobs.<job_id>.secrets.inherit`\n\n使用关键字 `inherit` 将所有调用工作流的机密传递给调用的工作流。 这包括调用工作流有权访问的所有机密，即组织、存储库和环境机密。 关键字 `inherit` 可用于在同一组织中跨存储库或在同一企业中跨组织传递机密。\n\n### `jobs.<job_id>.secrets.inherit` 的示例\n\n```yaml\non:\n  workflow_dispatch:\n\njobs:\n  pass-secrets-to-workflow:\n    uses: ./.github/workflows/called-workflow.yml\n    secrets: inherit\n```\n\n```yaml\non:\n  workflow_call:\n\njobs:\n  pass-secret-to-action:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Use a repo or org secret from the calling workflow.\n        run: echo ${{ secrets.CALLING_WORKFLOW_SECRET }}\n```\n\n## `jobs.<job_id>.secrets.<secret_id>`\n\n由机密的字符串标识符和机密的值组成的对。 标识符必须与被调用工作流中由 [`on.workflow_call.secrets.<secret_id>`](#onworkflow_callsecretssecret_id) 定义的机密名称匹配。\n\n允许的表达式上下文：`github`、`needs` 和 `secrets`。\n\n## 筛选器模式速查表\n\n您可以在路径、分支和标记过滤器中使用特殊字符。\n\n* `*`：匹配零个或多个字符，但不匹配 `/` 字符。 例如，`Octo*` 匹配 `Octocat`。\n* `**`：匹配零个或多个任意字符。\n* `?`：匹配零个或一个前面的字符。\n* `+`：匹配一个或多个前面的字符。\n* `[]` 匹配列在括号中或包含在范围内的一个字母数字字符。 范围只能包括 `a-z`、`A-Z` 和 `0-9`。 例如，范围 `[0-9a-z]` 匹配任何数字或小写字母。 例如，`[CB]at` 匹配 `Cat` 或 `Bat`，而 `[1-2]00` 匹配 `100` 和 `200`。\n* `!`：在模式开始时，它将否定以前的正模式。 如果不是第一个字符，它就没有特殊的意义。\n\n字符 `*`、`[` 和 `!` 是 YAML 中的特殊字符。 如果模式以 `*`、`[` 或 `!` 开头，则必须将模式括在引号中。 此外，如果将[流序列](https://yaml.org/spec/1.2.2/#flow-sequences)与包含 `[` 和/或 `]` 的模式一起使用，则必须用引号括住该模式。\n\n```yaml\n# Valid\npaths:\n  - '**/README.md'\n\n# Invalid - creates a parse error that\n# prevents your workflow from running.\npaths:\n  - **/README.md\n\n# Valid\nbranches: [ main, 'release/v[0-9].[0-9]' ]\n\n# Invalid - creates a parse error\nbranches: [ main, release/v[0-9].[0-9] ]\n```\n\n有关分支、标签和路径筛选器语法的详细信息，请参阅“[`on.<push>.<branches|tags>`](#onpushbranchestagsbranches-ignoretags-ignore)”、“[`on.<pull_request>.<branches|tags>`](#onpull_requestpull_request_targetbranchesbranches-ignore)”和“[`on.<push|pull_request>.paths`](#onpushpull_requestpull_request_targetpathspaths-ignore)”。\n\n### 匹配分支和标签的模式\n\n| 模式                                          | 说明                                                                                            | 示例匹配项                                       |\n| ------------------------------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------- |\n| `feature/*`                                 |                                                                                               |                                             |\n| `*` 通配符匹配任意字符，但不匹配斜杠 (`/`)。                 | `feature/my-branch`<br/><br/>`feature/your-branch`                                            |                                             |\n| `feature/**`                                |                                                                                               |                                             |\n| `**` 通配符匹配任意字符，包括分支中的斜杠 (`/`) 和标记名称。        | `feature/beta-a/my-branch`<br/><br/>`feature/your-branch`<br/><br/>`feature/mona/the/octocat` |                                             |\n| `main`<br/><br/>`releases/mona-the-octocat` | 匹配分支或标记名称的确切名称。                                                                               | `main`<br/><br/>`releases/mona-the-octocat` |\n| `'*'`                                       | 匹配所有不包含斜杠 (`/`) 的分支和标记名称。                                                                     |                                             |\n| `*` 字符是 YAML 中的特殊字符。 当模式以 `*` 开头时，必须使用引号。   | `main`<br/><br/>`releases`                                                                    |                                             |\n| `'**'`                                      | 匹配所有分支和标记名称。 这是不使用 `branches` 或 `tags` 筛选器时的默认行为。                                             | `all/the/branches`<br/><br/>`every/tag`     |\n| `'*feature'`                                |                                                                                               |                                             |\n| `*` 字符是 YAML 中的特殊字符。 当模式以 `*` 开头时，必须使用引号。   | `mona-feature`<br/><br/>`feature`<br/><br/>`ver-10-feature`                                   |                                             |\n| `v2*`                                       | 匹配以 `v2` 开头的分支和标记名称。                                                                          | `v2`<br/><br/>`v2.0`<br/><br/>`v2.9`        |\n| `v[12].[0-9]+.[0-9]+`                       | 将所有语义版本控制分支和标记与主要版本 1 或 2 匹配。                                                                 | `v1.10.1`<br/><br/>`v2.0.0`                 |\n\n### 匹配文件路径的模式\n\n路径模式必须匹配整个路径，并从仓库根开始。\n\n| 模式                                                  | 匹配描述                                                                                    | 示例匹配项                                                                                |\n| --------------------------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |\n| `'*'`                                               |                                                                                         |                                                                                      |\n| `*` 通配符匹配任意字符，但不匹配斜杠 (`/`)。                         |                                                                                         |                                                                                      |\n| `*` 字符是 YAML 中的特殊字符。 当模式以 `*` 开头时，必须使用引号。           | `README.md`<br/><br/>`server.rb`                                                        |                                                                                      |\n| `'*.jsx?'`                                          |                                                                                         |                                                                                      |\n| `?` 字符匹配零个或一个前面的字符。                                 | `page.js`<br/><br/>`page.jsx`                                                           |                                                                                      |\n| `'**'`                                              |                                                                                         |                                                                                      |\n| `**`通配符匹配任意字符，包括斜杠 (`/`)。 这是不使用 `path` 筛选器时的默认行为。   | `all/the/files.md`                                                                      |                                                                                      |\n| `'*.js'`                                            |                                                                                         |                                                                                      |\n| `*` 通配符匹配任意字符，但不匹配斜杠 (`/`)。 匹配存储库根目录下的所有 `.js` 文件。  | `app.js`<br/><br/>`index.js`                                                            |                                                                                      |\n| `'**.js'`                                           | 匹配存储库中的所有 `.js` 文件。                                                                     | `index.js`<br/><br/>`js/index.js`<br/><br/>`src/js/app.js`                           |\n| `docs/*`                                            | 存储库根目录下仅 `docs` 根目录中的所有文件。                                                              | `docs/README.md`<br/><br/>`docs/file.txt`                                            |\n| `docs/**`                                           | 仓库根目录下 `docs` 目录及其子目录中的任何文件。                                                            | `docs/README.md`<br/><br/>`docs/mona/octocat.txt`                                    |\n| `docs/**/*.md`                                      |                                                                                         |                                                                                      |\n| `.md` 目录下任意位置带有 `docs` 后缀的文件。                       | `docs/README.md`<br/><br/>`docs/mona/hello-world.md`<br/><br/>`docs/a/markdown/file.md` |                                                                                      |\n| `'**/docs/**'`                                      | 存储库中任意位置 `docs` 目录下的任何文件。                                                               | `docs/hello.md`<br/><br/>`dir/docs/my-file.txt`<br/><br/>`space/docs/plan/space.doc` |\n| `'**/README.md'`                                    | 仓库中任意位置的 README.md 文件。                                                                  | `README.md`<br/><br/>`js/README.md`                                                  |\n| `'**/*src/**'`                                      | 存储库中任意位置带有 `src` 后缀的文件夹中的任何文件。                                                          | `a/src/app.js`<br/><br/>`my-src/code/js/app.js`                                      |\n| `'**/*-post.md'`                                    | 存储库中任意位置带有 `-post.md` 后缀的文件。                                                            | `my-post.md`<br/><br/>`path/their-post.md`                                           |\n| `'**/migrate-*.sql'`                                | 存储库中任意位置带有 `migrate-` 前缀和 `.sql` 后缀的文件。                                                 | `migrate-10909.sql`<br/><br/>`db/migrate-v1.0.sql`<br/><br/>`db/sept/migrate-v1.sql` |\n| `'*.md'`<br/><br/>`'!README.md'`                    | 模式前使用感叹号 `!` 对其进行否定。 当文件与模式匹配并且也匹配文件后面定义的否定模式时，则不包括该文件。                                 | `hello.md`<br/><br/>                                                                 |\n| *不匹配*<br/><br/>`README.md`<br/><br/>`docs/hello.md` |                                                                                         |                                                                                      |\n| `'*.md'`<br/><br/>`'!README.md'`<br/><br/>`README*` | 模式依次被检查。 否定前一个模式的模式将重新包含文件路径。                                                           | `hello.md`<br/><br/>`README.md`<br/><br/>`README.doc`                                |"}