如何在每次提交时运行Github工作流

时间:2020-11-06 03:18:08

标签: github-actions

我有一些要在存储库的每次提交中运行的测试。我的仓库中有以下脚本:

name: CI

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - run: echo "my tests"

不幸的是,如果我向存储库中推送了一些新的提交,则仅在最新的提交之后才运行测试。有没有办法测试所有提交?

2 个答案:

答案 0 :(得分:2)

David Lechneranswer为基础:

name: CI

on: 
  push:
    # only trigger on branches, not on tags
    branches: '**'

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with:
          # checkout full tree
          fetch-depth: 0
      - run: |
          for commit in $(git rev-list ${{ github.event.before}}..${{ github.sha}}); do
              git checkout $commit
              echo "run test"
          done

根据 the docs on the github contextthe docs on the push webhook event data {{github.event.before}} 被推送前的提交 sha 替换。 {{github.sha}}{{github.event.after}} 被推送的最新提交的 sha 替换:

推送事件负载(对于推送标签;docs

{
  "ref": "refs/tags/simple-tag",
  "before": "6113728f27ae82c7b1a177c8d03f9e96e0adf246",
  "after": "0000000000000000000000000000000000000000",
  "created": false,
  "deleted": true,
  "forced": false,
  "base_ref": null,
  "compare": "https://github.com/Codertocat/Hello-World/compare/6113728f27ae...000000000000",
  "commits": [],
  "head_commit": null,
 [...]
}

答案 1 :(得分:0)

为此,可以通过检查单个提交并在单个run:步骤中构建每个提交来实现。

为此,fetch-depth操作的checkout选项必须为0,以检出完整的git树。

我使用GitPython进行了类似的操作,以迭代并签出每次提交。

仅使用git命令行工具,rev-list命令可用于创建提交列表。

棘手的部分是确定提交范围。对于拉取请求,GitHub操作提供了github.head_refgithub.base_ref属性(docs),可用于创建提交范围。但是,这些属性不适用于其他事件,例如push(在这种情况下,github.ref可以与固定的分支名称一起使用,例如origin/main)。

这是一个简单的例子。可能需要对rev-list进行更高级的查询,以处理base_ref不是head_ref祖先的情况,但我将其留给其他SO问题来回答。

name: CI

on: [pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - run: |
          for commit in $(git rev-list ${{ github.base_ref }}..${{ github.head_ref }}); do
              git checkout $commit
              echo "run test"
          done