如何在简单的 setup-lint-test-e2e-build 场景中优化 github 操作?

Mic*_*elB 5 github github-actions

如果我们要使用最少的资源,执行这些步骤将类似于:

setup --- 签出,通过缓存安装固定版本

然后并行触发1个命令运行:

  • 皮棉
  • 测试
  • 电子到电子

全部并行。

不幸的是,根据我发现的当前选项,我能找到的最佳方案是为 lint、测试、e2e 提供一个单独的工作流程文件,由主工作流程调用,并在成功构建工件后。

这个问题是。

  • 结帐将运行 3 次。
  • 安装命令将运行 3 次。

这可以通过缓存来缓解,但是每个作业的这些步骤仍然需要 10-15 秒的额外时间。

有没有办法优化它并仍然保留可重用的步骤?

即使我将所有内容保留在 1 个巨大文件中,我仍然会将 lint、测试、e2e 步骤定义为单独的作业,而不是作业的 1 个单步部分。

我们可以调用“工作流程”并以某种方式在同一环境中运行它吗?

小智 2

此示例调用 checkout 并使用 ${{ github.run_id }} 缓存存储库,以防止缓存与其他运行发生冲突。然后,子工作流程将使用缓存来代替签出。e2e、test 和 lint 将等待创建缓存,然后并行运行。

根据您的用例,为每个 run_id 创建新的缓存可能会过多,您可以根据需要进行调整。如果您追求的是速度,我还建议仅缓存子工作流程所需的文件,而不是像我在下面的示例中所做的那样采取一切。

name: main_caller
on: workflow_dispatch
jobs:
cache_checkout:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v3
    - uses: actions/upload-artifact@v3
      with:
        name: my-checkout-${{ github.run_id }}
        path: ${{ github.workspace }}/**/*

run_lint:
  needs: cache_checkout
  uses: ./.github/workflows/lint.yml

run_test:
  needs: cache_checkout
  uses: ./.github/workflows/test.yml
  
Run Code Online (Sandbox Code Playgroud)

./.github/workflows/lint.yml 示例:(e2e 和测试将遵循此模式)

name: lint
on: workflow_call
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - name: Get Cached Checkout
        uses: actions/download-artifact@v3
        with:
          name: my-checkout-${{ github.run_id }}
      - name: Do linting things
        run: echo "I'm linting!"
 
Run Code Online (Sandbox Code Playgroud)