使用 GitHub Actions 循环多个文件

问题描述 投票:0回答:3

我的存储库的几个子目录中有多个

.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
文件并对其进行操作?

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

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

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
    
  • 剥离文件扩展名

    来自https://stackoverflow.com/a/125340/2467954 或者如何从文件路径中提取目录路径?

    x="filename.md"
    echo ${x%.*} 
    
  • 更改工作目录

    您可以按步骤执行此操作,如果您只是运行命令,则可以使用

    cd
    执行此操作。我没有研究它,但我猜
    docker://pandoc/latex:2.9
    也有工作目录的参数。您需要检查文档。


1
投票

我的简单解决方案是将我想要的操作编码为 python 脚本,并使用操作运行 python 脚本。

这更易于编码,并且具有可在本地计算机上进行测试的优点。


0
投票

截至 2022 年 10 月,

set-output
已弃用,原定于 2023 年 5 月 31 日删除。

虽然删除被延迟,但尝试使用它对我来说没有意义,所以这对我有用。

- name: Finding files
  id: finding-files        
  run: |
    {
      echo 'FILELIST<<EOF'
      find . -name '*.md' -print 
      echo EOF
    } >> "$GITHUB_ENV"
- name: Do something with each file
  run: |
    for i in $FILELIST; do
      echo "Do something with file ${i}"
    done  
© www.soinside.com 2019 - 2024. All rights reserved.