如何在 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_REF
和 github.base_ref
上下文。
如果您对该分支的最新版本感兴趣,可以运行git rev-parse $GITHUB_BASE_REF
来查找它。如果您对分支的分叉点感兴趣,可以运行git merge-base $GITHUB_BASE_REF $GITHUB_SHA
找到它。
请注意,有可能通过不兼容的 API 更改等破坏其他项目,而无需对其进行任何代码更改,因此虽然只测试已更改的应用程序会更快,但您可能会发现这样做会导致意外破损。
【讨论】:
仅供参考,Nx 通过了解导入到它们的依赖项来确定要重建的项目,并通过配置来说明如果没有直接代码导入,则取决于什么。这不仅仅是基于更改的位置:) 不幸的是,这个答案不起作用。文档说GITHUB_BASE_REF
和 github.base_ref
仅针对分叉存储库设置。我的不是分叉的。我还对其进行了测试并验证了文档是正确的。【参考方案2】:
对于拉取请求事件,base 的 ref 和 sha 可以在 github 上下文中找到,如下所示。
$ github.event.pull_request.base.ref
$ github.event.pull_request.base.sha
对于推送事件,有 base_ref
和 before
参数。
$ github.event.base_ref
$ github.event.before
before
是在分支 base_ref
上推送到源的最后一个 git sha。请注意,如果这是新分支上的第一次提交,base_ref
和 before
将具有如下所示的 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