在 GitHub Action 工作流中,在推送或合并之前如何获取上一个提交?

20
我在一个新项目中使用 Nx 来支持单体存储库。Nx 的一个好处是它可以确定受一系列更改(起始提交,结束提交)影响的单体存储库中的应用程序。因此,如果您有许多应用程序,只需构建、测试和部署实际受更改影响的应用程序,而不是整个单体存储库。
我想设置一个 GitHub Action 工作流,在 push 或者合并到主分支时只部署受影响的应用程序。但是,我遇到了一个问题,无法确定如何获取“起始提交”以进行更改范围的计算。换句话说,如何获得上次部署的提交哈希值?
GitHub 提供一个环境变量GITHUB_SHA,但这是触发工作流的提交(“结束提交”)。它还提供了GITHUB_BASE_REF,但这仅适用于从 forked 存储库比较到 head 存储库运行的工作流。
CircleCI 为此提供了 pipeline.git.base_revision。GitHub Actions 有类似的东西吗?
2个回答

41

对于拉请求事件,可以在Github上下文中找到基础引用和sha的信息,如下所示。

${{ github.event.pull_request.base.ref }}
${{ github.event.pull_request.base.sha }}

对于推送事件,有base_refbefore参数。

${{ github.event.base_ref }}
${{ github.event.before }}

before 是在分支 base_ref 上推送到远程仓库的最后一个 Git sha.请注意,如果这是新分支上的第一个提交,则base_refbefore 将具有空/默认值,如下所示。

##[debug]  "event": {
##[debug]    "after": "727f7aec97c394083d769029e5f619e9b094a235",
##[debug]    "base_ref": null,
##[debug]    "before": "0000000000000000000000000000000000000000",
...

顺便说一下,您可以在工作流程中添加此步骤,转储github上下文并检查可用参数:

      - name: Dump GitHub context
        env:
          GITHUB_CONTEXT: ${{ toJson(github) }}
        run: echo "$GITHUB_CONTEXT"

1
感谢您提供有关转储Github上下文的有用提示!我尝试了一下,有趣的是,在推送到主分支时,它具有github.event.before的值。我甚至尝试同时推送两个提交,before值也是正确的。不确定为什么这对您没有起作用,但这正是我正在寻找的! - Rich McCluskey
@RichMcCluskey 很高兴你找到了解决方案。我不确定为什么在我的测试中 before 没有值。我稍微更新了答案,以便将来遇到此问题的人可以参考。 - peterevans
1
跟进一下...我注意到新分支的第一次推送将缺少您示例中显示的“before”提交。我想这是有道理的,因为该分支是新的,之前不存在。在这种情况下,我可以只需与主分支进行比较以找到提交范围。 - Rich McCluskey
1
@RohitReddyAbbadi 我认为 GitHub 的工作流默认只会部分克隆存储库的 HEAD 提交,因此您可能需要在工作流中先执行一次 fetch。 - Rich McCluskey
3
@RohitReddyAbbadi 请尝试在 actions/checkout 中添加 fetch-depth: 0。这将获取所有标签和分支的历史记录。请参见此处 - peterevans
显示剩余3条评论

-1

GitHub提供GITHUB_BASE_REFgithub.base_ref上下文,其中包含基础分支。

如果您对该分支的最新修订感兴趣,可以运行git rev-parse $GITHUB_BASE_REF来查找它。如果您对分支分叉的时间点感兴趣,可以运行git merge-base $GITHUB_BASE_REF $GITHUB_SHA来查找它。

请注意,可能会出现与不兼容API更改等的其他项目的破坏而不对它们进行任何代码更改,因此,虽然仅测试已更改的应用程序将更快,但您可能会发现这样做会导致意外破坏。


FYI,Nx 通过理解导入到项目中的依赖项以及配置来确定重新构建哪些项目,以确定什么依赖于什么(如果没有直接的代码导入)。它不仅仅基于更改发生的位置 :) - Rich McCluskey
3
很遗憾,这个答案不起作用。文档说明GITHUB_BASE_REFgithub.base_ref仅适用于派生存储库。但是我的存储库没有被派生。我也进行了测试并验证了文档的正确性。 - Rich McCluskey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接