You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Actions中循环执行重复步骤且不重复代码

解决GitHub Actions同环境下复用测试步骤的方案

方案1:自定义复合动作(Composite Action)

把重复的测试步骤封装成本地复合动作,在同一个Job里多次调用并传入不同的FILE参数,既能避免代码重复,又能让每个测试步骤独立显示,方便排查失败原因。

操作步骤:

  1. 在项目根目录创建.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 }}
  1. 在你的工作流文件中,调用这个复合动作,传入不同的文件参数:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:10:08