bash - 使用 GitHub Actions 循环多个文件

标签 bash pandoc github-actions

我有多个 .md我的存储库的几个子目录中的文件。它们都有相同的命名约定,例如seminar1/slides.md , seminar2/slides.md等这些*.md文件需要使用 pandoc 进行处理。我希望每次提交到存储库时自动执行此操作,并决定将此作为在 Github 上运行的操作来实现。
我已将以下工作流创建为 .yml 文件,GitHub 将其识别为操作。如果我只有一个子目录,它就可以工作,例如 /seminar1/*.md ,但由于更多子目录而失败。

name: Make slides

on: push

jobs:
  convert_via_pandoc:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v2
        with:
          ref: slides
      - run: |
          echo "::set-env name=FILELIST::$(printf '"%s"' seminar*/*.md)"
      - uses: docker://pandoc/latex:2.9
        with:
          args: -t beamer --output=${{env.FILELIST}}.pdf ${{env.FILELIST}}
      - uses: actions/upload-artifact@v2
        with:
          name: seminar-slides
          path: seminar*/*.md.pdf        
如何让脚本检测所有 seminar*/*.md文件并对其采取行动?
另外,我需要一些关于一般可用性的帮助:
  • 所有脚本都从根目录运行。这意味着我必须修改 .md 文件的内容以包含目录,例如seminar1/bridge.jpg而不仅仅是包括 bridge.jpg .如何更改每个 $env.FILELIST 的工作目录?
  • 如何从文件名中去除扩展名并在 $env.FILELIST 中使用它?
  • 最佳答案

    我在使用 Github Actions 搜索解决方案时遇到了类似的问题(抱歉为旧问题添加了答案,但我希望关注我的人可以更轻松地找到这个答案)使用 Github Actions 迭代事物。
    Github Actions 支持用于在作业中迭代的“矩阵”,但它很难使用,而且我无法让它与字符串中的列表一起使用。我找到的唯一可行的解​​决方案是自己拆分字符串并仅使用 bash。
    这是我的解决方案。它不使用 docker://pandoc/latex:2.9但更多的是使概念清晰。

  • 在 Github Actions 中迭代

  • 您有一串逗号分隔值,例如 "a,b,c" .您需要在每一步中将其解析为一个真正的数组并迭代这些值。IFS代表“内部字段分隔符”。 shell 使用它来确定如何进行分词,即。 e.如何识别单词边界。我们使用 read 命令并用我们的数组作为字符串提供它。之后我们只是遍历真实数组。
    name: Looping over values in Github Actions
    
    env:
      VALUE_ARRAY_AS_STRING: 'a.md,b.md,c.md'
    
    jobs:
      run-my-stuff:
        name: Iterating over comma-separated-values
        runs-on: ubuntu-latest
        steps:
          - name: Echo values from ENV
              run: |
                IFS="," read -a myarray <<< ${{ env.VALUE_ARRAY_AS_STRING }}
                for i in "${myarray[@]}"; do
                  echo "Value: ${i}"
                  echo "Value: ${i%.*}"
                done
    
          - name: Finding files and store to output
            id: finding-files
            run: |
              echo "::set-output name=FILELIST::$(find . -name '*.md' -print)"
    
          - name: Processing my found files from output
            run: |
              IFS="," read -a myarray <<< ${{ steps.finding-files.outputs.FILELIST }}
              for i in "${myarray[@]}"; do
                file_path=$(dirname "${i}")
                file_name=$(basename "${i}")
                cd file_path
                cat file_name
              done
    
  • 查找所有 *.md 文件
  • find . -name '*.md' -print
    
  • strip 化文件扩展名

  • 来自 https://stackoverflow.com/a/125340/2467954
    Get file directory path from file path
    x="filename.md"
    echo ${x%.*} 
    
  • 更改工作目录

  • 您可以按步骤或使用 cd 执行此操作如果你只是运行一个命令。我没仔细看,但我猜 docker://pandoc/latex:2.9也有工作目录的参数。您将需要检查文档。

    关于bash - 使用 GitHub Actions 循环多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63115345/

    相关文章:

    linux - Bash脚本移动具有特定名称的前N个文件

    java版本无法识别

    github-actions - 如何使用 Github Actions 手动触发步骤

    git - 使用 GitHub Actions 从远程自动 pull

    bash - 我想使用 bash 将文件名复制到文档中

    bash - 在 BASH 脚本中按顺序读取文件

    markdown - Pandoc 在 Markdown 期间转义 iframe 到 HTML 转换

    当 .bib 文件采用 YAML 格式时,pandoc 不会打印引用

    html - Pandoc Markdown : ignore text in PDF (but include in HTML) Updated?

    continuous-integration - Github 操作 : aws ecr login fails