在 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 的输出。 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 }}

参考:https://help.github.com/en/github/automating-your-workflow-with-github-actions/development-tools-for-github-actions#set-an-output-parameter-set-output

除了 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.