我的存储库的几个子目录中有多个
.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
文件并对其进行操作?
此外,我需要一些一般可用性方面的帮助:
seminar1/bridge.jpg
而不仅仅是包括 bridge.jpg
。如何更改每个 $env.FILELIST
的工作目录?$env.FILELIST
中使用它?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
也有工作目录的参数。您需要检查文档。
我的简单解决方案是将我想要的操作编码为 python 脚本,并使用操作运行 python 脚本。
这更易于编码,并且具有可在本地计算机上进行测试的优点。
截至 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