GitHub复合动作如何输出多行文本至订阅工作流?
解决GitHub复合动作多行文本输出问题
问题根源
直接通过echo "KEY=VALUE"写入GITHUB_OUTPUT或GITHUB_ENV时,多行文本里的换行、特殊字符会破坏GitHub的变量解析格式,导致报错;用EOF时未加双引号输出变量,会丢失换行;Base64编码时未禁用自动换行,导致编码内容被拆分,触发格式错误。
方案1:EOF语法保留完整换行
修改EOF写法,确保输出变量时用双引号包裹,保留所有换行和特殊字符:
FOLDER=$(ls -d */ | grep -E '^my-dynamically-named-artifact-folder-*') FILE_PATH="${FOLDER}file.txt" echo "FILE_PATH=$FILE_PATH" >> "$GITHUB_ENV" # 读取文件内容 if [ -f "$FILE_PATH" ]; then FILE_TEXT=$(cat "$FILE_PATH") else FILE_TEXT="report.txt does not exist" fi # 正确写入GITHUB_OUTPUT echo 'FILE_TEXT<<EOF' >> "$GITHUB_OUTPUT" echo "$FILE_TEXT" >> "$GITHUB_OUTPUT" echo 'EOF' >> "$GITHUB_OUTPUT" # 写入GITHUB_ENV同理 echo 'FILE_TEXT<<EOF' >> "$GITHUB_ENV" echo "$FILE_TEXT" >> "$GITHUB_ENV" echo 'EOF' >> "$GITHUB_ENV"
- 关键:
echo "$FILE_TEXT"必须用双引号包裹,否则Shell会把换行替换成空格,导致文本变成单行。 - 订阅工作流中直接引用输出即可:
${{ steps.your-action-step-id.outputs.FILE_TEXT }},GitHub会自动保留换行格式。
方案2:Base64编码避免格式冲突
如果文本包含大量特殊字符(比如引号、反斜杠),Base64编码是更稳妥的方式,注意禁用编码后的自动换行:
FOLDER=$(ls -d */ | grep -E '^my-dynamically-named-artifact-folder-*') FILE_PATH="${FOLDER}file.txt" # 读取并编码文件内容,-w 0禁用自动换行 if [ -f "$FILE_PATH" ]; then B64=$(cat "$FILE_PATH" | base64 -w 0) else B64=$(echo "report.txt does not exist" | base64 -w 0) fi echo "B64=$B64" >> "$GITHUB_OUTPUT"
订阅工作流中解码还原:
# 解码并获取原始文本 ORIGINAL_TEXT=$(echo "${{ steps.your-action-step-id.outputs.B64 }}" | base64 -d) # 写入Issue示例 gh issue create --title "生成报告" --body "$ORIGINAL_TEXT"
注意事项
- 避免直接用
echo "KEY=$VALUE"写入多行文本,除非你能确保文本没有换行和特殊字符。 - 操作
GITHUB_OUTPUT和GITHUB_ENV文件时,始终用双引号包裹路径(比如"$GITHUB_OUTPUT"),防止路径含特殊字符时出错。 - 用
cat读取文件比$(<file)更稳妥,兼容性更好。
内容的提问来源于stack exchange,提问作者Mixchange
相关产品推荐
相关产品推荐

