如何在GitHub Actions中循环执行重复步骤且不重复代码
解决GitHub Actions同环境下复用测试步骤的方案
方案1:自定义复合动作(Composite Action)
把重复的测试步骤封装成本地复合动作,在同一个Job里多次调用并传入不同的FILE参数,既能避免代码重复,又能让每个测试步骤独立显示,方便排查失败原因。
操作步骤:
- 在项目根目录创建
.github/actions/run-test/action.yml文件,内容如下:
name: 'Run Test for Specific File' description: '执行指定文件的测试命令' inputs: test-file: description: '要测试的文件路径' required: true runs: using: 'composite' steps: - name: 执行测试 - ${{ inputs.test-file }} shell: bash run: | run test ${{ inputs.test-file }}
- 在你的工作流文件中,调用这个复合动作,传入不同的文件参数:
jobs: test-job: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 构建运行环境 run: | # 这里写你的环境构建命令,比如安装依赖 npm install - name: 测试file1 uses: ./.github/actions/run-test with: test-file: 'file1.js' - name: 测试file2 uses: ./.github/actions/run-test with: test-file: 'file2.js' - name: 测试file3 uses: ./.github/actions/run-test with: test-file: 'file3.js' - name: 保存测试日志 run: | # 这里写保存日志的命令 cp logs/ test-logs/
这样构建环境和日志保存步骤只会执行一次,每个测试步骤独立展示,在GitHub Actions页面能单独查看每个测试的执行结果。
方案2:动态生成测试步骤
如果需要测试的文件数量较多,可以借助actions/github-script动态生成测试步骤,减少手动编写重复调用的工作量:
jobs: test-job: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 构建运行环境 run: npm install - name: 生成测试步骤配置 id: generate-tests uses: actions/github-script@v7 with: script: | const testFiles = ['file1.js', 'file2.js', 'file3.js']; const stepConfigs = testFiles.map(file => ({ name: `执行测试 - ${file}`, command: `run test ${file}` })); core.setOutput('steps', JSON.stringify(stepConfigs)); - name: 批量执行测试 uses: actions/github-script@v7 with: script: | const steps = JSON.parse(`${{ steps.generate-tests.outputs.steps }}`); for (const step of steps) { await core.group(step.name, async () => { await exec.exec(step.command); }); } - name: 保存测试日志 run: cp logs/ test-logs/
每个测试会以分组形式在GitHub Actions页面展示,既能批量管理测试,也能单独查看单个测试的执行细节。
内容的提问来源于stack exchange,提问作者rzlvmp
相关产品推荐
相关产品推荐

