我们经常发布文档更新,此页面的翻译可能仍在进行中。有关最新信息,请访问英文文档。如果此页面上的翻译有问题,请告诉我们

GitHub 操作的工作流程语法

工作流程是可配置的自动化过程,由一个或多个作业组成。 您必须创建 YAML 文件来定义工作流程配置。

GitHub 操作 可用于 GitHub Free、GitHub Pro、组织的 GitHub Free、GitHub Team、GitHub Enterprise Cloud 和 GitHub One。 GitHub 操作 不适用于使用旧版按仓库计划的帐户所拥有的私有仓库。 更多信息请参阅“GitHub 的产品”。

本文内容

关于工作流程的 YAML 语法

工作流程文件使用 YAML 语法,必须有 .yml.yaml 文件扩展名。 如果您是 YAML 的新用户并想要了解更多信息,请参阅“五分钟了解 YAML”。

必须将工作流程文件存储在仓库的 .github/workflows 目录中。

使用限制

GitHub 操作 的使用受到一些不同限制,具体取决于您使用的是 GitHub 托管的运行器还是自托管的运行器。 这些限制可能会有变动。

  • 作业执行时间 - 工作流程中的每个作业最多可以运行 6 个小时。 如果作业达到此限制,该作业将会终止而无法完成。 此限制不适用于自托管运行器。

  • 工作流程运行时间 - 每个工作流程的运行时限为 72 小时。 如果工作流程运行时间达到此限制,其运行将被取消。 此限制也适用于自托管运行器。

  • 作业排队时间 - 自托管运行器的每个作业最多可排队 24 小时。 如果自托管运行器在此限制内没有开始执行作业,则作业将被终止,并且无法完成。 此限制不适用于 GitHub 托管的运行器。

  • API 请求 - 在一个仓库的所有操作中,一个小时内最多可执行 1000 个 API 请求。 如果超出,额外的 API 调用将失败,这可能导致作业失败。 此限制也适用于自托管运行器。

  • 并发作业 - 您的帐户中可并发运行的作业数量,具体取决于您的 GitHub 计划,如下表所示。 如果超出,任何额外的作业都会排队。 对于自托管运行器没有并发限制。

    GitHub 计划同时运行的作业总数MacOS 作业同时运行的最大数量
    免费205
    Pro405
    团队605
    企业18050
  • 作业矩阵 - 作业矩阵在每次工作流程运行时最多可生成 256 个作业。 此限制也适用于自托管运行器。

name

工作流程的名称。 GitHub 在仓库的操作页面上显示工作流程的名称。 如果省略 name,GitHub 将其设置为相对于仓库根目录的工作流程文件路径。

on

必要 触发工作流程的 GitHub 事件的名称。 您可以提供单一事件 string、事件的 array、事件 typesarray 或事件配置 map,以安排工作流程的运行,或将工作流程的执行限于特定文件、标记或分支更改。 有关可用事件的列表,请参阅“触发工作流程的事件”。

使用单一事件的示例

# Trigger on push
on: push

使用事件列表的示例

# Trigger the workflow on push or pull request
on: [push, pull_request]

使用具有活动类型或配置的多个事件示例

如果您需要为一个事件指定活动类型或配置,必须分别配置每个事件。 您必须为所有事件附加冒号 (`:</0),包括没有配置的事件。

on:
  # Trigger the workflow on push or pull request,
  # but only for the master branch
  push:
    branches:
      - master
  pull_request:
    branches:
      - master
  # Also trigger on page_build, as well as release created events
  page_build:
  release:
    types: # This configuration does not affect the page_build event above
      - created
`

on.<event_name>.types

选择将触发工作流程运行的活动类型。 大多数 GitHub 事件由多种活动触发。 例如,发布资源的事件在发行版 publishedunpublishedcreatedediteddeletedprereleased 时触发。 通过 types 关键词可缩小触发工作流程运行的活动类型的范围。 如果只有一种活动类型可触发 web 挂钩事件,就没有必要使用 types 关键词。

您可以使用事件 types 的数组。 有关每个事件及其活动类型的更多信息,请参阅“触发工作流程的事件”。

# Trigger the workflow on pull request activity
on:
  release:
    # Only use the types keyword to narrow down the activity types that will trigger your workflow.
    types: [published, created, edited]

on.<push|pull_request>.<branches|tags>

使用 pushpull_request 事件时,您可以将工作流配置为在特定分支或标记上运行。 对于 pull_request 事件,只评估基础上的分支和标签。 如果只定义 tags 或只定义 branches,则影响未定义 Git ref 的事件不会触发工作流程运行。

branchesbranches-ignoretagstags-ignore 关键词接受使用 *** 通配符匹配多个分支或标记名称的 glob 模式。 更多信息请参阅“过滤器模式备忘清单”。

包括分支和标记的示例

branchestags 中定义的模式根据 Git ref 的名称进行评估。 例如,在 branches 中定义的模式 mona/octocat 将匹配 refs/heads/mona/octocat Git ref。 模式 releases/** 将匹配 refs/heads/releases/10 Git ref。

on:
  push:
    # Sequence of patterns matched against refs/heads
    branches:    
      # Push events on master branch
      - master
      # Push events to branches matching refs/heads/mona/octocat
      - 'mona/octocat'
      # Push events to branches matching refs/heads/releases/10
      - 'releases/**'
    # Sequence of patterns matched against refs/tags
    tags:        
      - v1             # Push events to v1 tag
      - v1.*           # Push events to v1.0, v1.1, and v1.9 tags

忽略分支和标记的示例

只要模式与 branches-ignore or tags-ignore 模式匹配,工作流就不会运行。 在 branches-ignoretags-ignore 中定义的模式根据 Git ref 的名称进行评估。 例如,在 branches 中定义的模式 mona/octocat 将匹配 refs/heads/mona/octocat Git ref。 branches 中的模式 releases/**-alpha 将匹配 refs/releases/beta/3-alpha Git ref。

on:
  push:
    # Sequence of patterns matched against refs/heads
    branches-ignore:
      # Push events to branches matching refs/heads/mona/octocat
      - 'mona/octocat'
      # Push events to branches matching refs/heads/releases/beta/3-alpha
      - 'releases/**-alpha'
    # Sequence of patterns matched against refs/tags
    tags-ignore:
      - v1.*           # Push events to tags v1.0, v1.1, and v1.9

排除分支和标记

您可以使用两种类型的过滤器来阻止工作流程在对标记和分支的推送和拉取请求上运行。

  • branchesbranches-ignore - 您无法对工作流程中的同一事件同时使用 branchesbranches-ignore 过滤器。 需要过滤肯定匹配的分支和排除分支时,请使用 branches 过滤器。 只需要排除分支名称时,请使用 branches-ignore 过滤器。
  • tagstags-ignore - 您无法对工作流程中的同一事件同时使用 tagstags-ignore 过滤器。 需要过滤肯定匹配的标记和排除标记时,请使用 tags 过滤器。 只需要排除标记名称时,请使用 tags-ignore 过滤器。

使用肯定和否定模式的示例

您可以使用 ! 字符排除 tagsbranches。 您定义模式事项的顺序。

  • 肯定匹配后的匹配否定模式(前缀为 !)将排除 Git 引用。
  • 否定匹配后的匹配肯定模式将再次包含 Git 引用。

以下工作流程将在到 releases/10releases/beta/mona 的推送上运行,而不会在到 releases/10-alphareleases/beta/3-alpha 的推送上运行,因为否定模式 !releases/**-alpha 后跟肯定模式。

on:
  push:
    branches:    
    - 'releases/**'
    - '!releases/**-alpha'

on.<push|pull_request>.paths

使用 pushpull_request 事件时,您可以将工作流程配置为在至少一个文件不匹配 paths-ignore 或至少一个修改的文件匹配配置的 paths 时运行。 路径过滤器不评估是否推送到标签。

paths-ignorepaths 关键词接受使用 *** 通配符匹配多个路径名称的 glob 模式。 更多信息请参阅“过滤器模式备忘清单”。

忽略路径的示例

任何时候路径名称匹配 paths-ignore 中的模式,则工作流程不会运行。 GitHub 根据路径名称评估 paths-ignore 中定义的模式。 具有以下路径过滤器的工作流程仅在 push 事件上运行,这些事件包括至少一个位于仓库根目录的 docs 目录外的文件。

on:
  push:
    paths-ignore:
    - 'docs/**'

包括路径的示例

如果至少有一个路径与 paths 过滤器中的模式匹配,工作流程将会运行。 要在每次推送 JavaScript 文件时触发构建,您可以使用通配符模式。

on:
  push:
    paths:
    - '**.js'

排除路径

您可以使用两种类型的过滤器排除路径。 不能对工作流程中的同一事件同时使用这两种过滤器。

  • paths-ignore - 只需要排除路径名称时,请使用 paths-ignore 过滤器。
  • paths - 需要过滤肯定匹配的路径和排除路径时,请使用 paths 过滤器。

使用肯定和否定模式的示例

您可以使用 ! 字符排除 paths。 您定义模式事项的顺序:

  • 肯定匹配后的匹配否定模式(前缀为 !)将排除路径。
  • 否定匹配后的匹配肯定模式将再次包含路径。

只要 push 事件包括 sub-project 目录或其子目录中的文件,此示例就会运行,除非该文件在 sub-project/docs 目录中。 例如,更改了 sub-project/index.jssub-project/src/index.js 的推送将会触发工作流程运行,但只更改 sub-project/docs/readme.md 的推送不会触发。

on:
  push:
    paths:
    - 'sub-project/**'
    - '!sub-project/docs/**'

Git 差异比较

注: 如果您推送超过 1,000 项提交, 或者如果 GitHub 因超时(差异过大)未生成差异,工作流程将始终运行。

过滤器决定是否应通过评估已更改文件,并根据 paths-ignore or paths 列表运行它们,来运行一个工作流程。 如果没有更改文件,工作流程将不会运行。

GitHub 会针对推送使用双点差异,针对拉取请求使用三点差异,生成已更改文件列表:

  • 拉取请求: 三点差异比较主题分支的最近版本与其中使用基本分支最新同步主题分支的提交。
  • 推送到现有分支: 双点差异可以直接相互比较头部和基础 SHA。
  • 推送到新分支:根据已推送最深提交的前身父项的两点差异。

更多信息请参阅“关于比较拉取请求中的分支”。

on.schedule

您可以使用 POSIX cron 语法安排工作流程在特定的 UTC 时间运行。 预定的工作流程在默认或基础分支的最新提交上运行。 您可以运行预定工作流程的最短间隔是每 5 分钟一次。

此示例每隔 15 分钟触发工作流程:

on:
  schedule:
    # * is a special character in YAML so you have to quote this string
    - cron:  '*/15 * * * *'

有关计划任务语法的更多信息请参阅“触发工作流程的事件”。

env

环境变量的 map 可用于工作流程中的所有作业和步骤。 您还可以设置仅适用于作业或步骤的环境变量。 更多信息请参阅 jobs.<job_id>.env and jobs.<job_id>.steps.env

当多个环境变量使用相同的名称定义时,GitHub 会使用最特定的环境变量。 例如,步骤中定义的环境变量在步骤执行时将覆盖名称相同的作业和工作流程变量。 为作业定义的变量在作业执行时将覆盖名称相同的工作流程变量。

示例

env:
  SERVER: production

defaults

将应用到工作流程中所有作业的默认设置的 map。 您也可以设置只可用于作业的默认设置。 更多信息请参阅 jobs.<job_id>.defaults

使用相同名称定义了多个默认设置时,GitHub 会使用最具体的默认设置。 例如,在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。

defaults.run

您可以为工作流程中的所有 run 步骤提供默认的 shellworking-directory 选项。 您也可以设置只可用于作业的 run 默认设置。 更多信息请参阅 jobs.<job_id>.defaults.run。 您不能在此关键词中使用上下文或表达式。

使用相同名称定义了多个默认设置时,GitHub 会使用最具体的默认设置。 例如,在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。

示例

defaults:
  run:
    shell: bash
    working-directory: scripts

jobs

工作流程运行包括一项或多项作业。 作业默认是并行运行。 要按顺序运行作业,您可以使用 <job_id>needs 关键词在其他作业上定义依赖项。

每个作业在 runs-on 指定的环境中运行。

在工作流程的使用限制之内可运行无限数量的作业。 更多信息请参阅“使用限制”。

如果需要查找在工作流程运行中运行的作业的唯一标识符,可以使用 GitHub ApI。 For more information, see "Workflow Jobs."

jobs.<job_id>

每项作业必须关联一个 ID。 键值 job_id 是一个字符串,其值是作业配置数据的映像。 必须将 <job_id> 替换为 jobs 对象唯一的字符串。 <job_id> 必须以字母或 _ 开头,并且只能包含字母数字字符、-_

示例

jobs:
  my_first_job:
    name: My first job
  my_second_job:
    name: My second job

jobs.<job_id>.name

作业显示在 GitHub 上的名称。

jobs.<job_id>.needs

识别在此作业运行之前必须成功完成的任何作业。 它可以是一个字符串,也可以是字符串数组。 如果某个作业失败,则所有需要它的作业都会被跳过,除非这些作业使用让该作业继续的条件语句。

示例

jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]

在此示例中,job1 必须在 job2 开始之前成功完成,而 job3 要等待 job1job2 完成。

此示例中的作业按顺序运行:

  1. job1
  2. job2
  3. job3

jobs.<job_id>.runs-on

必需运行作业的机器类型。 机器可以是 GitHub 托管的运行器或自托管的运行器。

GitHub 托管的运行器

如果使用 GitHub 托管的运行器,每个作业将在 runs-on 指定的虚拟环境的新实例中运行。

可用的 GitHub 托管的运行器类型包括:

虚拟环境YAML 工作流程标签
Windows Server 2019windows-latestwindows-2019
Ubuntu 20.04ubuntu-20.04
Ubuntu 18.04ubuntu-latestubuntu-18.04
Ubuntu 16.04ubuntu-16.04
macOS Catalina 10.15macos-latestmacos-10.15

注:Ubuntu 20.04 虚拟环境目前仅作为预览提供。 ubuntu-latest YAML 工作流程标签仍使用 Ubuntu 18.04 虚拟环境。

示例
runs-on: ubuntu-latest

更多信息请参阅“GitHub 托管的运行器的虚拟环境”。

自托管运行器

要为工作指定自托管的运行器,请在工作流程文件中使用自托管运行器标签配置 runs-on

所有自托管的运行器都有 self-hosted 标签,您可以只提供 self-hosted 标签来选择任何自托管运行器。 您也可以在一个带附加标签(例如用于特定操作系统或系统架构的标签)的数组中使用 self-hosted,只选择您指定的运行器类型。

示例
runs-on: [self-hosted, linux]

更多信息请参阅“关于自托管的运行器”和“在工作流程中使用自托管的运行器”。

jobs.<jobs_id>.outputs

作业的输出 map。 作业输出可用于所有依赖此作业的下游作业。 有关定义作业依赖项的更多信息,请参阅 jobs.<job_id>.needs

作业输出是字符串,当每个作业结束时,在运行器上评估包含表达式的作业输出。 包含密码的输出在运行器上编辑,不会发送至 GitHub 操作。

要在依赖的作业中使用作业输出, 您可以使用 needs 上下文。 更多信息请参阅“GitHub 操作 的上下文和表达式语法”。

示例

jobs:
  job1:
    runs-on: ubuntu-latest
    # Map a step output to a job output
    outputs:
      output1: ${{ steps.step1.outputs.test }}
      output2: ${{ steps.step2.outputs.test }}
    steps:
    - id: step1
      run: echo "::set-output name=test::hello"
    - id: step2
      run: echo "::set-output name=test::world"
  job2:
    runs-on: ubuntu-latest
    needs: job1
    steps:
    - run: echo ${{needs.job1.outputs.output1}} ${{needs.job1.outputs.output2}}

jobs.<job_id>.env

环境变量的 map 可用于作业中的所有步骤。 您也可以设置整个工作流程或单个步骤的环境变量。 更多信息请参阅 envjobs.<job_id>.steps.env

当多个环境变量使用相同的名称定义时,GitHub 会使用最特定的环境变量。 例如,步骤中定义的环境变量在步骤执行时将覆盖名称相同的作业和工作流程变量。 为作业定义的变量在作业执行时将覆盖名称相同的工作流程变量。

示例

jobs:
  job1:
    env:
      FIRST_NAME: Mona

jobs.<job_id>.defaults

将应用到作业中所有步骤的默认设置的 map。 您也可以设置整个工作流程的默认设置。 更多信息请参阅 defaults

使用相同名称定义了多个默认设置时,GitHub 会使用最具体的默认设置。 例如,在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。

jobs.<job_id>.defaults.run

为作业中的所有 run 步骤提供默认的 shellworking-directory。 此部分不允许上下文和表达式。

您可以为作业中的所有 run 步骤提供默认的 shellworking-directory 选项。 您也可以为整个工作流程设置 run 的默认设置。 更多信息请参阅 jobs.defaults.run。 您不能在此关键词中使用上下文或表达式。

使用相同名称定义了多个默认设置时,GitHub 会使用最具体的默认设置。 例如,在作业中定义的默认设置将覆盖在工作流程中定义的同名默认设置。

示例

jobs:
  job1:
    runs-on: ubuntu-latest
    defaults:
      run:
        shell: bash
        working-directory: scripts

jobs.<job_id>.if

您可以使用 if 条件阻止作业在条件得到满足之前运行。 您可以使用任何支持上下文和表达式来创建条件。

if 条件下使用表达式时,可以省略表达式语法 (${{ }}),因为 GitHub 会自动将 if 条件作为表达式求值。 更多信息请参阅“GitHub 操作 的上下文和表达式语法”。

jobs.<job_id>.steps

作业包含一系列任务,称为 steps。 步骤可以运行命令、运行设置任务,或者运行您的仓库、公共仓库中的操作或 Docker 注册表中发布的操作。 并非所有步骤都会运行操作,但所有操作都会作为步骤运行。 每个步骤在运行器环境中以其自己的进程运行,且可以访问工作区和文件系统。 因为步骤以自己的进程运行,所以步骤之间不会保留环境变量的更改。 GitHub 提供内置的步骤来设置和完成作业。

在工作流程的使用限制之内可运行无限数量的步骤。 更多信息请参阅“使用限制”。

示例

name: Greeting from Mona

on: push

jobs:
  my-job:
    name: My Job
    runs-on: ubuntu-latest
    steps:
    - name: Print a greeting
      env:
        MY_VAR: Hi there! My name is
        FIRST_NAME: Mona
        MIDDLE_NAME: The
        LAST_NAME: Octocat
      run: |
        echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.

jobs.<job_id>.steps.id

步骤的唯一标识符。 您可以使用 id 引用上下文中的步骤。 更多信息请参阅“GitHub 操作 的上下文和表达式语法”。

jobs.<job_id>.steps.if

您可以使用 if 条件阻止步骤在条件得到满足之前运行。 您可以使用任何支持上下文和表达式来创建条件。

if 条件下使用表达式时,可以省略表达式语法 (${{ }}),因为 GitHub 会自动将 if 条件作为表达式求值。 更多信息请参阅“GitHub 操作 的上下文和表达式语法”。

使用上下文的示例

此步骤仅在事件类型为 pull_request 并且事件操作为 unassigned 时运行。

steps:
 - name: My first step
   if: ${{ github.event_name == 'pull_request' && github.event.action == 'unassigned' }}
   run: echo This event is a pull request that had an assignee removed.
使用状态检查功能的示例

my backup step 仅在作业的上一步失败时运行。 更多信息请参阅“GitHub 操作 的上下文和表达式语法”。

steps:
  - name: My first step
    uses: monacorp/action-name@master
  - name: My backup step
    if: ${{ failure() }}
    uses: actions/heroku@master

jobs.<job_id>.steps.name

步骤显示在 GitHub 上的名称。

jobs.<job_id>.steps.uses

选择要作为作业中步骤的一部分运行的操作。 操作是一种可重复使用的代码单位。 您可以使用工作流程所在仓库中、公共仓库中或发布 Docker 容器映像中定义的操作。

强烈建议指定 Git ref、SHA 或 Docker 标记编号来包含所用操作的版本。 如果不指定版本,在操作所有者发布更新时可能会中断您的工作流程或造成非预期的行为。

  • 使用已发行操作版本的 SHA 对于稳定性和安全性是最安全的。
  • 使用特定主要操作版本可在保持兼容性的同时接收关键修复和安全补丁。 还可确保您的工作流程继续工作。
  • 使用操作的 master 分支可能很方便,但如果有人新发布具有突破性更改的主要版本,您的工作流程可能会中断。

有些操作要求必须通过 with 关键词设置输入。 请查阅操作的自述文件,确定所需的输入。

操作为 JavaScript 文件或 Docker 容器。 如果您使用的操作是 Docker 容器,则必须在 Linux 环境中运行作业。 更多详情请参阅 runs-on

使用版本化操作的示例
steps:    
  # Reference a specific commit
  - uses: actions/setup-node@74bc508
  # Reference the major version of a release
  - uses: actions/setup-node@v1
  # Reference a minor version of a release
  - uses: actions/setup-node@v1.2
  # Reference a branch
  - uses: actions/setup-node@master
使用公共操作的示例

{owner}/{repo}@{ref}

您可以指定公共 GitHub 仓库中特定的分支、引用或 SHA。

jobs:
  my_first_job:
    steps:
      - name: My first step
        # Uses the master branch of a public repository
        uses: actions/heroku@master
      - name: My second step
        # Uses a specific version tag of a public repository
        uses: actions/aws@v2.0.1
在子目录中使用公共操作的示例

{owner}/{repo}/{path}@{ref}

公共 GitHub 仓库中特定分支、引用或 SHA 上的子目录。

jobs:
  my_first_job:
    steps:
      - name: My first step
        uses: actions/aws/ec2@master
使用工作流程所在仓库中操作的示例

./path/to/dir

包含工作流程的仓库中操作的目录路径。 在使用操作之前,必须检出仓库。

jobs:
  my_first_job:
    steps:
      - name: Check out repository
        uses: actions/checkout@v2
      - name: Use local my-action
        uses: ./.github/actions/my-action
使用 Docker 中枢操作的示例

docker://{image}:{tag}

Docker 中枢上发布的 Docker 映像。

jobs:
  my_first_job:
    steps:
      - name: My first step
        uses: docker://alpine:3.8
使用 Docker 公共注册表操作的示例

docker://{host}/{image}:{tag}

公共注册表中的 Docker 映像。

jobs:
  my_first_job:
    steps:
      - name: My first step
        uses: docker://gcr.io/cloud-builders/gradle

jobs.<job_id>.steps.run

使用操作系统 shell 运行命令行程序。 如果不提供 name,步骤名称将默认为 run 命令中指定的文本。

命令默认使用非登录 shell 运行。 您可以选择不同的 shell,也可以自定义用于运行命令的 shell。 更多信息请参阅“使用指定 shell”。

每个 run 关键词代表运行器环境中一个新的进程和 shell。 当您提供多行命令时,每行都在同一个 shell 中运行。 例如:

  • 单行命令:

    - name: Install Dependencies
      run: npm install
    
  • 多行命令:

    - name: Clean install dependencies and build
      run: |
        npm ci
        npm run build
    

使用 working-directory 关键词,您可以指定运行命令的工作目录位置。

- name: Clean temp directory
  run: rm -rf *
  working-directory: ./temp
使用指定 shell

您可以使用 shell 关键词覆盖运行器操作系统中默认的 shell 设置。 您可以使用内置的 shell 关键词,也可以自定义 shell 选项集。

支持的平台shell 参数描述内部运行命令
所有bash非 Windows 平台上回退到 sh 的默认 shell。 指定 Windows 上的 bash shell 时,将使用 Git for Windows 随附的 bash shel。bash --noprofile --norc -eo pipefail {0}
所有pwshPowerShell Core。 GitHub 将扩展名 .ps1 附加到您的脚本名称。pwsh -command "& '{0}'"
所有python执行 python 命令。python {0}
Linux / macOSsh未提供 shell 且 在路径中找不到 bash 时的非 Windows 平台的后退行为。sh -e {0}
WindowscmdGitHub 将扩展名 .cmd 附加到您的脚本名称并替换 {0}%ComSpec% /D /E:ON /V:OFF /S /C "CALL "{0}"".
Windowspowershell这是 Windows 上使用的默认 shell。 Desktop PowerShell。 GitHub 将扩展名 .ps1 附加到您的脚本名称。powershell -command "& '{0}'".
使用 bash 运行脚本的示例
steps:
  - name: Display the path
    run: echo $PATH
    shell: bash
使用 Windows cmd 运行脚本的示例
steps:
  - name: Display the path
    run: echo %PATH%
    shell: cmd
使用 PowerShell Core 运行脚本的示例
steps:
  - name: Display the path
    run: echo ${env:PATH}
    shell: pwsh
运行 python 脚本的示例
steps:
  - name: Display the path
    run: |
      import os
      print(os.environ['PATH'])
    shell: python
自定义 shell

您可以使用 command […options] {0} [..more_options]shell 值设置为模板字符串。 GitHub 将字符串的第一个用空格分隔的词解释为命令,并在 {0} 处插入临时脚本的文件名。

退出代码和错误操作首选项

至于内置的 shell 关键词,我们提供由 GitHub 托管运行程序执行的以下默认值。 在运行 shell 脚本时,您应该使用这些指南。

  • bash/sh

    • 使用 set -e o pipefail 的快速失败行为:bash 和内置 shell 的默认值。 它还是未在非 Windows 平台上提供选项时的默认值。
    • 您可以向 shell 选项提供模板字符串,以退出快速失败并接管全面控制权。 例如 bash {0}
    • sh 类 shell 使用脚本中最后执行的命令的退出代码退出,也是操作的默认行为。 运行程序将根据此退出代码将步骤的状态报告为失败/成功。
  • powershell/pwsh

    • 可能时的快速失败行为。 对于 pwshpowershell 内置 shell,我们将 $ErrorActionPreference = 'stop' 附加到脚本内容。
    • 我们将 if ((Test-Path -LiteralPath variable:\LASTEXITCODE)) { exit $LASTEXITCODE } 附加到 powershell 脚本,以使操作状态反映脚本的最后一个退出代码。
    • 用户可随时通过不使用内置 shell 并提供类似如下的自定义 shell 选项来退出:pwsh -File {0}powershell -Command "& '{0}'",具体取决于需求。
  • cmd

    • 除了编写脚本来检查每个错误代码并相应地响应之外,似乎没有办法完全选择快速失败行为。 由于我们默认不能实际提供该行为,因此您需要将此行为写入脚本。
    • cmd.exe 在退出时带有其执行的最后一个程序的错误等级,并且会将错误代码返回到运行程序。 此行为在内部与上一个 shpwsh 默认行为一致,是 cmd.exe 的默认值,所以此行为保持不变。

jobs.<job_id>.steps.with

输入参数的 map 由操作定义。 每个输入参数都是一个键/值对。 输入参数被设置为环境变量。 该变量的前缀为 INPUT_,并转换为大写。

示例

定义 hello_world 操作所定义的三个输入参数(first_namemiddle_namelast_name)。 这些输入变量将被 hello-world 操作作为 INPUT_FIRST_NAMEINPUT_MIDDLE_NAMEINPUT_LAST_NAME 环境变量使用。

jobs:
  my_first_job:
    steps:
      - name: My first step
        uses: actions/hello_world@master
        with:
          first_name: Mona
          middle_name: The
          last_name: Octocat      

jobs.<job_id>.steps.with.args

string 定义 Docker 容器的输入。 GitHub 在容器启动时将 args 传递到容器的 ENTRYPOINT。 此参数不支持 array of strings

示例
steps:
  - name: Explain why this job ran
    uses: monacorp/action-name@master
    with:
      entrypoint: /bin/echo
      args: The ${{ github.event_name }} event triggered this step.

args 用来代替 Dockerfile 中的 CMD 指令。 如果在 Dockerfile 中使用 CMD,请遵循按偏好顺序排序的指导方针:

  1. 在操作的自述文件中记录必要的参数,并在 CMD 指令的中忽略它们。
  2. 使用默认值,允许不指定任何 args 即可使用操作。
  3. 如果操作显示 --help 标记或类似项,请将其用作默认值,以便操作自行记录。

jobs.<job_id>.steps.with.entrypoint

覆盖 Dockerfile 中的 Docker ENTRYPOINT,或在未指定时设置它。 与包含 shell 和 exec 表单的 Docker ENTRYPOINT 指令不同,entrypoint 关键词只接受定义要运行的可执行文件的单个字符串。

示例
steps:
  - name: Run a custom command
    uses: monacorp/action-name@master
    with:
      entrypoint: /a/different/executable

entrypoint 关键词旨在用于 Docker 容器操作,但您也可以将其用于未定义任何输入的 JavaScript 操作。

jobs.<job_id>.steps.env

设置供步骤用于运行器环境的环境变量。 您也可以设置整个工作流程或某个作业的环境变量。 更多信息请参阅 envjobs.<job_id>.env

当多个环境变量使用相同的名称定义时,GitHub 会使用最特定的环境变量。 例如,步骤中定义的环境变量在步骤执行时将覆盖名称相同的作业和工作流程变量。 为作业定义的变量在作业执行时将覆盖名称相同的工作流程变量。

公共操作可在自述文件中指定预期的环境变量。 如果要在环境变量中设置密码,必须使用 secrets 上下文进行设置。 更多信息请参阅“使用环境变量”和“GitHub 操作 的上下文和表达式”。

示例
steps:
  - name: My first action
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      FIRST_NAME: Mona
      LAST_NAME: Octocat

jobs.<job_id>.steps.continue-on-error

防止步骤失败时作业也会失败。 设置为 true 以允许在此步骤失败时作业能够通过。

jobs.<job_id>.steps.timeout-minutes

终止进程之前运行该步骤的最大分钟数。

jobs.<job_id>.timeout-minutes

在 GitHub 自动取消运行之前可让作业运行的最大分钟数。 默认值:360

jobs.<job_id>.strategy

策略创建作业的构建矩阵。 您可以定义要在其中运行每项作业的环境的不同变种。

jobs.<job_id>.strategy.matrix

您可以定义不同作业配置的矩阵。 矩阵允许您通过在单个作业定义中执行变量替换来创建多个作业。 例如,可以使用矩阵为多个受支持的编程语言、操作系统或工具版本创建作业。 矩阵重新使用作业的配置,并为您配置的每个矩阵创建作业。

作业矩阵在每次工作流程运行时最多可生成 256 个作业。 此限制也适用于自托管运行器。

您在 matrix 中定义的每个选项都有键和值。 定义的键将成为 matrix 上下文中的属性,您可以在工作流程文件的其他区域中引用该属性。 例如,如果定义包含操作系统数组的键 os,您可以使用 matrix.os 属性作为 runs-on 关键字的值,为每个操作系统创建一个作业。 更多信息请参阅“GitHub 操作 的上下文和表达式语法”。

定义 matrix 事项的顺序。 定义的第一个选项将是工作流程中运行的第一个作业。

使用 Node.js 多个版本运行的示例

您可以提供配置选项阵列来指定矩阵。 例如,如果运行器支持 Node.js 版本 6、8 和 10,则您可以在 matrix 中指定这些版本的阵列。

此示例通过设置三个 Node.js 版本阵列的 node 键创建三个作业的矩阵。 为使用矩阵,示例将 matrix.node 上下文属性设置为 setup-node 操作的输入参数 node-version。 因此,将有三个作业运行,每个使用不同的 Node.js 版本。

strategy:
  matrix:
    node: [6, 8, 10]
steps:
  # Configures the node version used on GitHub-hosted runners
  - uses: actions/setup-node@v1
    with:
      # The Node.js version to configure
      node-version: ${{ matrix.node }}

setup-node 操作是在使用 GitHub 托管的运行器时建议用于配置 Node.js 版本的方式。 更多信息请参阅 setup-node 操作。

使用多个操作系统的示例

您可以创建矩阵以在多个运行器操作系统上运行工作流程。 您也可以指定多个矩阵配置。 此示例创建包含 6 个作业的矩阵:

  • os 阵列中指定了 2 个操作系统
  • node 阵列中指定了 3 个 Node.js 版本

定义操作系统矩阵时,必须将 runs-on 的值设置为您定义的 matrix.os 上下文属性。

runs-on: ${{ matrix.os }}
strategy:
  matrix:
    os: [ubuntu-16.04, ubuntu-18.04]
    node: [6, 8, 10]
steps:
  - uses: actions/setup-node@v1
    with:
      node-version: ${{ matrix.node }}

要查找 GitHub 托管的运行器支持的配置选项,请参阅“GitHub 托管的运行器的虚拟环境”。

在组合中包含附加值的示例

您可以将额外的配置选项添加到已经存在的构建矩阵作业中。 例如,如果要在作业使用 windows-latestnode 的版本 4 运行时使用 npm 的特定版本,您可以使用 include 指定该附加选项。

runs-on: ${{ matrix.os }}
strategy:
  matrix:
    os: [macos-latest, windows-latest, ubuntu-18.04]
    node: [4, 6, 8, 10]
    include:
      # includes a new variable of npm with a value of 2
      # for the matrix leg matching the os and version
      - os: windows-latest
        node: 4
        npm: 2
包括新组合的示例

您可以使用 include 将新作业添加到构建矩阵中。 任何不匹配包含配置都会添加到矩阵中。 例如,如果您想要使用 node 版本 12 在多个操作系统上构建,但在 Ubuntu 上需要一个使用节点版本 13 的额外实验性作业,则可使用 include 指定该额外作业。

runs-on: ${{ matrix.os }}
strategy:
  matrix:
    node: [12]
    os: [macos-latest, windows-latest, ubuntu-18.04]
    include:
      - node: 13
        os: ubuntu-18.04
        experimental: true
从矩阵中排除配置的示例

您可以使用 exclude 选项删除构建矩阵中定义的特定配置。 使用 exclude 删除由构建矩阵定义的作业。 作业数量是您提供的数组中所包括的操作系统 (os) 数量减去所有减项 (exclude) 后的叉积。

runs-on: ${{ matrix.os }}
strategy:
  matrix:
    os: [macos-latest, windows-latest, ubuntu-18.04]
    node: [4, 6, 8, 10]
    exclude:
      # excludes node 4 on macOS
      - os: macos-latest
        node: 4

注意:所有 include 组合在 exclude 后处理。 这允许您使用 include 添加回以前排除的组合。

jobs.<job_id>.strategy.fail-fast

设置为 true 时,如果任何 matrix 作业失败,GitHub 将取消所有进行中的作业。 默认值:true

jobs.<job_id>.strategy.max-parallel

使用 matrix 作业策略时可同时运行的最大作业数。 默认情况下,GitHub 将最大化并发运行的作业数量,具体取决于 GitHub 托管虚拟机上可用的运行程序。

strategy:
  max-parallel: 2

jobs.<job_id>.continue-on-error

防止工作流程运行在作业失败时失败。 设置为 true 以允许工作流程运行在此作业失败时通过。

防止特定失败的矩阵作业导致工作流程运行失败的示例

您可以允许作业矩阵中的特定任务失败,但工作流程运行不失败。 例如, 只允许 node 设置为 13 的实验性作业失败,而不允许工作流程运行失败。

runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.experimental }}
strategy:
  fail-fast: false
  matrix:
    node: [11, 12]
    os: [macos-latest, ubuntu-18.04]
    experimental: [false]
    include:
      - node: 13
        os: ubuntu-18.04
        experimental: true

jobs.<job_id>.container

用于运行作业中尚未指定容器的任何步骤的容器。 如有步骤同时使用脚本和容器操作,则容器操作将运行为同一网络上使用相同卷挂载的同级容器。

若不设置 container,所有步骤将直接在 runs-on 指定的主机上运行,除非步骤引用已配置为在容器中运行的操作。

示例

jobs:
  my_job:
    container:
      image: node:10.16-jessie
      env:
        NODE_ENV: development
      ports:
        - 80
      volumes:
        - my_docker_volume:/volume_mount
      options: --cpus 1

只指定容器映像时,可以忽略 image 关键词。

jobs:
  my_job:
    container: node:10.16-jessie

jobs.<job_id>.container.image

要用作运行操作的容器的 Docker 图像。 值可以是 Docker 中枢映像名称或公共 Docker 注册表名称。

jobs.<job_id>.container.env

设置容器中环境变量的 map

jobs.<job_id>.container.ports

设置要在容器上显示的端口 array

jobs.<job_id>.container.volumes

设置要使用的容器卷的 array。 您可以使用卷分享作业中服务或其他步骤之间的数据。 可以指定命名的 Docker 卷、匿名的 Docker 卷或主机上的绑定挂载。

要指定卷,需指定来源和目标路径:

<source>:<destinationPath>.

<source> 是主机上的卷名称或绝对路径,<destinationPath> 是容器中的绝对路径。

示例
volumes:
  - my_docker_volume:/volume_mount
  - /data/my_data
  - /source/directory:/destination/directory

jobs.<job_id>.container.options

附加 Docker 容器资源选项。 有关选项列表,请参阅“docker create options”。

jobs.<job_id>.services

注:如果您的工作流程使用 Docker 容器操作或服务容器,则必须使用 Linux 运行器:

  • 如果您要使用 GitHub 托管的运行器,则必须使用 ubuntu-latest 运行器。
  • 如果您要使用自托管运行器,则必须使用 Linux 机器作为运行器,并且必须安装 Docker。

用于为工作流程中的作业托管服务容器。 服务容器可用于创建数据库或缓存服务(如 Redis)。 运行器自动创建 Docker 网络并管理服务容器的生命周期。

如果将作业配置为在容器中运行,或者步骤使用容器操作,则无需映射端口来访问服务或操作。 Docker 会自动在同一个 Docker 用户定义的桥接网络上的容器之间显示所有端口。 您可以直接引用服务容器的主机名。 主机名自动映射到为工作流程中的服务配置的标签名称。

如果配置作业直接在运行器机器上运行,且您的步骤不使用容器操作,则必须将任何必需的 Docker 服务容器端口映射到 Docker 主机(运行器机器)。 您可以使用 localhost 和映射的端口访问服务容器。

有关网络服务容器之间差异的更多信息,请参阅“关于服务容器”。

使用 localhost 的示例

此示例创建分别用于 nginx 和 redis 的两项服务。 指定 Docker 主机端口但不指定容器端口时,容器端口将随机分配给空闲端口。 GitHub 在 ${{job.services.<service_name>.ports}} 上下文中设置分配的容器端口。 在此示例中,可以使用 ${{ job.services.nginx.ports['8080'] }}${{ job.services.redis.ports['6379'] }} 上下文访问服务容器端口。

services:
  nginx:
    image: nginx
    # Map port 8080 on the Docker host to port 80 on the nginx container
    ports:
      - 8080:80
  redis:
    image: redis
    # Map TCP port 6379 on Docker host to a random free port on the Redis container
    ports:
      - 6379/tcp

jobs.<job_id>.services.image

要用作运行操作的服务容器的 Docker 图像。 值可以是 Docker 基本映像名称或公共 Docker 中枢或注册表。

jobs.<job_id>.services.env

在服务容器中设置环境变量的 map

jobs.<job_id>.services.ports

设置要在服务容器上显示的端口 array

jobs.<job_id>.services.volumes

设置要使用的服务容器卷的 array。 您可以使用卷分享作业中服务或其他步骤之间的数据。 可以指定命名的 Docker 卷、匿名的 Docker 卷或主机上的绑定挂载。

要指定卷,需指定来源和目标路径:

<source>:<destinationPath>.

<source> 是主机上的卷名称或绝对路径,<destinationPath> 是容器中的绝对路径。

示例
volumes:
  - my_docker_volume:/volume_mount
  - /data/my_data
  - /source/directory:/destination/directory

jobs.<job_id>.services.options

附加 Docker 容器资源选项。 有关选项列表,请参阅“docker create options”。

过滤器模式备忘清单

您可以在路径、分支和标记过滤器中使用特殊字符。

  • *: 匹配零个或多个字符,但不匹配 / 字符。 例如,Octo* 匹配 Octocat
  • **: 匹配零个或多个任何字符。
  • ?:匹配零个或一个字符。 例如 Octoc?t 匹配 Octocat
  • +:匹配一个或多个继续字符。
  • [] 匹配列在括号中或包含在范围内的一个字符。 范围只能包含 a-zA-Z0-9。 例如,范围 [0-9a-f] 匹配任何数字或小写字母。 例如,[CB]at 匹配 CatBat[1-2]00 匹配 100200
  • !:在模式开始时,它将否定以前的正模式。 如果不是第一个字符,它就没有特殊的意义。

字符 *[! 是 YAML 中的特殊字符。 如果模式以 *[! 开头,必须用引号括住模式。

# Valid
- '**/README.md'

# Invalid - creates a parse error that
# prevents your workflow from running.
- **/README.md

有关分支、标记和路径过滤语法的更多详细,请参阅 "on.<push|pull_request>.<branches|tags>" 和 "on.<push|pull_request>.paths"。

匹配分支和标记的模式

模式Description示例匹配
功能/** 通配符匹配任何字符,但不匹配斜杠 (/)。-feature/my-branch
-feature/your-branch
功能/**** 通配符匹配任何字符,包括分支和标记名称中的斜杠 (/)。-feature/beta-a/my-branch
-feature/your-branch
-feature/mona/the/octocat
-master
-releases/mona-the-octcat
匹配分支或标记名称的确切名称。-master
-releases/mona-the-octocat
'*'匹配所有不包含斜杠 (/) 的分支和标记名称。 * 字符是 YAML 中的特殊字符。 当模式以 * 开头时,您必须使用引号。-master
-releases
'**'匹配所有分支和标记名称。 这是不使用 branches or tags 过滤器时的默认行为。-all/the/branches
-every/tag
'*功能'* 字符是 YAML 中的特殊字符。 当模式以 * 开头时,您必须使用引号。-mona-feature
-feature
-ver-10-feature
v2*匹配以 v2 开头的分支和标记名称。-v2
-v2.0
-v2.9
v[12].[0-9]+.[0-9]+将所有语义版本控制标记与主要版本 1 或 2 匹配-v1.10.1
-v2.0.0

匹配文件路径的模式

路径模式必须匹配整个路径,并从仓库根开始。

模式匹配描述示例匹配
'*'* 通配符匹配任何字符,但不匹配斜杠 (/)。 * 字符是 YAML 中的特殊字符。 当模式以 * 开头时,您必须使用引号。-README.md
-server.rb
'*.jsx?'? 个字符匹配零个或一个前缀字符。-page.js
-page.jsx
'**'The ** 通配符匹配任何字符,包括斜杠 (/)。 这是不使用 path 过滤器时的默认行为。-all/the/files.md
'*.js'* 通配符匹配任何字符,但不匹配斜杠 (/)。 匹配仓库根目录上的所有 .js 文件。-app.js
-index.js
'**.js'匹配仓库中的所有 .js 文件。-index.js
-js/index.js
-src/js/app.js
文档/*仓库根目录下 docs 根目录中的所有文件。-docs/README.md
-docs/file.txt
文档/**仓库根目录下 /docs 目录中的任何文件。-docs/README.md
-docs/mona/octocat.txt
docs/**/*.mddocs 目录中任意位置具有 .md 后缀的文件。-docs/README.md
-docs/mona/hello-world.md
-docs/a/markdown/file.md
'**/文档/**'仓库中任意位置 docs 目录下的任何文件。-/docs/hello.md
-dir/docs/my-file.txt
-space/docs/plan/space.doc
'**/README.md'仓库中任意位置的 README.md 文件。-README.md
-js/README.md
'**/*src/**'仓库中任意位置具有 src 后缀的文件夹中的任何文件。-a/src/app.js
-my-src/code/js/app.js
'**/*-post.md'仓库中任意位置具有后缀 -post.md 的文件。-my-post.md
-path/their-post.md
'**/migrate-*.sql'仓库中任意位置具有前缀 migrate- 和后缀 .sql 的文件。-migrate-10909.sql
-db/migrate-v1.0.sql
-db/sept/migrate-v1.sql
-*.md
-!README.md
模式前使用感叹号 (!) 对其进行否定。 当文件与模式匹配并且也匹配文件后面定义的否定模式时,则不包括该文件。-hello.md
Does not match
-README.md
-docs/hello.md
-*.md
-!README.md
-README*
按顺序检查模式。 否定前一个模式的模式将重新包含文件路径。-hello.md
-README.md
-README.doc

问问别人

找不到要找的内容?

联系我们