我正在为我的一个项目设置GitHub Actions作为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
输出似乎是我所需要的,但这似乎需要创建一个自定义操作?
当然,上面的内容不起作用(因此提出要求(。所以我想知道,最好的前进道路是什么?
- 我可以从PowerShell设置步骤的输出吗?(首选(
- 我是否必须创建一个自定义操作来封装对build.ps1的调用,以便通过输出返回内容
我认为您可以通过将Powershell的输出回显到控制台来设置它们。Powershell有一个别名映射回显到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 }}
参考:https://help.github.com/en/github/automating-your-workflow-with-github-actions/development-tools-for-github-actions#set-输出参数集输出
除了通过peterevans回答外,您仍然可以使用环境变量作为条件,只要它们是通过:set env"command"设置的
示例:
- 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 env更易于使用(在我看来(的是,您不需要为步骤设置id
(较少键入(,引用vars要短得多(再次键入较少(,您添加的所有变量都将为每个步骤列出(折叠在Run
块内,在尝试查找工作流中的错误时很有用(,以及。。。它最终只是一个正则变量,它可能更容易使用,取决于shell。