在由
push
事件触发的 GitHub Actions 工作流程中,我想使用 actions/checkout
操作来获取推送事件中所有提交的 git 历史记录,以及推送事件之前的最后一次提交(无需获取整个历史)。
但是,actions/checkout 只提供了
fetch-depth
参数,该参数输入要获取的提交次数,但这是未知的。推送事件负载包含作为数组的提交列表,但 GitHub Actions 中没有本地函数来计算数组的长度。人们可以在使用 checkout 来计算有效负载中的提交数量之前编写一个额外的步骤,但这似乎有点太老套了。
是否有一种直接的方法来获取推送事件之前的历史记录?这似乎是一件很常见的事情,所以奇怪的是我找不到一种简单的方法来做到这一点,比如:
- needs: actions/checkout@v3
with:
- from-ref: ${{ github.event.before }}
目前,这是我的解决方法:
jobs:
my-job:
runs-on: ubuntu-latest
steps:
- name: Calculate fetch-depth
id: pre-checkout
env:
COMMITS: ${{ toJson(github.event.commits) }}
run: |
if [[ "${{ github.event_name }}" == "push" ]]; then
COUNT=$(( $(echo "$COMMITS" | jq length) + 1 ))
else
COUNT=1
fi
echo "fetch-depth=$COUNT" >> "$GITHUB_OUTPUT"
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: ${{ steps.pre-checkout.outputs.fetch-depth }}
正如问题中提到的,在使用
actions/checkout
计算 fetch-depth
之前需要一个额外的步骤。在这里,我们首先检查 github.event_name
上下文;如果是 push
,则输出 github.event.commits
数组的长度加 1,否则输出 1,然后在 checkout
步骤中使用此输出作为 fetch-depth
参数。
这并不漂亮,但目前这是我能找到的最简单的方法。我在
actions/checkout
中打开了一个问题以添加本机支持:https://github.com/actions/checkout/issues/1444
我能为
pull_requests
找到的更干净的方法是:
jobs:
my-job:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: $(( ${{ github.event_name == 'pull_request' && github.event.pull_request.commits || 0 }} + 1 ))
使用文档中提到的三元运算。所以我们不需要额外的步骤。
您也可以对
push
使用相同的格式,但需要更改事件名称和提交计数。