Windows自托管Runner替换::set-output后跨Job输出为空的问题
问题描述
在Windows自托管Github Actions Runner上,需获取前一个Job中步骤的执行结果。原本使用已废弃的::set-output命令可正常实现需求(最后步骤打印"success"),但替换为写入GITHUB_ENV的两种方式后,出现输出变量OUTPUT1为空、打印步骤报错的情况。
原工作流代码:
name: Debug workflow on: workflow_dispatch jobs: job1: runs-on: tester-1 outputs: output1: ${{ steps.step1.outputs.MY_OUTPUT }} steps: - name: Checkout with submodules id: checkout_step uses: actions/checkout@v3 - name: Write variable to output id: step1 run: echo '::set-output name=MY_OUTPUT::${{ steps.checkout_step.outcome }}' job2: runs-on: tester-1 needs: job1 env: OUTPUT1: '${{needs.job1.outputs.output1}}' steps: - name: Print outputs from previous run: echo ${{ env.OUTPUT1 }}
尝试替换的命令:
echo "MY_OUTPUT=${{ steps.checkout_step.outcome }}" >> $env:GITHUB_ENVecho "MY_OUTPUT=${{ steps.checkout_step.outcome }}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
报错信息:
Run echo echo shell: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.EXE -command ". '{0}'" env: OUTPUT1: Write-Output : Cannot process command because of one or more missing mandatory parameters: InputObject. At C:\tester-1-runner\_work\_temp\a19d4f45-cf0e-4ddb-b62e-4f05a2f00461.ps1:2 char:1 + echo + ~~~~ + CategoryInfo : InvalidArgument: (:) [Write-Output], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingMandatoryParameter,Microsoft.PowerShell.Commands.WriteOutputCommand Error: Process completed with exit code 1.
问题原因与解决方法
核心原因
混淆了GITHUB_ENV和GITHUB_OUTPUT的用途:
- 原
::set-output的作用是给步骤的outputs赋值,供后续步骤、跨Job引用; - 写入
GITHUB_ENV仅能设置当前Job内的环境变量,无法被steps.step1.outputs.MY_OUTPUT读取,导致job1的outputs为空,进而使job2的OUTPUT1变量无值。
报错的直接触发点:当OUTPUT1为空时,PowerShell的echo(即Write-Output)命令缺少必填输入对象,因此抛出错误。
正确替换方案
要给步骤outputs传值,需写入GITHUB_OUTPUT文件,Windows PowerShell下推荐以下两种写法:
- 使用
Out-File避免编码问题:
echo "MY_OUTPUT=${{ steps.checkout_step.outcome }}" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
- 使用
Add-Content命令:
Add-Content -Path $env:GITHUB_OUTPUT -Value "MY_OUTPUT=${{ steps.checkout_step.outcome }}" -Encoding utf8
修正后的完整工作流
name: Debug workflow on: workflow_dispatch jobs: job1: runs-on: tester-1 outputs: output1: ${{ steps.step1.outputs.MY_OUTPUT }} steps: - name: Checkout with submodules id: checkout_step uses: actions/checkout@v3 - name: Write variable to output id: step1 run: Add-Content -Path $env:GITHUB_OUTPUT -Value "MY_OUTPUT=${{ steps.checkout_step.outcome }}" -Encoding utf8 job2: runs-on: tester-1 needs: job1 env: OUTPUT1: '${{needs.job1.outputs.output1}}' steps: - name: Print outputs from previous run: echo ${{ env.OUTPUT1 }}
内容的提问来源于stack exchange,提问作者YogoWafel
相关产品推荐
相关产品推荐

