跳到主要内容

在变量中存储信息

GitHub 为每个 GitHub Actions 工作流运行设置默认变量。您还可以设置自定义变量以用于单个工作流或多个工作流。

关于变量

变量提供了一种存储和重用非敏感配置信息的方法。您可以将任何配置数据(例如编译器标志、用户名或服务器名称)存储为变量。变量在运行工作流的运行器机器上进行插值。在操作或工作流步骤中运行的命令可以创建、读取和修改变量。

您可以设置您自己的自定义变量或使用 GitHub 自动设置的默认环境变量。有关更多信息,请参阅“默认环境变量”。

您可以通过两种方式设置自定义变量。

警告

默认情况下,变量会在构建输出中未经掩码地呈现。如果您需要为敏感信息(例如密码)提供更高的安全性,请改用密钥。有关更多信息,请参阅“在 GitHub Actions 中使用密钥”。

为单个工作流定义环境变量

要为单个工作流设置自定义环境变量,您可以使用工作流文件中的env键来定义它。通过这种方法设置的自定义变量的范围仅限于其定义所在的元素。您可以定义作用域为以下内容的变量:

YAML
name: Greeting on variable day

on:
  workflow_dispatch

env:
  DAY_OF_WEEK: Monday

jobs:
  greeting_job:
    runs-on: ubuntu-latest
    env:
      Greeting: Hello
    steps:
      - name: "Say Hello Mona it's Monday"
        run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
        env:
          First_Name: Mona

您可以使用运行器环境变量或上下文访问env变量值。上面的示例显示了三个自定义变量作为运行器环境变量在echo命令中使用:$DAY_OF_WEEK$Greeting$First_Name。这些变量的值分别在工作流、作业和步骤级别设置和限定作用域。这些变量的插值在运行器上进行。

工作流或引用的操作的run步骤中的命令由您在运行器上使用的 shell 处理。工作流其他部分中的指令由 GitHub Actions 处理,不会发送到运行器。您可以在run步骤中使用运行器环境变量或上下文,但在不会发送到运行器的部分工作流中,必须使用上下文来访问变量值。有关更多信息,请参阅“使用上下文访问变量值”。

由于运行器环境变量插值是在工作流作业发送到运行器机器后完成的,因此您必须使用运行器上使用的 shell 的适当语法。在此示例中,工作流指定ubuntu-latest。默认情况下,Linux 运行器使用 bash shell,因此您必须使用语法$NAME。默认情况下,Windows 运行器使用 PowerShell,因此您将使用语法$env:NAME。有关 shell 的更多信息,请参阅“GitHub Actions 的工作流语法”。

环境变量的命名约定

设置环境变量时,您不能使用任何默认环境变量名称。有关默认环境变量的完整列表,请参阅下面“默认环境变量”。如果您尝试覆盖这些默认变量之一的值,则该赋值将被忽略。

注意

您可以通过在步骤中使用run: env,然后检查步骤的输出,列出工作流步骤可用的全部环境变量集。

为多个工作流定义配置变量

注意

GitHub Actions 的配置变量处于公开预览阶段,可能会发生变化。

您可以创建配置变量以跨多个工作流使用,并且可以在组织仓库环境级别定义它们。

例如,您可以使用配置变量在组织级别为传递给构建工具的参数设置默认值,然后允许仓库所有者根据具体情况覆盖这些参数。

定义配置变量后,它们会自动在vars上下文中可用。有关更多信息,请参阅“使用vars上下文访问配置变量值”。

配置变量优先级

如果同一名称的变量存在于多个级别,则最低级别的变量优先。例如,如果组织级别变量与仓库级别变量具有相同的名称,则仓库级别变量优先。同样,如果组织、仓库和环境都具有相同名称的变量,则环境级别变量优先。

对于可复用的工作流,将使用调用者工作流仓库中的变量。包含被调用工作流的仓库中的变量不会提供给调用者工作流。

配置变量的命名约定

以下规则适用于配置变量名称:

  • 名称只能包含字母数字字符([a-z][A-Z][0-9])或下划线(_)。不允许使用空格。
  • 名称不能以GITHUB_前缀开头。
  • 名称不能以数字开头。
  • 名称不区分大小写。
  • 名称在其创建的级别必须唯一。

为仓库创建配置变量

要在 GitHub 上为个人帐户仓库创建密钥或变量,您必须是仓库所有者。要在 GitHub 上为组织仓库创建密钥或变量,您必须具有admin访问权限。最后,要通过 REST API 为个人帐户仓库或组织仓库创建密钥或变量,您必须具有协作者访问权限。

  1. 在 GitHub 上,导航到仓库的主页。

  2. 在您的仓库名称下,单击 设置。如果您看不到“设置”选项卡,请选择下拉菜单,然后单击设置

    Screenshot of a repository header showing the tabs. The "Settings" tab is highlighted by a dark orange outline.

  3. 在侧边栏的“安全”部分,选择 密钥和变量,然后单击操作

  4. 单击变量选项卡。

    Screenshot of the "Actions secrets and variables" page. The "Variables" tab is outlined in dark orange.

  5. 单击新建仓库变量

  6. 名称字段中,输入变量的名称。

  7. 字段中,输入变量的值。

  8. 单击添加变量

为环境创建配置变量

要在个人帐户仓库中为环境创建密钥或变量,您必须是仓库所有者。要在组织仓库中为环境创建密钥或变量,您必须具有admin访问权限。有关环境的更多信息,请参阅“管理部署环境”。

  1. 在 GitHub 上,导航到仓库的主页。

  2. 在您的仓库名称下,单击 设置。如果您看不到“设置”选项卡,请选择下拉菜单,然后单击设置

    Screenshot of a repository header showing the tabs. The "Settings" tab is highlighted by a dark orange outline.

  3. 在左侧边栏中,单击环境

  4. 单击要向其中添加变量的环境。

  5. 环境变量下,单击添加变量

  6. 名称字段中,输入变量的名称。

  7. 字段中,输入变量的值。

  8. 单击添加变量

为组织创建配置变量

注意

对于 GitHub Free,私有仓库无法访问组织级别的密钥和变量。有关升级 GitHub 订阅的更多信息,请参阅“升级您的帐户计划”。

在组织中创建密钥或变量时,您可以使用策略来限制仓库的访问权限。例如,您可以授予对所有仓库的访问权限,或仅限于私有仓库或指定的仓库列表。

组织所有者可以在组织级别创建密钥或变量。

  1. 在 GitHub 上,导航到组织的主页。

  2. 在您的组织名称下,单击 设置。如果您看不到“设置”选项卡,请选择下拉菜单,然后单击设置

    Screenshot of the tabs in an organization's profile. The "Settings" tab is outlined in dark orange.

  3. 在侧边栏的“安全”部分,选择 密钥和变量,然后单击操作

  4. 单击变量选项卡。

    Screenshot of the "Actions secrets and variables" page. The "Variables" tab is outlined in dark orange.

  5. 单击新建组织变量

  6. 名称字段中,输入变量的名称。

  7. 字段中,输入变量的值。

  8. 仓库访问下拉列表中,选择访问策略。

  9. 单击添加变量

配置变量的限制

单个变量的大小限制为 48 KB。

您可以存储最多 1,000 个组织变量、每个仓库 500 个变量和每个环境 100 个变量。组织和仓库变量的总组合大小限制为每个工作流运行 256 KB。

在仓库中创建的工作流可以访问以下数量的变量:

  • 最多 500 个仓库变量,如果仓库变量的总大小小于 256 KB。如果仓库变量的总大小超过 256 KB,则只有低于限制的仓库变量可用(按变量名称字母顺序排序)。
  • 最多 1,000 个组织变量,如果仓库和组织变量的总组合大小小于 256 KB。如果组织和仓库变量的总组合大小超过 256 KB,则只有低于该限制的组织变量可用(在考虑仓库变量后,并按变量名称字母顺序排序)。
  • 最多 100 个环境级别变量。

注意

环境级别变量不计入 256 KB 的总大小限制。如果您超过了仓库和组织变量的组合大小限制,并且仍然需要其他变量,则可以使用环境并在环境中定义其他变量。

使用上下文访问变量值

上下文是访问有关工作流运行、变量、运行器环境、作业和步骤的信息的一种方法。有关更多信息,请参阅“访问有关工作流运行的上下文信息”。您可以将许多其他上下文用于工作流中的各种目的。有关您可以在工作流中使用特定上下文的详细信息,请参阅“访问有关工作流运行的上下文信息”。

您可以使用env上下文访问环境变量值,使用vars上下文访问配置变量值。

使用env上下文访问环境变量值

除了运行器环境变量之外,GitHub Actions 还允许您使用上下文设置和读取env键值。环境变量和上下文旨在用于工作流的不同点。

工作流或引用的操作中的run步骤由运行器处理。因此,您可以在这里使用运行器环境变量,并使用您在运行器上使用的 shell 的适当语法 - 例如,对于 Linux 运行器上的 bash shell 使用$NAME,或者对于 Windows 运行器上的 PowerShell 使用$env:NAME。在大多数情况下,您还可以使用上下文和语法${{ CONTEXT.PROPERTY }}来访问相同的值。不同之处在于,上下文将在作业发送到运行器之前被插值并替换为字符串。

但是,你不能在由 GitHub Actions 处理且未发送到运行器的ワークフロー的部分中使用运行器环境变量。而必须使用上下文。例如,用于确定作业或步骤是否发送到运行器的if条件语句,始终由 GitHub Actions 处理。因此,必须在if条件语句中使用上下文来访问变量的值。

YAML
name: Conditional env variable

on: workflow_dispatch

env:
  DAY_OF_WEEK: Monday

jobs:
  greeting_job:
    runs-on: ubuntu-latest
    env:
      Greeting: Hello
    steps:
      - name: "Say Hello Mona it's Monday"
        if: ${{ env.DAY_OF_WEEK == 'Monday' }}
        run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
        env:
          First_Name: Mona

在这个修改后的早期示例中,我们引入了一个if条件语句。只有当DAY_OF_WEEK设置为“Monday”时,才会运行此工作流程步骤。我们通过使用env上下文if条件语句中访问此值。对于run命令中引用的变量,不需要env上下文。它们作为运行器环境变量引用,在作业由运行器接收后进行插值。但是,我们也可以选择在将作业发送到运行器之前使用上下文对这些变量进行插值。最终输出将相同。

run: echo "${{ env.Greeting }} ${{ env.First_Name }}. Today is ${{ env.DAY_OF_WEEK }}!"

注意

上下文通常使用美元符号和花括号表示,例如${{ context.property }}。在if条件语句中,${{}}是可选的,但如果使用它们,则必须将整个比较语句括起来,如上所示。

你通常会使用envgithub上下文来访问在作业发送到运行器之前处理的工作流程部分中的变量值。

上下文用例示例
env引用在工作流程中定义的自定义变量。${{ env.MY_VARIABLE }}
github引用有关工作流程运行和触发运行的事件的信息。${{ github.repository }}

警告

在创建工作流程和操作时,应始终考虑你的代码是否可能执行来自潜在攻击者的不受信任的输入。某些上下文应被视为不受信任的输入,因为攻击者可能会插入他们自己的恶意内容。有关更多信息,请参阅GitHub Actions 的安全加固

使用vars上下文访问配置变量值

可以使用vars上下文在整个工作流程中访问配置变量。有关更多信息,请参阅访问有关工作流程运行的上下文信息

如果未设置配置变量,则引用该变量的上下文的返回值将为空字符串。

以下示例演示了在整个工作流程中使用vars上下文使用配置变量。以下每个配置变量都在存储库、组织或环境级别定义。

YAML
on:
  workflow_dispatch:
env:
  # Setting an environment variable with the value of a configuration variable
  env_var: ${{ vars.ENV_CONTEXT_VAR }}

jobs:
  display-variables:
    name: ${{ vars.JOB_NAME }}
    # You can use configuration variables with the `vars` context for dynamic jobs
    if: ${{ vars.USE_VARIABLES == 'true' }}
    runs-on: ${{ vars.RUNNER }}
    environment: ${{ vars.ENVIRONMENT_STAGE }}
    steps:
    - name: Use variables
      run: |
        echo "repository variable : $REPOSITORY_VAR"
        echo "organization variable : $ORGANIZATION_VAR"
        echo "overridden variable : $OVERRIDE_VAR"
        echo "variable from shell environment : $env_var"
      env:
        REPOSITORY_VAR: ${{ vars.REPOSITORY_VAR }}
        ORGANIZATION_VAR: ${{ vars.ORGANIZATION_VAR }}
        OVERRIDE_VAR: ${{ vars.OVERRIDE_VAR }}
        
    - name: ${{ vars.HELLO_WORLD_STEP }}
      if: ${{ vars.HELLO_WORLD_ENABLED == 'true' }}
      uses: actions/hello-world-javascript-action@main
      with:
        who-to-greet: ${{ vars.GREET_NAME }}

默认环境变量

GitHub 设置的默认环境变量可用于工作流程中的每个步骤。

由于默认环境变量由 GitHub 设置,而不是在工作流程中定义,因此无法通过env上下文访问它们。但是,大多数默认变量都有一个对应的上下文属性,名称也类似。例如,可以使用${{ github.ref }}上下文属性在工作流程处理期间读取GITHUB_REF变量的值。

你不能覆盖名为GITHUB_*RUNNER_*的默认环境变量的值。目前,你可以覆盖CI变量的值。但是,不能保证这始终可行。有关设置环境变量的更多信息,请参阅为单个工作流程定义环境变量GitHub Actions 的工作流程命令

我们强烈建议操作使用变量来访问文件系统,而不是使用硬编码的文件路径。GitHub 为操作在所有运行器环境中使用设置变量。

变量描述
CI始终设置为true
GITHUB_ACTION当前正在运行的操作的名称,或步骤的id。例如,对于操作,__repo-owner_name-of-action-repo

GitHub 会删除特殊字符,并在当前步骤运行没有id的脚本时使用名称__run。如果在同一作业中多次使用相同的脚本或操作,则名称将包含一个后缀,该后缀由序列号加下划线组成。例如,你运行的第一个脚本的名称为__run,第二个脚本的名称为__run_2。类似地,actions/checkout的第二次调用将为actionscheckout2
GITHUB_ACTION_PATH操作所在的位置路径。此属性仅在复合操作中受支持。可以使用此路径将目录更改为操作所在的位置,并访问同一存储库中的其他文件。例如,/home/runner/work/_actions/repo-owner/name-of-action-repo/v1
GITHUB_ACTION_REPOSITORY对于执行操作的步骤,这是操作的所有者和存储库名称。例如,actions/checkout
GITHUB_ACTIONS当 GitHub Actions 运行工作流程时,始终设置为true。可以使用此变量来区分在本地运行测试还是由 GitHub Actions 运行测试。
GITHUB_ACTOR启动工作流程的人员或应用程序的名称。例如,octocat
GITHUB_ACTOR_ID触发初始工作流程运行的人员或应用程序的帐户 ID。例如,1234567。请注意,这与参与者用户名不同。
GITHUB_API_URL返回 API URL。例如:https://api.github.com
GITHUB_BASE_REF工作流程运行中拉取请求的基础 ref 或目标分支的名称。只有当触发工作流程运行的事件为pull_requestpull_request_target时,才会设置此值。例如,main
GITHUB_ENV运行器上设置工作流程命令变量的文件的路径。此文件的路径对于当前步骤是唯一的,并且在作业中的每个步骤都会更改。例如,/home/runner/work/_temp/_runner_file_commands/set_env_87406d6e-4979-4d42-98e1-3dab1f48b13a。有关更多信息,请参阅GitHub Actions 的工作流程命令
GITHUB_EVENT_NAME触发工作流程的事件的名称。例如,workflow_dispatch
GITHUB_EVENT_PATH运行器上包含完整事件 Webhook 有效负载的文件的路径。例如,/github/workflow/event.json
GITHUB_GRAPHQL_URL返回 GraphQL API URL。例如:https://api.github.com/graphql
GITHUB_HEAD_REF工作流程运行中拉取请求的头 ref 或源分支。只有当触发工作流程运行的事件为pull_requestpull_request_target时,才会设置此属性。例如,feature-branch-1
GITHUB_JOB当前作业的job_id。例如,greeting_job
GITHUB_OUTPUT运行器上设置工作流程命令的当前步骤输出的文件的路径。此文件的路径对于当前步骤是唯一的,并且在作业中的每个步骤都会更改。例如,/home/runner/work/_temp/_runner_file_commands/set_output_a50ef383-b063-46d9-9157-57953fc9f3f0。有关更多信息,请参阅GitHub Actions 的工作流程命令
GITHUB_PATH运行器上设置工作流程命令的系统PATH变量的文件的路径。此文件的路径对于当前步骤是唯一的,并且在作业中的每个步骤都会更改。例如,/home/runner/work/_temp/_runner_file_commands/add_path_899b9445-ad4a-400c-aa89-249f18632cf5。有关更多信息,请参阅GitHub Actions 的工作流程命令
GITHUB_REF触发工作流程运行的分支或标签的完整 ref。对于由push触发的ワークフロー,这是已推送的分支或标签 ref。对于由pull_request触发的ワークフロー,这是拉取请求合并分支。对于由release触发的ワークフロー,这是创建的发布标签。对于其他触发器,这是触发工作流程运行的分支或标签 ref。只有当事件类型可用分支或标签时,才会设置此值。提供的 ref 是完整形式,这意味着对于分支,格式为refs/heads/<branch_name>,对于拉取请求,格式为refs/pull/<pr_number>/merge,对于标签,格式为refs/tags/<tag_name>。例如,refs/heads/feature-branch-1
GITHUB_REF_NAME触发工作流程运行的分支或标签的简短 ref 名称。此值与 GitHub 上显示的分支或标签名称匹配。例如,feature-branch-1

对于拉取请求,格式为<pr_number>/merge
GITHUB_REF_PROTECTED如果为触发工作流程运行的 ref 配置了分支保护或规则集,则为true
GITHUB_REF_TYPE触发工作流程运行的 ref 类型。有效值为branchtag
GITHUB_REPOSITORY所有者和存储库名称。例如,octocat/Hello-World
GITHUB_REPOSITORY_ID存储库的 ID。例如,123456789。请注意,这与存储库名称不同。
GITHUB_REPOSITORY_OWNER存储库所有者的名称。例如,octocat
GITHUB_REPOSITORY_OWNER_ID存储库所有者的帐户 ID。例如,1234567。请注意,这与所有者的名称不同。
GITHUB_RETENTION_DAYS保留工作流程运行日志和工件的天数。例如,90
GITHUB_RUN_ATTEMPT存储库中特定工作流程运行的每次尝试的唯一编号。此编号从工作流程运行的第一次尝试开始为 1,每次重新运行都会递增。例如,3
GITHUB_RUN_ID存储库中每次工作流程运行的唯一编号。如果重新运行工作流程运行,此编号不会更改。例如,1658821493
GITHUB_RUN_NUMBER存储库中特定工作流程的每次运行的唯一编号。此编号从工作流程的第一次运行开始为 1,每次新的运行都会递增。如果重新运行工作流程运行,此编号不会更改。例如,3
GITHUB_SERVER_URLGitHub 服务器的 URL。例如:https://github.com
GITHUB_SHA触发工作流程的提交 SHA。此提交 SHA 的值取决于触发工作流程的事件。有关更多信息,请参阅触发工作流程的事件。例如,ffac537e6cbbf934b08745a378932722df287a53
GITHUB_STEP_SUMMARY运行器上包含工作流命令作业摘要的文件路径。此文件路径对于当前步骤是唯一的,并且在作业的每个步骤中都会更改。例如,/home/runner/_layout/_work/_temp/_runner_file_commands/step_summary_1cb22d7f-5663-41a8-9ffc-13472605c76c。更多信息,请参阅“GitHub Actions 的工作流命令”。
GITHUB_TRIGGERING_ACTOR启动工作流运行的用户用户名。如果工作流运行是重新运行,则此值可能与github.actor不同。任何工作流重新运行都将使用github.actor的权限,即使启动重新运行的 actor (github.triggering_actor) 具有不同的权限。
GITHUB_WORKFLOW工作流的名称。例如,我的测试工作流。如果工作流文件未指定name,则此变量的值为存储库中工作流文件的完整路径。
GITHUB_WORKFLOW_REF工作流的 ref 路径。例如,octocat/hello-world/.github/workflows/my-workflow.yml@refs/heads/my_branch
GITHUB_WORKFLOW_SHA工作流文件的提交 SHA。
GITHUB_WORKSPACE运行器上步骤的默认工作目录,以及使用checkout操作时的存储库的默认位置。例如,/home/runner/work/my-repo-name/my-repo-name
RUNNER_ARCH执行作业的运行器的体系结构。可能的值为X86X64ARMARM64
RUNNER_DEBUG仅在启用调试日志记录时设置此值,并且始终为1。它可以作为指示器,用于在您自己的作业步骤中启用其他调试或详细日志记录。
RUNNER_ENVIRONMENT执行作业的运行器的环境。可能的值为:GitHub 提供的 GitHub 托管运行器为github-hosted,存储库所有者配置的自托管运行器为self-hosted
RUNNER_NAME执行作业的运行器的名称。此名称在工作流运行中可能不唯一,因为存储库和组织级别的运行器可以使用相同的名称。例如,托管代理
RUNNER_OS执行作业的运行器的操作系统。可能的值为LinuxWindowsmacOS。例如,Windows
RUNNER_TEMP运行器上临时目录的路径。此目录在每个作业的开始和结束时都会清空。请注意,如果运行器的用户帐户没有删除它们的权限,则文件不会被删除。例如,D:\a\_temp
RUNNER_TOOL_CACHE包含 GitHub 托管运行器预安装工具的目录的路径。更多信息,请参阅“使用 GitHub 托管运行器”。例如,C:\hostedtoolcache\windows

注意

如果您需要在作业中使用工作流运行的 URL,您可以组合这些变量:$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID

检测操作系统

您可以编写一个可以在不同操作系统上使用的单个工作流文件,方法是使用RUNNER_OS默认环境变量和相应的上下文属性${{ runner.os }}。例如,如果您将操作系统从macos-latest更改为windows-latest,则无需更改环境变量的语法(这取决于运行器使用的 shell 而异),就可以成功运行以下工作流。

YAML
on: workflow_dispatch

jobs:
  if-Windows-else:
    runs-on: macos-latest
    steps:
      - name: condition 1
        if: runner.os == 'Windows'
        run: echo "The operating system on the runner is $env:RUNNER_OS."
      - name: condition 2
        if: runner.os != 'Windows'
        run: echo "The operating system on the runner is not Windows, it's $RUNNER_OS."

在此示例中,两个if语句检查runner上下文的os属性以确定运行器的操作系统。if条件语句由 GitHub Actions 处理,只有检查结果为true的步骤才会发送到运行器。此处其中一个检查将始终为true,另一个为false,因此只将其中一个步骤发送到运行器。将作业发送到运行器后,将执行步骤,并使用适当的语法(Windows 上 PowerShell 的$env:NAME,以及 Linux 和 macOS 上 bash 和 sh 的$NAME)内插echo命令中的环境变量。在此示例中,语句runs-on: macos-latest表示将运行第二个步骤。

在工作流中步骤和作业之间传递值

如果您在一个作业步骤中生成一个值,则可以通过将该值分配给现有或新的环境变量,然后将其写入GITHUB_ENV环境文件,在同一作业的后续步骤中使用该值。操作可以直接使用环境文件,或者通过使用run关键字在工作流文件中使用 shell 命令来使用环境文件。更多信息,请参阅“GitHub Actions 的工作流命令”。

如果您想将工作流中一个作业的一个步骤中的值传递给工作流中另一个作业的一个步骤,则可以将该值定义为作业输出。然后,您可以从另一个作业的步骤中引用此作业输出。更多信息,请参阅“GitHub Actions 的工作流语法”。