我如何在 Github Actions 中运行 Pandoc“转换目录中的所有文件”命令

All*_*len 5 pandoc docker github-actions

我想设置一个 github 操作,当它被推送到 master 时,它会在 repo 上从 pandoc FAQ运行这个命令。我们的目标是使用 pandoc docker 容器将我们 repo 中的所有 md 文件从 md 转换为另一种格式。

这是我到目前为止的地方。在第一个示例中,我没有声明入口点,并且收到错误“/usr/local/bin/docker-entrypoint.sh: exec: line 11: for: not found”。

name: Advanced Usage

on:
  push:
    branches:
      - master

jobs:
  convert_via_pandoc:
    runs-on: ubuntu-18.04
    steps:
      - name: convert md to rtf
        uses: docker://pandoc/latex:2.9
        with:
          args: |
            for f in *.md; do pandoc "$f" -s -o "${f%.md}.rtf"; done
Run Code Online (Sandbox Code Playgroud)

在第二个例子中我们声明entrypoint: /bin/sh,结果是错误“/bin/sh: can't open 'for': No such file or directory”

name: Advanced Usage

on:
  push:
    branches:
      - master

jobs:
  convert_via_pandoc:
    runs-on: ubuntu-18.04
    steps:
      - name: convert md to rtf
        uses: docker://pandoc/latex:2.9
        with:
          entrypoint: /bin/sh
          args: |
            for f in *.md; do pandoc "$f" -s -o "${f%.md}.rtf"; done
Run Code Online (Sandbox Code Playgroud)

我对 git 操作完全是个菜鸟,而不是技术人员,所以我猜这对 SO 社区来说是一个简单的想法。只是尝试一些简单的工作流程自动化。感谢任何明确的初学者反馈。谢谢 - 艾伦

Ste*_*cke 3

我需要对 md 文件进行递归转换以制作可下载包,因此这个答案超出了 OP 的目标。

此 github 操作将:

  1. 创建输出目录 ( mkdir output)
  2. 递归浏览文件夹,在输出目录中创建类似名称的文件夹 ( for d in */; do mkdir output/$d; done)
  3. 递归查找所有 md 文件 ( find ./ -iname '*.md' -type f) 并执行 pandoc 命令 ( -exec sh -c 'pandoc ${0} -o output/${0%.md}.docx' {} \;)

请注意,从在终端中运行的内容转换为作为 github 操作的一部分正确转换为单个 docker 命令的内容时,必须小心使用双引号和单引号。

第一次迭代

jobs:
  convert_via_pandoc:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v2
      - name: convert md to docx
        uses: docker://pandoc/latex:2.9
        with:
          entrypoint: /bin/sh
          args: -c "mkdir output;for d in */; do mkdir output/$d; done;find ./ -iname '*.md' -type f -exec sh -c 'pandoc ${0} -o output/${0%.md}.docx' {} \;"
      - uses: actions/upload-artifact@master
        with:
          name: output
          path: output
Run Code Online (Sandbox Code Playgroud)

该解决方案是使用 @anemyte 的信息和这篇关于递归转换的 SO 帖子开发的

来自 @caleb 的第二次迭代

name: Generate Word docs
on: push

jobs:
  convert_via_pandoc:
    runs-on: ubuntu-20.04
    container:
      image: docker://pandoc/latex:2.9
      options: --entrypoint=sh
    steps:
      - uses: actions/checkout@v2
      - name: prepare output directories
        run: |
          for d in */; do
            mkdir -p output/$d
          done
      - name: convert md to docx
        run: |
          find ./ -iname '*.md' -type f -exec sh -c 'pandoc ${0} -o output/${0%.md}.docx' {} \;
      - uses: actions/upload-artifact@master
        with:
          name: output
          path: output
Run Code Online (Sandbox Code Playgroud)

  • 还有另一种方法可以处理此问题,并将顶级容器设置为 Pandoc 容器,以便具有简单“run:”参数的任何/所有步骤都可以在 Pandoc docker 容器内运行。请参阅[我的评论或您的 PR](https://github.com/pandoc/pandoc-action-example/pull/11/files#r533657106)。 (2认同)