You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 }}

尝试替换的命令:

  1. echo "MY_OUTPUT=${{ steps.checkout_step.outcome }}" >> $env:GITHUB_ENV
  2. echo "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下推荐以下两种写法:

  1. 使用Out-File避免编码问题:
echo "MY_OUTPUT=${{ steps.checkout_step.outcome }}" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
  1. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:50:32