在 GitHub 操作中,我可以 return 返回一个值以供以后用作条件吗?
In GitHub Actions, can I return back a value to be used as a condition later?
我将 GitHub 操作设置为 one of my projects 的 CI,整个构建过程基本上是一个由环境变量驱动的 PowerShell 脚本。
这既是为了最大限度地减少供应商锁定,也是为了确保我可以 运行 使用几乎相同的过程在本地构建。
现在,我的构建脚本确定了一些内容并将其放入环境变量中 - 具体来说,我有一个 MH_IS_PROD_BUILD
变量,它要么是 True 要么是 False,并确定我推送到哪个 nuget 包存储库。
但是,当 运行 完成 shell 的步骤后,环境变量将不复存在,因为进一步的步骤似乎是 运行 在新环境中。
我想要做的事情是这样的(缩写):
steps:
- name: Run build script
id: pwshbuild
shell: pwsh
run: |
cd scripts
./build.ps1
# The above sets $Env:MH_IS_PROD_BUILD to either True or False
- name: Push Publish to GPR (Dev Package)
if: steps.pwshbuild.outputs.MH_IS_PROD_BUILD == 'False'
shell: pwsh
run: |
# omitted: determine $nupkgPath
nuget push $nupkgPath -Source "GPR" -SkipDuplicate
- name: Push Publish to Nuget.org (Release Package)
if: steps.pwshbuild.outputs.MH_IS_PROD_BUILD == 'True'
shell: pwsh
run: |
# omitted: determine $nupkgPath
nuget push $nupkgPath -Source "NugetOrg" -SkipDuplicate
我似乎需要 outputs,但这似乎需要创建自定义操作?
以上当然行不通(所以问)。所以我想知道,最好的前进方式是什么?
- 我可以从 PowerShell 设置步骤的输出吗? (首选)
- 我是否必须创建一个自定义操作来封装我对构建的调用。ps1 以便我可以通过输出 return 东西?
我认为您可以通过将输出回显到控制台来设置 Powershell 的输出。 Powershell 有一个别名映射 echo 到 Write-Output
.
jobs:
windows-test:
runs-on: windows-latest
steps:
- uses: actions/checkout@v1
- name: Set outputs
id: vars
shell: pwsh
run: echo "::set-output name=production::true"
- name: Check outputs
shell: pwsh
run: echo ${{ steps.vars.outputs.production }}
除了 peterevans 的回答外,您仍然可以使用环境变量作为条件,只要它们是通过 ::set-env "command"[=14 设置的=]
示例:
- run: |
if [ -f FileMightNotExists.txt ]; then
echo ::set-env name=HAVE_FILE::true
fi
shell: bash
- run: echo "I have file!"
if: env.HAVE_FILE == 'true'
如前所述,已经有 ::set-output,所以这主要是个人喜好问题。
使 ::set-env 更易于使用的原因(在我看来)是您不需要为步骤设置 id
(减少输入) ,引用 vars 更短(再次输入更少),您添加的所有变量都将在每个步骤中列出(折叠在 Run
块内,在尝试查找工作流程中的错误时非常有用),而且......它是最后只是常规变量,可能更容易使用,取决于 shell.
我将 GitHub 操作设置为 one of my projects 的 CI,整个构建过程基本上是一个由环境变量驱动的 PowerShell 脚本。
这既是为了最大限度地减少供应商锁定,也是为了确保我可以 运行 使用几乎相同的过程在本地构建。
现在,我的构建脚本确定了一些内容并将其放入环境变量中 - 具体来说,我有一个 MH_IS_PROD_BUILD
变量,它要么是 True 要么是 False,并确定我推送到哪个 nuget 包存储库。
但是,当 运行 完成 shell 的步骤后,环境变量将不复存在,因为进一步的步骤似乎是 运行 在新环境中。
我想要做的事情是这样的(缩写):
steps:
- name: Run build script
id: pwshbuild
shell: pwsh
run: |
cd scripts
./build.ps1
# The above sets $Env:MH_IS_PROD_BUILD to either True or False
- name: Push Publish to GPR (Dev Package)
if: steps.pwshbuild.outputs.MH_IS_PROD_BUILD == 'False'
shell: pwsh
run: |
# omitted: determine $nupkgPath
nuget push $nupkgPath -Source "GPR" -SkipDuplicate
- name: Push Publish to Nuget.org (Release Package)
if: steps.pwshbuild.outputs.MH_IS_PROD_BUILD == 'True'
shell: pwsh
run: |
# omitted: determine $nupkgPath
nuget push $nupkgPath -Source "NugetOrg" -SkipDuplicate
我似乎需要 outputs,但这似乎需要创建自定义操作?
以上当然行不通(所以问)。所以我想知道,最好的前进方式是什么?
- 我可以从 PowerShell 设置步骤的输出吗? (首选)
- 我是否必须创建一个自定义操作来封装我对构建的调用。ps1 以便我可以通过输出 return 东西?
我认为您可以通过将输出回显到控制台来设置 Powershell 的输出。 Powershell 有一个别名映射 echo 到 Write-Output
.
jobs:
windows-test:
runs-on: windows-latest
steps:
- uses: actions/checkout@v1
- name: Set outputs
id: vars
shell: pwsh
run: echo "::set-output name=production::true"
- name: Check outputs
shell: pwsh
run: echo ${{ steps.vars.outputs.production }}
除了 peterevans 的回答外,您仍然可以使用环境变量作为条件,只要它们是通过 ::set-env "command"[=14 设置的=]
示例:
- run: |
if [ -f FileMightNotExists.txt ]; then
echo ::set-env name=HAVE_FILE::true
fi
shell: bash
- run: echo "I have file!"
if: env.HAVE_FILE == 'true'
如前所述,已经有 ::set-output,所以这主要是个人喜好问题。
使 ::set-env 更易于使用的原因(在我看来)是您不需要为步骤设置 id
(减少输入) ,引用 vars 更短(再次输入更少),您添加的所有变量都将在每个步骤中列出(折叠在 Run
块内,在尝试查找工作流程中的错误时非常有用),而且......它是最后只是常规变量,可能更容易使用,取决于 shell.