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

GitHub Action调用Pandoc Docker执行脚本报错的排查与修复

问题修复方案

错误根源解析

  1. 镜像ENTRYPOINT冲突:pandoc/latex官方镜像默认ENTRYPOINT是pandoc,直接传递bash ./pandoc.sh会被当成pandoc的命令参数,导致pandoc尝试读取名为bash的文件,触发does not exist错误。
  2. 脚本语法与逻辑错误:原pandoc.sh中GNU Parallel的命令格式错误,变量引用、循环写法不符合parallel的语法要求,且未正确处理多文件参数。
  3. 文件列表传递失效:PowerShell输出的变更文件列表是换行分隔,直接传递给bash会导致多文件被识别为单个参数,parallel无法处理多个文件。

具体修复步骤

1. 修正Docker运行命令(覆盖ENTRYPOINT)

修改convert.yaml中Run Pandoc in Docker步骤的命令,指定bash为镜像入口点,确保脚本被正确执行:

- name: Run Pandoc in Docker
  run: >-
    docker run
    --rm -v ${{ github.workspace }}:/workspace
    -w /workspace
    --entrypoint bash
    pandoc/latex:3.5
    ./pandoc.sh ${{ env.list_changed_files }}

2. 修复pandoc.sh脚本语法与逻辑

替换原脚本内容,修正parallel命令格式、变量引用及多文件处理逻辑:

#!/bin/bash
# 仅启用--standalone的输出格式列表,可按需扩展
Only_Standalone_Output_Types="latex pdf html docx odt"

# 接收所有传入的文件参数
files=("$@")

# 用GNU Parallel并行处理每个文件
parallel --jobs 0 '
    # 生成AST抽象语法树(复用以提升效率)
    pandoc --from markdown --to native "./{}" -o "./{.}.ast"
    # 循环生成各类格式文件
    for ext in '"${Only_Standalone_Output_Types}"'; do
        pandoc --from native "./{.}.ast" --standalone -o "./{.}.$ext"
    done
    # 删除临时AST文件
    rm "./{.}.ast"
' ::: "${files[@]}"

关键修改点:

  • 用"$@"接收多文件参数,支持含空格的文件名
  • 调整parallel命令结构,确保循环逻辑在并行任务中正确执行
  • 修正输出文件名:{.}表示去掉原文件扩展名的名称,避免生成如file.md.pdf的错误路径

3. 修正文件列表输出格式(PowerShell部分)

修改convert.yaml中condition_check_files步骤的PowerShell脚本,将换行分隔的文件列表转为空格分隔,确保bash能正确识别多参数:

# 原输出部分替换为:
$FilesDiffStr = $FilesDiff -join ' '
echo "bool_files_changed=$HasDiff" >> $env:GITHUB_OUTPUT
echo "list_changed_files=$FilesDiffStr" >> $env:GITHUB_OUTPUT

验证要点

  1. 确保Docker命令中--entrypoint bash已添加,避免pandoc误解析命令参数
  2. 测试多文件变更场景,确认parallel能同时处理多个Markdown文件
  3. 检查生成的输出文件路径是否正确(如content/file.md对应生成content/file.pdf等)

内容的提问来源于stack exchange,提问作者GH-MK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 07:57:36