使用 GitHub Actions 循环多个文件

And*_*ton 9 bash pandoc github-actions

我的存储库的几个子目录中有多个.md文件。它们都有相同的命名约定,例如seminar1/slides.mdseminar2/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        
Run Code Online (Sandbox Code Playgroud)

如何让脚本检测所有文件seminar*/*.md并对其进行操作?

另外,我需要一些一般可用性方面的帮助:

  1. 所有脚本都从根目录运行。这意味着我必须修改 .md 文件的内容以包含该目录,例如,而seminar1/bridge.jpg不仅仅是包含bridge.jpg. 如何更改每个的工作目录$env.FILELIST
  2. 如何从文件名中删除扩展名并在 中使用它$env.FILELIST

小智 4

GitHub Actions 支持“矩阵”在作业中进行迭代,但它很难使用,而且我无法让它处理字符串中的列表。我发现的唯一可行的解​​决方案是自己拆分字符串并仅使用 bash。

这是我的解决方案。它不使用docker://pandoc/latex:2.9,但更多的是使概念清晰。

  • 在 GitHub Actions 中迭代

    您有一个逗号分隔值的字符串,例如"a,b,c". 您需要在每一步中将其解析为真实数组并迭代这些值。

    IFS代表“内部字段分隔符”。shell 使用它来确定如何进行分词,即如何识别单词边界。我们使用 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
    
    Run Code Online (Sandbox Code Playgroud)
  • 查找所有 *.md 文件

    find . -name '*.md' -print
    
    Run Code Online (Sandbox Code Playgroud)
  • 剥离文件扩展名

    来自/sf/answers/8773831/如何从文件路径中提取目录路径?

    x="filename.md"
    echo ${x%.*} 
    
    Run Code Online (Sandbox Code Playgroud)
  • 更改工作目录

    您可以按步骤执行此操作,也可以cd仅运行命令来执行此操作。我没有研究它,但我猜想docker://pandoc/latex:2.9工作目录也有一个参数。您需要检查文档。