关于工作流命令
操作可以与运行器机器通信,以设置环境变量、输出其他操作使用的值、将调试消息添加到输出日志以及其他任务。
大多数工作流命令使用特定格式的 echo
命令,而其他命令则通过写入文件来调用。有关更多信息,请参阅“环境文件”。
工作流命令示例
echo "::workflow-command parameter1={data},parameter2={data}::{command value}"
echo "::workflow-command parameter1={data},parameter2={data}::{command value}"
Write-Output "::workflow-command parameter1={data},parameter2={data}::{command value}"
Write-Output "::workflow-command parameter1={data},parameter2={data}::{command value}"
注意:工作流命令和参数名称不区分大小写。
警告:如果您使用的是命令提示符,请在使用工作流命令时省略双引号字符 ("
)。
使用工作流程命令访问工具包函数
actions/toolkit 包含许多可以作为工作流程命令执行的函数。使用 ::
语法在 YAML 文件中运行工作流程命令;这些命令随后通过 stdout
发送到运行器。
例如,与其使用代码创建错误注释,如下所示
core.error('Missing semicolon', {file: 'app.js', startLine: 1})
core.error('Missing semicolon', {file: 'app.js', startLine: 1})
示例:为错误创建注释
您可以在工作流程中使用 error
命令来创建相同的错误注释
- name: Create annotation for build error run: echo "::error file=app.js,line=1::Missing semicolon"
- name: Create annotation for build error
run: echo "::error file=app.js,line=1::Missing semicolon"
- name: Create annotation for build error run: Write-Output "::error file=app.js,line=1::Missing semicolon"
- name: Create annotation for build error
run: Write-Output "::error file=app.js,line=1::Missing semicolon"
下表显示了工作流程中可用的工具包函数
工具包函数 | 等效工作流程命令 |
---|---|
core.addPath | 可通过环境文件 GITHUB_PATH 访问 |
core.debug | debug |
core.notice | notice |
core.error | error |
core.endGroup | endgroup |
core.exportVariable | 可通过环境文件 GITHUB_ENV 访问 |
core.getInput | 可通过环境变量 INPUT_{NAME} 访问 |
core.getState | 可通过环境变量 STATE_{NAME} 访问 |
core.isDebug | 可通过环境变量 RUNNER_DEBUG 访问 |
core.summary | 可通过环境文件 GITHUB_STEP_SUMMARY 访问 |
core.saveState | 可通过环境文件 GITHUB_STATE 访问 |
core.setCommandEcho | echo |
core.setFailed | 用作 ::error 和 exit 1 的快捷方式 |
core.setOutput | 可通过环境文件 GITHUB_OUTPUT 访问 |
core.setSecret | add-mask |
core.startGroup | group |
core.warning | warning |
设置调试消息
将调试消息打印到日志。您必须创建一个名为 ACTIONS_STEP_DEBUG
的秘密,其值为 true
,才能在日志中看到此命令设置的调试消息。有关详细信息,请参阅“启用调试日志记录”。
::debug::{message}
::debug::{message}
示例:设置调试消息
echo "::debug::Set the Octocat variable"
echo "::debug::Set the Octocat variable"
Write-Output "::debug::Set the Octocat variable"
Write-Output "::debug::Set the Octocat variable"
设置通知消息
创建通知消息并将消息打印到日志。此消息将创建一个注释,该注释可以将消息与存储库中的特定文件关联。可选地,您的消息可以指定文件中的位置。
::notice file={name},line={line},endLine={endLine},title={title}::{message}
::notice file={name},line={line},endLine={endLine},title={title}::{message}
参数 | 值 | 必需 | 默认 |
---|---|---|---|
标题 | 自定义标题 | 是 | 无 |
文件 | 文件名 | 否 | .github |
列 | 列号,从 1 开始 | 否 | 无 |
endColumn | 结束列号 | 否 | 无 |
行 | 行号,从 1 开始 | 否 | 1 |
endLine | 结束行号 | 否 | 1 |
示例:设置通知消息
echo "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
echo "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
Write-Output "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
Write-Output "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
设置警告消息
创建警告消息并将消息打印到日志。此消息将创建一个注释,该注释可以将消息与存储库中的特定文件关联。可选地,您的消息可以指定文件中的位置。
::warning file={name},line={line},endLine={endLine},title={title}::{message}
::warning file={name},line={line},endLine={endLine},title={title}::{message}
参数 | 值 | 必需 | 默认 |
---|---|---|---|
标题 | 自定义标题 | 是 | 无 |
文件 | 文件名 | 否 | .github |
列 | 列号,从 1 开始 | 否 | 无 |
endColumn | 结束列号 | 否 | 无 |
行 | 行号,从 1 开始 | 否 | 1 |
endLine | 结束行号 | 否 | 1 |
示例:设置警告消息
echo "::warning file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
echo "::warning file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
Write-Output "::warning file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
Write-Output "::warning file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
设置错误消息
创建错误消息并将消息打印到日志。此消息将创建一个注释,该注释可以将消息与存储库中的特定文件关联。可选地,您的消息可以指定文件中的位置。
::error file={name},line={line},endLine={endLine},title={title}::{message}
::error file={name},line={line},endLine={endLine},title={title}::{message}
参数 | 值 | 必需 | 默认 |
---|---|---|---|
标题 | 自定义标题 | 是 | 无 |
文件 | 文件名 | 否 | .github |
列 | 列号,从 1 开始 | 否 | 无 |
endColumn | 结束列号 | 否 | 无 |
行 | 行号,从 1 开始 | 否 | 1 |
endLine | 结束行号 | 否 | 1 |
示例:设置错误消息
echo "::error file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
echo "::error file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
Write-Output "::error file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
Write-Output "::error file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
对日志行进行分组
在日志中创建一个可展开的组。要创建组,请使用 group
命令并指定 title
。在 group
和 endgroup
命令之间打印到日志的任何内容都将嵌套在日志中的可展开条目中。
::group::{title} ::endgroup::
::group::{title}
::endgroup::
示例:对日志行进行分组
jobs: bash-example: runs-on: ubuntu-latest steps: - name: Group of log lines run: | echo "::group::My title" echo "Inside group" echo "::endgroup::"
jobs:
bash-example:
runs-on: ubuntu-latest
steps:
- name: Group of log lines
run: |
echo "::group::My title"
echo "Inside group"
echo "::endgroup::"
jobs: powershell-example: runs-on: windows-latest steps: - name: Group of log lines run: | Write-Output "::group::My title" Write-Output "Inside group" Write-Output "::endgroup::"
jobs:
powershell-example:
runs-on: windows-latest
steps:
- name: Group of log lines
run: |
Write-Output "::group::My title"
Write-Output "Inside group"
Write-Output "::endgroup::"
在日志中屏蔽值
::add-mask::{value}
::add-mask::{value}
屏蔽值可防止在日志中打印字符串或变量。每个由空格分隔的屏蔽词都将被替换为 *
字符。您可以使用环境变量或字符串作为掩码的 value
。当您屏蔽值时,它将被视为机密,并在运行器上被删除。例如,在您屏蔽值后,您将无法将该值设置为输出。
示例:屏蔽字符串
当您在日志中打印 "Mona The Octocat"
时,您将看到 "***"
。
echo "::add-mask::Mona The Octocat"
echo "::add-mask::Mona The Octocat"
Write-Output "::add-mask::Mona The Octocat"
Write-Output "::add-mask::Mona The Octocat"
警告: 确保在构建日志中输出秘密或在任何其他工作流命令中使用秘密之前,使用 'add-mask' 注册秘密。
示例:屏蔽环境变量
当您在日志中打印变量 MY_NAME
或值 "Mona The Octocat"
时,您将看到 "***"
而不是 "Mona The Octocat"
。
jobs: bash-example: runs-on: ubuntu-latest env: MY_NAME: "Mona The Octocat" steps: - name: bash-version run: echo "::add-mask::$MY_NAME"
jobs:
bash-example:
runs-on: ubuntu-latest
env:
MY_NAME: "Mona The Octocat"
steps:
- name: bash-version
run: echo "::add-mask::$MY_NAME"
jobs: powershell-example: runs-on: windows-latest env: MY_NAME: "Mona The Octocat" steps: - name: powershell-version run: Write-Output "::add-mask::$env:MY_NAME"
jobs:
powershell-example:
runs-on: windows-latest
env:
MY_NAME: "Mona The Octocat"
steps:
- name: powershell-version
run: Write-Output "::add-mask::$env:MY_NAME"
示例:屏蔽单个作业中生成的输出
如果您不需要将您的秘密从一个作业传递到另一个作业,您可以
- 生成秘密(不输出它)。
- 使用
add-mask
对其进行掩码。 - 使用
GITHUB_OUTPUT
使秘密可用于作业内的其他步骤。
on: push jobs: generate-a-secret-output: runs-on: ubuntu-latest steps: - id: sets-a-secret name: Generate, mask, and output a secret run: | the_secret=$((RANDOM)) echo "::add-mask::$the_secret" echo "secret-number=$the_secret" >> "$GITHUB_OUTPUT" - name: Use that secret output (protected by a mask) run: | echo "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
on: push
jobs:
generate-a-secret-output:
runs-on: ubuntu-latest
steps:
- id: sets-a-secret
name: Generate, mask, and output a secret
run: |
the_secret=$((RANDOM))
echo "::add-mask::$the_secret"
echo "secret-number=$the_secret" >> "$GITHUB_OUTPUT"
- name: Use that secret output (protected by a mask)
run: |
echo "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
on: push jobs: generate-a-secret-output: runs-on: ubuntu-latest steps: - id: sets-a-secret name: Generate, mask, and output a secret shell: pwsh run: | Set-Variable -Name TheSecret -Value (Get-Random) Write-Output "::add-mask::$TheSecret" "secret-number=$TheSecret" >> $env:GITHUB_OUTPUT - name: Use that secret output (protected by a mask) shell: pwsh run: | Write-Output "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
on: push
jobs:
generate-a-secret-output:
runs-on: ubuntu-latest
steps:
- id: sets-a-secret
name: Generate, mask, and output a secret
shell: pwsh
run: |
Set-Variable -Name TheSecret -Value (Get-Random)
Write-Output "::add-mask::$TheSecret"
"secret-number=$TheSecret" >> $env:GITHUB_OUTPUT
- name: Use that secret output (protected by a mask)
shell: pwsh
run: |
Write-Output "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
示例:在作业或工作流之间掩码和传递秘密
如果您想在作业或工作流之间传递一个掩码后的秘密,您应该将秘密存储在一个存储库中,然后在后续作业或工作流中检索它。
设置
- 设置一个秘密存储库来存储您将在工作流期间生成的秘密。例如,Vault。
- 生成一个用于读写该秘密存储库的密钥。将密钥存储为存储库秘密。在以下示例工作流中,秘密名称为
SECRET_STORE_CREDENTIALS
。有关更多信息,请参阅“在 GitHub Actions 中使用秘密”。
工作流
注意:此工作流使用一个假想的秘密存储库 secret-store
,它具有假想的命令 store-secret
和 retrieve-secret
。some/secret-store@ 27b31702a0e7fc50959f5ad993c78deac1bdfc29
是一个假想的操作,它安装 secret-store
应用程序并将其配置为连接到具有 credentials
的 instance
。
on: push jobs: secret-generator: runs-on: ubuntu-latest outputs: handle: ${{ steps.generate-secret.outputs.handle }} steps: - uses: some/secret-store@v1 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: generate secret id: generate-secret shell: bash run: | GENERATED_SECRET=$((RANDOM)) echo "::add-mask::$GENERATED_SECRET" SECRET_HANDLE=$(secret-store store-secret "$GENERATED_SECRET") echo "handle=$SECRET_HANDLE" >> "$GITHUB_OUTPUT" secret-consumer: runs-on: macos-latest needs: secret-generator steps: - uses: some/secret-store@v1 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: use secret shell: bash run: | SECRET_HANDLE="${{ needs.secret-generator.outputs.handle }}" RETRIEVED_SECRET=$(secret-store retrieve-secret "$SECRET_HANDLE") echo "::add-mask::$RETRIEVED_SECRET" echo "We retrieved our masked secret: $RETRIEVED_SECRET"
on: push
jobs:
secret-generator:
runs-on: ubuntu-latest
outputs:
handle: ${{ steps.generate-secret.outputs.handle }}
steps:
- uses: some/secret-store@v1
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: generate secret
id: generate-secret
shell: bash
run: |
GENERATED_SECRET=$((RANDOM))
echo "::add-mask::$GENERATED_SECRET"
SECRET_HANDLE=$(secret-store store-secret "$GENERATED_SECRET")
echo "handle=$SECRET_HANDLE" >> "$GITHUB_OUTPUT"
secret-consumer:
runs-on: macos-latest
needs: secret-generator
steps:
- uses: some/secret-store@v1
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: use secret
shell: bash
run: |
SECRET_HANDLE="${{ needs.secret-generator.outputs.handle }}"
RETRIEVED_SECRET=$(secret-store retrieve-secret "$SECRET_HANDLE")
echo "::add-mask::$RETRIEVED_SECRET"
echo "We retrieved our masked secret: $RETRIEVED_SECRET"
on: push jobs: secret-generator: runs-on: ubuntu-latest steps: - uses: some/secret-store@v1 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: generate secret shell: pwsh run: | Set-Variable -Name Generated_Secret -Value (Get-Random) Write-Output "::add-mask::$Generated_Secret" Set-Variable -Name Secret_Handle -Value (Store-Secret "$Generated_Secret") "handle=$Secret_Handle" >> $env:GITHUB_OUTPUT secret-consumer: runs-on: macos-latest needs: secret-generator steps: - uses: some/secret-store@v1 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: use secret shell: pwsh run: | Set-Variable -Name Secret_Handle -Value "${{ needs.secret-generator.outputs.handle }}" Set-Variable -Name Retrieved_Secret -Value (Retrieve-Secret "$Secret_Handle") echo "::add-mask::$Retrieved_Secret" echo "We retrieved our masked secret: $Retrieved_Secret"
on: push
jobs:
secret-generator:
runs-on: ubuntu-latest
steps:
- uses: some/secret-store@v1
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: generate secret
shell: pwsh
run: |
Set-Variable -Name Generated_Secret -Value (Get-Random)
Write-Output "::add-mask::$Generated_Secret"
Set-Variable -Name Secret_Handle -Value (Store-Secret "$Generated_Secret")
"handle=$Secret_Handle" >> $env:GITHUB_OUTPUT
secret-consumer:
runs-on: macos-latest
needs: secret-generator
steps:
- uses: some/secret-store@v1
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: use secret
shell: pwsh
run: |
Set-Variable -Name Secret_Handle -Value "${{ needs.secret-generator.outputs.handle }}"
Set-Variable -Name Retrieved_Secret -Value (Retrieve-Secret "$Secret_Handle")
echo "::add-mask::$Retrieved_Secret"
echo "We retrieved our masked secret: $Retrieved_Secret"
停止和启动工作流命令
停止处理任何工作流命令。此特殊命令允许您记录任何内容,而不会意外运行工作流命令。例如,您可以停止记录以输出包含注释的整个脚本。
::stop-commands::{endtoken}
::stop-commands::{endtoken}
要停止处理工作流命令,请将一个唯一的令牌传递给 stop-commands
。要恢复处理工作流命令,请传递与用于停止工作流命令相同的令牌。
警告:确保您使用的令牌是随机生成的,并且每次运行都是唯一的。
::{endtoken}::
::{endtoken}::
示例:停止和启动工作流命令
jobs: workflow-command-job: runs-on: ubuntu-latest steps: - name: Disable workflow commands run: | echo '::warning:: This is a warning message, to demonstrate that commands are being processed.' stopMarker=$(uuidgen) echo "::stop-commands::$stopMarker" echo '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.' echo "::$stopMarker::" echo '::warning:: This is a warning again, because stop-commands has been turned off.'
jobs:
workflow-command-job:
runs-on: ubuntu-latest
steps:
- name: Disable workflow commands
run: |
echo '::warning:: This is a warning message, to demonstrate that commands are being processed.'
stopMarker=$(uuidgen)
echo "::stop-commands::$stopMarker"
echo '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.'
echo "::$stopMarker::"
echo '::warning:: This is a warning again, because stop-commands has been turned off.'
jobs: workflow-command-job: runs-on: windows-latest steps: - name: Disable workflow commands run: | Write-Output '::warning:: This is a warning message, to demonstrate that commands are being processed.' $stopMarker = New-Guid Write-Output "::stop-commands::$stopMarker" Write-Output '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.' Write-Output "::$stopMarker::" Write-Output '::warning:: This is a warning again, because stop-commands has been turned off.'
jobs:
workflow-command-job:
runs-on: windows-latest
steps:
- name: Disable workflow commands
run: |
Write-Output '::warning:: This is a warning message, to demonstrate that commands are being processed.'
$stopMarker = New-Guid
Write-Output "::stop-commands::$stopMarker"
Write-Output '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.'
Write-Output "::$stopMarker::"
Write-Output '::warning:: This is a warning again, because stop-commands has been turned off.'
将值发送到预操作和后操作
您可以通过写入位于 GITHUB_STATE
的文件来创建环境变量,以便与工作流的 pre:
或 post:
操作共享。例如,您可以使用 pre:
操作创建一个文件,将文件位置传递给 main:
操作,然后使用 post:
操作删除该文件。或者,您可以使用 main:
操作创建一个文件,将文件位置传递给 post:
操作,并使用 post:
操作删除该文件。
如果您有多个 pre:
或 post:
操作,您只能在将值写入 GITHUB_STATE
的操作中访问保存的值。有关 post:
操作的更多信息,请参阅“GitHub Actions 的元数据语法”。
GITHUB_STATE
文件仅在操作内部可用。保存的值以环境变量的形式存储,并带有 STATE_
前缀。
此示例使用 JavaScript 写入 GITHUB_STATE
文件。生成的環境變數名为 STATE_processID
,其值为 12345
。
import * as fs from 'fs' import * as os from 'os' fs.appendFileSync(process.env.GITHUB_STATE, `processID=12345${os.EOL}`, { encoding: 'utf8' })
import * as fs from 'fs'
import * as os from 'os'
fs.appendFileSync(process.env.GITHUB_STATE, `processID=12345${os.EOL}`, {
encoding: 'utf8'
})
STATE_processID
变量仅供在 main
操作下运行的清理脚本使用。此示例在 main
中运行,并使用 JavaScript 显示分配给 STATE_processID
环境变量的值。
console.log("The running PID from the main action is: " + process.env.STATE_processID);
console.log("The running PID from the main action is: " + process.env.STATE_processID);
环境文件
在工作流程执行期间,运行器会生成临时文件,这些文件可用于执行某些操作。可以使用 GitHub 的默认环境变量访问和编辑这些文件的路径。请参阅“变量”。写入这些文件时,需要使用 UTF-8 编码,以确保正确处理命令。多个命令可以写入同一个文件,并用换行符分隔。要在 GitHub 操作中使用环境变量,可以使用特定的 GitHub 操作命令创建或修改 .env
文件。
以下是操作步骤
name: Example Workflow for Environment Files on: push jobs: set_and_use_env_vars: runs-on: ubuntu-latest steps: - name: Set environment variable run: echo "MY_ENV_VAR=myValue" >> $GITHUB_ENV - name: Use environment variable run: | echo "The value of MY_ENV_VAR is $MY_ENV_VAR"
name: Example Workflow for Environment Files
on: push
jobs:
set_and_use_env_vars:
runs-on: ubuntu-latest
steps:
- name: Set environment variable
run: echo "MY_ENV_VAR=myValue" >> $GITHUB_ENV
- name: Use environment variable
run: |
echo "The value of MY_ENV_VAR is $MY_ENV_VAR"
另一个示例是使用它存储元数据,例如构建时间戳、提交 SHA 或工件名称。
steps: - name: Store build timestamp run: echo "BUILD_TIME=$(date +'%T')" >> $GITHUB_ENV - name: Deploy using stored timestamp run: echo "Deploying at $BUILD_TIME"
steps:
- name: Store build timestamp
run: echo "BUILD_TIME=$(date +'%T')" >> $GITHUB_ENV
- name: Deploy using stored timestamp
run: echo "Deploying at $BUILD_TIME"
注意: PowerShell 5.1 及更低版本(shell: powershell
)默认情况下不使用 UTF-8,因此您必须指定 UTF-8 编码。例如
jobs: legacy-powershell-example: runs-on: windows-latest steps: - shell: powershell run: | "mypath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
jobs:
legacy-powershell-example:
runs-on: windows-latest
steps:
- shell: powershell
run: |
"mypath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
PowerShell Core 6 及更高版本(shell: pwsh
)默认情况下使用 UTF-8。例如
jobs: powershell-core-example: runs-on: windows-latest steps: - shell: pwsh run: | "mypath" | Out-File -FilePath $env:GITHUB_PATH -Append
jobs:
powershell-core-example:
runs-on: windows-latest
steps:
- shell: pwsh
run: |
"mypath" | Out-File -FilePath $env:GITHUB_PATH -Append
设置环境变量
注意:为了避免问题,建议将环境变量视为区分大小写,无论您使用的操作系统和 shell 的行为如何。
echo "{environment_variable_name}={value}" >> "$GITHUB_ENV"
echo "{environment_variable_name}={value}" >> "$GITHUB_ENV"
-
使用 PowerShell 6 及更高版本
PowerShell "{environment_variable_name}={value}" | Out-File -FilePath $env:GITHUB_ENV -Append
"{environment_variable_name}={value}" | Out-File -FilePath $env:GITHUB_ENV -Append
-
使用 PowerShell 5.1 及更低版本
PowerShell "{environment_variable_name}={value}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"{environment_variable_name}={value}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
您可以通过定义或更新环境变量并将其写入 GITHUB_ENV
环境文件,使环境变量对工作流程作业中的任何后续步骤可用。创建或更新环境变量的步骤无法访问新值,但作业中的所有后续步骤都可以访问。
您不能覆盖名为 GITHUB_*
和 RUNNER_*
的默认环境变量的值。目前您可以覆盖 CI
变量的值。但是,不能保证这始终是可能的。有关默认环境变量的更多信息,请参阅“变量”。
注意:由于安全限制,GITHUB_ENV
不能用于设置 NODE_OPTIONS
环境变量。
将环境变量写入 GITHUB_ENV
的示例
steps: - name: Set the value id: step_one run: | echo "action_state=yellow" >> "$GITHUB_ENV" - name: Use the value id: step_two run: | printf '%s\n' "$action_state" # This will output 'yellow'
steps:
- name: Set the value
id: step_one
run: |
echo "action_state=yellow" >> "$GITHUB_ENV"
- name: Use the value
id: step_two
run: |
printf '%s\n' "$action_state" # This will output 'yellow'
steps: - name: Set the value id: step_one run: | "action_state=yellow" | Out-File -FilePath $env:GITHUB_ENV -Append - name: Use the value id: step_two run: | Write-Output "$env:action_state" # This will output 'yellow'
steps:
- name: Set the value
id: step_one
run: |
"action_state=yellow" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Use the value
id: step_two
run: |
Write-Output "$env:action_state" # This will output 'yellow'
多行字符串
对于多行字符串,您可以使用以下语法中的分隔符。
{name}<<{delimiter} {value} {delimiter}
{name}<<{delimiter}
{value}
{delimiter}
警告:确保您使用的分隔符不会在值内的单独一行出现。如果值完全是任意的,则不应使用此格式。而是将值写入文件。
多行字符串示例
此示例使用EOF
作为分隔符,并将JSON_RESPONSE
环境变量设置为curl
响应的值。
steps: - name: Set the value in bash id: step_one run: | { echo 'JSON_RESPONSE<<EOF' curl https://example.com echo EOF } >> "$GITHUB_ENV"
steps:
- name: Set the value in bash
id: step_one
run: |
{
echo 'JSON_RESPONSE<<EOF'
curl https://example.com
echo EOF
} >> "$GITHUB_ENV"
steps: - name: Set the value in pwsh id: step_one run: | $EOF = -join (1..15 | ForEach {[char]((48..57)+(65..90)+(97..122) | Get-Random)}) "JSON_RESPONSE<<$EOF" | Out-File -FilePath $env:GITHUB_ENV -Append (Invoke-WebRequest -Uri "https://example.com").Content | Out-File -FilePath $env:GITHUB_ENV -Append "$EOF" | Out-File -FilePath $env:GITHUB_ENV -Append shell: pwsh
steps:
- name: Set the value in pwsh
id: step_one
run: |
$EOF = -join (1..15 | ForEach {[char]((48..57)+(65..90)+(97..122) | Get-Random)})
"JSON_RESPONSE<<$EOF" | Out-File -FilePath $env:GITHUB_ENV -Append
(Invoke-WebRequest -Uri "https://example.com").Content | Out-File -FilePath $env:GITHUB_ENV -Append
"$EOF" | Out-File -FilePath $env:GITHUB_ENV -Append
shell: pwsh
设置输出参数
设置步骤的输出参数。请注意,该步骤需要定义一个id
才能稍后检索输出值。您可以使用与“多行字符串”部分中定义多行环境变量相同的技术来设置多行输出值。
echo "{name}={value}" >> "$GITHUB_OUTPUT"
echo "{name}={value}" >> "$GITHUB_OUTPUT"
"{name}=value" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
"{name}=value" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
设置输出参数示例
此示例演示如何设置SELECTED_COLOR
输出参数,以及如何稍后检索它。
- name: Set color id: color-selector run: echo "SELECTED_COLOR=green" >> "$GITHUB_OUTPUT" - name: Get color env: SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }} run: echo "The selected color is $SELECTED_COLOR"
- name: Set color
id: color-selector
run: echo "SELECTED_COLOR=green" >> "$GITHUB_OUTPUT"
- name: Get color
env:
SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
run: echo "The selected color is $SELECTED_COLOR"
此示例演示如何设置SELECTED_COLOR
输出参数,以及如何稍后检索它。
- name: Set color id: color-selector run: | "SELECTED_COLOR=green" | Out-File -FilePath $env:GITHUB_OUTPUT -Append - name: Get color env: SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }} run: Write-Output "The selected color is $env:SELECTED_COLOR"
- name: Set color
id: color-selector
run: |
"SELECTED_COLOR=green" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
- name: Get color
env:
SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
run: Write-Output "The selected color is $env:SELECTED_COLOR"
添加作业摘要
echo "{markdown content}" >> $GITHUB_STEP_SUMMARY
echo "{markdown content}" >> $GITHUB_STEP_SUMMARY
"{markdown content}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append
"{markdown content}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append
您可以为每个作业设置一些自定义 Markdown,以便它显示在工作流运行的摘要页面上。您可以使用作业摘要来显示和分组唯一内容,例如测试结果摘要,这样查看工作流运行结果的人员就不需要进入日志查看与运行相关的关键信息,例如失败。
作业摘要支持GitHub 风格的 Markdown,您可以将步骤的 Markdown 内容添加到GITHUB_STEP_SUMMARY
环境文件中。GITHUB_STEP_SUMMARY
对于作业中的每个步骤都是唯一的。有关GITHUB_STEP_SUMMARY
引用的每个步骤文件,请参阅“环境文件”。
作业完成后,作业中所有步骤的摘要将分组到一个作业摘要中,并显示在工作流运行摘要页面上。如果多个作业生成摘要,则作业摘要将按作业完成时间排序。
添加作业摘要示例
echo "### Hello world! :rocket:" >> $GITHUB_STEP_SUMMARY
echo "### Hello world! :rocket:" >> $GITHUB_STEP_SUMMARY
"### Hello world! :rocket:" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append
"### Hello world! :rocket:" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append
多行 Markdown 内容
对于多行 Markdown 内容,您可以使用 >>
持续追加当前步骤的内容。每次追加操作都会自动添加一个换行符。
多行 Markdown 内容示例
- name: Generate list using Markdown
run: |
echo "This is the lead in sentence for the list" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY # this is a blank line
echo "- Lets add a bullet point" >> $GITHUB_STEP_SUMMARY
echo "- Lets add a second bullet point" >> $GITHUB_STEP_SUMMARY
echo "- How about a third one?" >> $GITHUB_STEP_SUMMARY
- name: Generate list using Markdown
run: |
"This is the lead in sentence for the list" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append
"" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append # this is a blank line
"- Lets add a bullet point" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append
"- Lets add a second bullet point" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append
"- How about a third one?" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append
覆盖作业摘要
要清除当前步骤的所有内容,您可以使用 >
在 Bash 中覆盖之前添加的任何内容,或者在 PowerShell 中删除 -Append
覆盖作业摘要示例
- name: Overwrite Markdown
run: |
echo "Adding some Markdown content" >> $GITHUB_STEP_SUMMARY
echo "There was an error, we need to clear the previous Markdown with some new content." > $GITHUB_STEP_SUMMARY
- name: Overwrite Markdown
run: |
"Adding some Markdown content" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append
"There was an error, we need to clear the previous Markdown with some new content." | Out-File -FilePath $env:GITHUB_STEP_SUMMARY
删除作业摘要
要完全删除当前步骤的摘要,可以删除 GITHUB_STEP_SUMMARY
引用的文件。
删除作业摘要示例
- name: Delete all summary content
run: |
echo "Adding Markdown content that we want to remove before the step ends" >> $GITHUB_STEP_SUMMARY
rm $GITHUB_STEP_SUMMARY
- name: Delete all summary content
run: |
"Adding Markdown content that we want to remove before the step ends" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append
Remove-Item $env:GITHUB_STEP_SUMMARY
步骤完成后,作业摘要将被上传,后续步骤无法修改之前上传的 Markdown 内容。摘要会自动屏蔽可能意外添加的任何秘密。如果作业摘要包含必须删除的敏感信息,您可以删除整个工作流运行以删除其所有作业摘要。有关更多信息,请参阅 "删除工作流运行."
步骤隔离和限制
作业摘要在步骤之间是隔离的,每个步骤的大小限制为 1MiB。步骤之间强制执行隔离,以防止单个步骤中可能格式错误的 Markdown 影响后续步骤的 Markdown 渲染。如果为步骤添加了超过 1MiB 的内容,则步骤的上传将失败,并将创建错误注释。作业摘要的上传失败不会影响步骤或作业的整体状态。每个作业最多显示 20 个来自步骤的作业摘要。
添加系统路径
将目录添加到系统 PATH
变量,并自动使其可用于当前作业中的所有后续操作;当前正在运行的操作无法访问更新的路径变量。要查看作业的当前定义路径,您可以在步骤或操作中使用 echo "$PATH"
。
添加系统路径示例
此示例演示如何将用户 $HOME/.local/bin
目录添加到 PATH
echo "$HOME/.local/bin" >> $GITHUB_PATH
echo "$HOME/.local/bin" >> $GITHUB_PATH
此示例演示如何将用户 $env:HOMEPATH/.local/bin
目录添加到 PATH
"$env:HOMEPATH/.local/bin" | Out-File -FilePath $env:GITHUB_PATH -Append
"$env:HOMEPATH/.local/bin" | Out-File -FilePath $env:GITHUB_PATH -Append