【问题标题】:How might I run Pandoc 'convert all files in Dir' command in Github Actions我如何在 Github Actions 中运行 Pandoc 'convert all files in Dir' 命令
【发布时间】:2020-12-03 16:54:04
【问题描述】:

我想设置一个 github 操作,当它被推送到 master 时,它在 repo 上运行来自 pandoc FAQ 的 this 命令。我们的目标是使用 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: 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

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

【问题讨论】:

  • 值得注意的是,如果事实上我完全走在正确的轨道上,那么这是我能够走到这一步的唯一原因!
  • 也许你需要像"for f in...."一样引用它并删除“|” ....使它成为一个论点?见github.com/pandoc/dockerfiles#github-actions
  • 谢谢@mb21,我今天试过了,同样的信息。我的猜测是,我缺少的不仅仅是语法,或者一些问题。

标签: docker pandoc github-actions


【解决方案1】:

我需要对 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

这个解决方案是使用@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 ${0} -o output/${0%.md}.docx' {} \;
      - uses: actions/upload-artifact@master
        with:
          name: output
          path: output

【讨论】:

  • 这比用您的解决方案编辑我的答案要好得多。 :)
  • 还有另一种处理方法,也可以将顶级容器设置为 Pandoc 容器,以便使用简单的run: 参数的任何/所有步骤都可以在 Pandoc docker 容器中运行。见my comments or your PR here
【解决方案2】:

如果你只用 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 作为操作字符串的解决方案。

【讨论】:

  • 我无法让这些为我处理 gh 操作,但获取有关 args 等的信息,这确实有效:gist.github.com/stephlocke/7eafab0669b6568d423599b89eff9d43
  • 很高兴您将要点的内容纳入您的答案,以便我可以奖励您:)
  • 这个要点修改了你的 args 和入口点示例 - 至少在我首先让它工作的过程中,我发现 gh 不喜欢这些值的数组
  • 感谢您的反馈。我从答案中删除了那部分。
猜你喜欢
  • 2019-11-05
  • 2021-02-14
  • 2021-04-24
  • 2019-10-19
  • 1970-01-01
  • 2023-02-21
  • 2020-05-13
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多