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

Posted

技术标签:

【中文标题】如何在 GitHub Action 工作流程中推送或合并之前获取上一个提交?【英文标题】:How can I get the previous commit before a push or merge in GitHub Action workflow? 【发布时间】:2020-09-03 17:29:01 【问题描述】:

我正在使用 Nx 为新项目提供 monorepo 支持。 Nx 的一个好处是它可以确定 monorepo 中的哪些应用程序受到一系列更改(开始提交、结束提交)的影响。因此,如果您有一堆应用程序,您只需构建、测试和部署实际受更改影响的应用程序,而不是整个 monorepo。

我想设置一个 GitHub Action 工作流程,仅在推送或合并到主应用时部署受影响的应用。但是,我无法弄清楚如何获得更改范围的“开始提交”。换句话说,我如何获得上次部署的提交哈希?

GitHub 提供了一个环境变量 GITHUB_SHA,但这是触发工作流的提交(即“结束提交”)。它还提供GITHUB_BASE_REF,但仅适用于从分叉存储库运行的工作流,与头存储库相比。

CircleCI 为此目的有pipeline.git.base_revision。 GitHub Actions 有类似的东西吗?

【问题讨论】:

【参考方案1】:

GitHub 提供了包含基本分支的 GITHUB_BASE_REFgithub.base_ref 上下文。

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

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

【讨论】:

仅供参考,Nx 通过了解导入到它们的依赖项来确定要重建的项目,并通过配置来说明如果没有直接代码导入,则取决于什么。这不仅仅是基于更改的位置:) 不幸的是,这个答案不起作用。文档说 GITHUB_BASE_REFgithub.base_ref 仅针对分叉存储库设置。我的不是分叉的。我还对其进行了测试并验证了文档是正确的。【参考方案2】:

对于拉取请求事件,base 的 ref 和 sha 可以在 github 上下文中找到,如下所示。

$ 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 将具有如下所示的 null/默认值。

##[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"

【讨论】:

感谢有关转储 github 上下文的有用提示!我试过了,有趣的是,它在推送到 master 时具有 github.event.before 的值。我什至尝试一次推送两个提交,并且之前的值是正确的。不知道为什么这对你不起作用,但这正是我想要的! @RichMcCluskey 很高兴您找到了解决方案。不知道为什么 before 在我测试时没有值。我已经为将来发现此问题的任何人稍微更新了答案。 跟进...我注意到新分支的第一次推送将丢失 before 提交,如您的示例所示。我想这是有道理的,因为分支是新的并且以前不存在。在这种情况下,我可以与 master 进行比较以找到提交范围。 @RohitReddyAbbadi 我认为默认情况下 GitHub 工作流程仅在 HEAD 提交时部分克隆存储库,因此您可能必须先在工作流程中进行 fetch @RohitReddyAbbadi 尝试将fetch-depth: 0 添加到actions/checkout。这会获取标签和分支的所有历史记录。见here

以上是关于如何在 GitHub Action 工作流程中推送或合并之前获取上一个提交?的主要内容,如果未能解决你的问题,请参考以下文章

在 CircleCI 工作流或作业之后触发 Github Action

如何在每次推送提交时在 GitHub 工作流程中运行 commitlint

如何在 yml 文件中的 Github Action 中部署 docker 容器?

如何知道要使用哪个版本的 GitHub Action

github webhook 是如何工作的?

Github 操作失败