如何通过文件夹动态并行化 github 操作测试?

1 github github-actions

我想通过 Github 操作对每个 PR 运行测试。

我的 Github 存储库结构是

根目录

  • 子目录
    • 子目录
      • Java模块目录
  • 子目录
    • 子目录
      • Java模块目录
  • 子目录
    • 子目录
      • Java模块目录
  • ...

在这种情况下,我只想测试 Java 模块。

我不想将存储库创建为多模块项目

原因是它要与其他语言结合使用,所以存储库看起来像是基于Java的不太好。

无论如何,按子目录运行 Java 测试

我是否必须将该目录写入工作流程文件才能运行它?

是否可以动态查找并执行基于 Java 的目录?

(基于 Java 的目录可能带有“Java-”前缀)

我用 GitHub 动作工作流设置矩阵 目录描述进行了测试。

我想在Github Action中动态目录Testing

ret*_*hab 7

您可以动态创建第一个作业中矩阵的输入,然后将其用作第二个作业中矩阵的输入。

对于所有测试目录都在目录调用中的项目tests,您可以像这样收集目录:

collect_dirs:
  runs-on: ubuntu-latest
  outputs:
    dirs: ${{ steps.dirs.outputs.dirs }}
  steps:
    - uses: actions/checkout@v2
    - id: dirs
      run: echo "dirs=$(ls -d tests/*/ | jq --raw-input --slurp --compact-output 'split("\n")[:-1]')" >> ${GITHUB_OUTPUT}
Run Code Online (Sandbox Code Playgroud)

这里棘手的部分是如何构造输出dirs

  • 首先我们列出目录下的所有目录tests/
  • 其次,jq 将输出格式化为 JSON 数组。例如,如果目录包含子目录abc,则输出设置为["a","b","c"]

在第二项工作中,您可以使用基于该输出的矩阵:

run_tests:
  needs: collect_dirs
  runs-on: ubuntu-latest
  strategy:
    matrix:
      dir: ${{ fromJson(needs.collect_dirs.outputs.dirs) }}
  steps:
    - run: echo ${{ matrix.dir }}
Run Code Online (Sandbox Code Playgroud)