如何获取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
问题诊断与修复
核心问题
你犯了两个关键错误:
- Bash环境变量语法错误:在Bash中,环境变量应直接用
$GITHUB_OUTPUT访问,你错误地使用了PowerShell语法$env.GITHUB_OUTPUT,导致输出没有正确写入到GitHub Actions的输出文件。 - 复合Action输出配置缺失:你的
action.yml中outputs部分没有指定value字段,无法将内部步骤的输出暴露给调用该Action的工作流。
修复步骤
修正输出写入语法:
将写入输出的代码行修改为:echo "modified-files=$FILTERED_PROJECTS" >> $GITHUB_OUTPUT完善复合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
相关产品推荐
相关产品推荐

