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

