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

GitHub Actions拉取请求中首个作业输出在第二个作业为空

GitHub Actions拉取请求场景下作业输出为空的问题解决

问题描述

参考Stack Overflow的回答实现了一个包含两个作业的GitHub Actions工作流,第二个作业依赖第一个作业的输出。推送代码时工作流正常运行,但在拉取请求场景下,get_message作业的输出${{ needs.get_message.outputs.commitmsg }}为空。需要获取最后一条提交信息触发条件行为,但拉取请求中无法使用github.event.head_commit.message,当前工作流配置如下:

on:
  push:
    branches:
      - main
      - devl
  pull_request:
    branches:
      - main
      - devl

name: test

jobs:
  get_message:
    runs-on: ubuntu-latest
    outputs:
      commitmsg: ${{ steps.getmsg.outputs.msg }}
    
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
    
      - name: Set tags env variables
        id: getmsg
        run: |
          # Get your last commit message, not the merge commit.
          msg=$(git log -1 --no-merges --pretty=%B) >> $GITHUB_OUTPUT
          echo "commit message: $msg"
        
  test:
    if: "!contains(needs.get_message.outputs.commitmsg, '[skip-ci]')" 
    needs: get_message
    runs-on: ubuntu-latest

    steps:
      - name: test env var
        if: "!contains(needs.get_message.outputs.commitmsg, '[skip-tests]')"
        run: |
          echo "${{ needs.get_message.outputs.commitmsg }}"
          echo "not skipping tests"
          
      - name: test env var2
        if: "contains(needs.get_message.outputs.commitmsg, '[skip-tests]')"
        run: |
          echo "${{ needs.get_message.outputs.commitmsg }}"
          echo "skipping tests"

get_message作业的输出显示提交信息包含[skip-tests],但test作业却打印空字符串。

问题原因

核心错误出在getmsg步骤的输出变量设置上:
当前写法msg=$(git log -1 --no-merges --pretty=%B) >> $GITHUB_OUTPUT是错误的——msg=$(...)已经将git log的输出捕获到变量中,后续的>> $GITHUB_OUTPUT是把空内容(因为变量赋值本身没有输出)追加到输出文件,相当于没有正确向GitHub注册msg这个输出变量。

修复方案

修改getmsg步骤的run命令,用echo "msg=$msg" >> $GITHUB_OUTPUT的形式将变量写入$GITHUB_OUTPUT,这是GitHub Actions设置步骤输出的标准方式:

on:
  push:
    branches:
      - main
      - devl
  pull_request:
    branches:
      - main
      - devl

name: test

jobs:
  get_message:
    runs-on: ubuntu-latest
    outputs:
      commitmsg: ${{ steps.getmsg.outputs.msg }}
    
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
    
      - name: Set tags env variables
        id: getmsg
        run: |
          # Get your last commit message, not the merge commit.
          msg=$(git log -1 --no-merges --pretty=%B)
          echo "msg=$msg" >> $GITHUB_OUTPUT
          echo "commit message: $msg"
        
  test:
    if: "!contains(needs.get_message.outputs.commitmsg, '[skip-ci]')" 
    needs: get_message
    runs-on: ubuntu-latest

    steps:
      - name: test env var
        if: "!contains(needs.get_message.outputs.commitmsg, '[skip-tests]')"
        run: |
          echo "${{ needs.get_message.outputs.commitmsg }}"
          echo "not skipping tests"
          
      - name: test env var2
        if: "contains(needs.get_message.outputs.commitmsg, '[skip-tests]')"
        run: |
          echo "${{ needs.get_message.outputs.commitmsg }}"
          echo "skipping tests"

补充说明

拉取请求场景下,GitHub Actions默认checkout合并后的提交,git log -1 --no-merges可以正确获取PR头部的提交信息,这部分逻辑是正常的。修复后,作业间的输出变量就能正常传递,条件判断也会生效。

内容的提问来源于stack exchange,提问作者Ceres

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:24:51