我如何 运行 Pandoc 'convert all files in Dir' 在 Github 操作中执行命令

How might I run Pandoc 'convert all files in Dir' command in Github Actions

我想设置一个 github 操作,当它被推送到 master 时,它运行来自 pandoc 常见问题解答的 this 命令。我们的 objective 是使用 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

在第二个示例中,我们声明了 entrypoint: /bin/sh,结果是错误“/bin/sh:无法打开 'for':没有这样的文件或目录”

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

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

如果你只用 shell:

就可以让你的生活更轻松
name: Advanced Usage

on:
  push:
    branches:
      - master

jobs:
  convert_via_pandoc:
    runs-on: ubuntu-18.04
    steps:
      - name: convert md to rtf
        run: |
          docker run -v $(pwd):/data -w /data pandoc/latex:2.9 sh -c 'for f in *.md; do pandoc "$f" -s -o "${f%.md}.rtf"; done'

-v 键将当前工作目录挂载到容器内的 /data-w 键使 /data 成为工作目录。您自己编写的所有其他内容。

您面临的问题是您的 args 被解释为一系列参数。 Docker 接受 entrypointcmd(在本例中为 args)作为字符串或字符串数​​组的参数。如果它是一个字符串,它将被解析以创建一个元素数组。 for 成为该数组的第一个元素,并且由于第一个元素是可执行文件,它试图执行 for 但失败了。

很遗憾,此时发现该动作不支持元素数组。检查@steph-locke 的答案以找到正确的 args 作为操作字符串的解决方案。

我需要对 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 [=15=] -o output/${0%.md}.docx' {} \;)

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

第一次迭代

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 [=10=] -o output/${0%.md}.docx' {} \;"
      - uses: actions/upload-artifact@master
        with:
          name: output
          path: output

此解决方案是使用@anemyte 的信息和此 SO post on recursive conversion

开发的

@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 [=11=] -o output/${0%.md}.docx' {} \;
      - uses: actions/upload-artifact@master
        with:
          name: output
          path: output