我有一些要在存储库的每次提交中运行的测试。我的仓库中有以下脚本:
name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: echo "my tests"
不幸的是,如果我向存储库中推送了一些新的提交,则仅在最新的提交之后才运行测试。有没有办法测试所有提交?
答案 0 :(得分:2)
以David Lechner的answer为基础:
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
context 和 the 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_ref
和github.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