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

如何获取GitHub可复用Action的输出?输出无法读取问题排查

问题描述

我正在开发一个可复用GitHub Action,用来获取上次推送后修改的指定类型文件。Action本身运行正常,输出代码(含调试信息)如下:

echo "DEBUG TEST: $FILTERED_PROJECTS"
echo "modified-files=$FILTERED_PROJECTS" >> $GITHUB_OUTPUT

调试日志DEBUG TEST正确输出了$FILTERED_PROJECTS:

DEBUG TEST: _test/folder_noskip/test1.txt,_test/folder_noskip/test2.txt

我编写了如下测试工作流:

name: Get Modified Files

on:
  push:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Action Test
        id: action-test
        uses: user/get-files@v1-alpha
        with:
          commits-json: ${{ toJson(github.event.commits) }}
          git-branch: ${{ github.ref_name }}
          file-type: ".txt"
          file-ignore: ".fileignore"
          
      - name: Check result
        id: result-check
        run: |
          echo "Outputs: ${{ toJson(steps.action-test.outputs) }}"
          echo "Outputted files:"
          MODIFIED_FILES=$(echo ${{ steps.action-test.outputs.modified-files }} | tr ',' '\n')
          echo "$MODIFIED_FILES"
          echo "Raw: ${{ steps.action-test.outputs.modified-files }}"

action-test步骤日志符合预期,但result-check步骤无法获取其输出,日志显示:

Outputs: {}
Outputted files:

Raw: 

开启DEBUG模式后,日志显示Action已正确设置输出:

##[debug]Set output modified-files = _test/folder_noskip/test1.txt,_test/folder_noskip/test2.txt

显然Action输出正常,但后续步骤读不到。请问输出访问方式有误吗?还是有其他阻碍工作流获取输出的问题?附完整action.yml代码:

name: "Get Modified Files"
description: "Fetches modified files based on the current event's commits and filters them."

inputs:
  commits-json:
    description: "The current event's commits in JSON format."
    required: true
  git-branch:
    description: "The branch to fetch for modified files."
    required: true
  file-type:
    description: "The file extension to look for."
    required: false
  file-ignore:
    description: "The file name that, if found, will skip a file in the output."
    required: false
    
outputs:
  modified-files:
    description: "A comma-separated list of modified files."

runs:
  using: "composite"
  steps:
    - name: Get modified files
      id: get-commit-files
      shell: bash
      run: |
        # Gets modified files from the event's commits
        echo -e "\033[36mFetching modified ${{ inputs.file-type }} files in all commits from the event...\033[0m"

        # Output the event's commits.
        COMMITS_COUNT=$(jq '. | length' <<EOF
        ${{ inputs.commits-json }}
        EOF
        )
        if [ -z "$COMMITS_COUNT" ] || [ "$COMMITS_COUNT" -eq 0 ]; then
          echo "::error::Unable to determine the amount of commits in the event."
          exit 1
        fi
        echo -e "\033[36mCommits in the event ($COMMITS_COUNT):\033[0m"
        jq -r '.[].id' <<EOF
        ${{ inputs.commits-json }}
        EOF

        # Ensure the repository is fully fetched to the correct depth
        git fetch --prune --unshallow || true
        git fetch origin "${{ inputs.git-branch }}" --depth="$((COMMITS_COUNT+1))" || true

        # Get all modified files
        PREVIOUS_SHA=$(git rev-parse HEAD~$COMMITS_COUNT)
        CURRENT_SHA=$(jq -r '.[-1].id' <<EOF
        ${{ inputs.commits-json }}
        EOF
        )
        MODIFIED_PROJECTS=$(git diff --name-only $PREVIOUS_SHA..$CURRENT_SHA | grep "${{ inputs.file-type }}$" | sort | uniq || true)
        FILTERED_PROJECTS=""

        # Output modified files and filter by the file-ignore
        echo -e "\033[36mModified files:\033[0m"
        for project in $MODIFIED_PROJECTS; do
          PROJECT_DIR=$(dirname "$project")
          if [ -f "$PROJECT_DIR/${{ inputs.file-ignore }}" ]; then
            echo -e "\033[31m$project (skipped)\033[0m"
          else
            FILTERED_PROJECTS="$FILTERED_PROJECTS$project,"
            echo "$project"
          fi
        done
        FILTERED_PROJECTS=${FILTERED_PROJECTS%,}

        # Handle case where no files are modified
        if [ -z "$FILTERED_PROJECTS" ]; then
          echo -e "\033[33mNo modified ${{ inputs.file-type }} files found in the current event.\033[0m"
        fi
        
        echo "DEBUG TEST: $FILTERED_PROJECTS"
        echo "modified-files=$FILTERED_PROJECTS" >> $env.GITHUB_OUTPUT

问题诊断与修复

核心问题

你犯了两个关键错误:

  1. Bash环境变量语法错误:在Bash中,环境变量应直接用$GITHUB_OUTPUT访问,你错误地使用了PowerShell语法$env.GITHUB_OUTPUT,导致输出没有正确写入到GitHub Actions的输出文件。
  2. 复合Action输出配置缺失:你的action.yml中outputs部分没有指定value字段,无法将内部步骤的输出暴露给调用该Action的工作流。

修复步骤

  1. 修正输出写入语法:
    将写入输出的代码行修改为:

    echo "modified-files=$FILTERED_PROJECTS" >> $GITHUB_OUTPUT
    
  2. 完善复合Action的outputs配置:
    在outputs部分添加value字段,关联到内部步骤的输出:

    outputs:
      modified-files:
        description: "A comma-separated list of modified files."
        value: ${{ steps.get-commit-files.outputs.modified-files }}
    

修正后的关键代码片段

outputs:
  modified-files:
    description: "A comma-separated list of modified files."
    value: ${{ steps.get-commit-files.outputs.modified-files }}

runs:
  using: "composite"
  steps:
    - name: Get modified files
      id: get-commit-files
      shell: bash
      run: |
        # ... 其余代码保持不变 ...
        echo "DEBUG TEST: $FILTERED_PROJECTS"
        echo "modified-files=$FILTERED_PROJECTS" >> $GITHUB_OUTPUT

完成以上修改后,重新测试工作流,result-check步骤即可正常读取到modified-files的输出值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:12:03