GitHub Actions:如何像合并一样构建拉取请求?

Posted

技术标签:

【中文标题】GitHub Actions:如何像合并一样构建拉取请求?【英文标题】:GitHub Actions: how to build a pull request as if it were merged? 【发布时间】:2020-01-01 04:21:57 【问题描述】:

我对 GitHub Actions 感到非常兴奋。

我现在使用 Travis-CI 和 AppVeyor,它们具有“PR”(拉取请求)构建,可以像合并拉取请求一样构建代码。

我想使用 GitHub Actions 进行持续集成,但似乎 GitHub Actions 仅支持构建推送的提交,而不是合并的结果。如何达到我想要的效果?

【问题讨论】:

【参考方案1】:

根据https://github.com/actions/checkout/issues/15#issuecomment-524093065 和https://github.com/actions/checkout/issues/15#issuecomment-524107344,如果您将工作流设置为触发pull_request 事件而不是push 事件,则GITHUB_SHA 将是合并提交,因此checkout 操作将检查合并的结果,然后您可以在其上构建和运行单元测试。

它也被正式记录在here:

GITHUB_SHA = GITHUB_REF 分支上的最后一次合并提交GITHUB_REF = PR 合并分支refs/pull/:prNumber/merge

免责声明:我还没有进入测试版,所以我无法亲自验证此信息;我可以将其他人所说的对他们有用的东西传递出去。

我现在已经进入测试版,所以我可以确认这是可行的。我在my test repo 中运行了以下工作流的构建:

name: Build PR

on: [pull_request]

jobs:
  build:

    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macOS-latest]
        dotnet: [2.2.402, 3.0.100-rc1-014190]
    runs-on: $ matrix.os 
    
    steps:
    # ... trimmed ...
    - name: Dump GitHub context
      env:
        GITHUB_CONTEXT: $ toJson(github) 
      run: echo "$GITHUB_CONTEXT"
      if: runner.os != 'Windows'
    # ... trimmed ...

Here's a build log of that workflow running。公关是here;该 PR 的第一个提交是提交 ID ec81c6f:

当我运行git fetch origin pull/10/merge:merge-pr-10 来获取合并提交时,我得到的提交是f1ea865,这是ec81c6f44a09bc 的合并(这是当时我的master 分支上的最新提交) PR 已创建)。并注意实际构建的 SHA:

因此,只需使用 on: [pull_request] 作为我的工作流程的触发事件,它就完成了我想要的。如果您查看the PR's history,您会发现我尝试了几件事来查看是什么触发了新构建:添加评论、关闭存储库、打开存储库...这是我发现的。

添加评论不会触发新的工作流程运行 推送新的提交 DID 触发新的工作流运行 关闭 PR 确实不会触发新的工作流运行 重新打开 PR DID 触发新的工作流运行 向 PR 添加标签不会触发新的工作流运行 从 PR 中删除标签不会触发新的工作流运行

这一切都如我所料。

【讨论】:

推送新提交到 master 是否触发了管道?它应该是因为合并结果会不同 每次目标分支有新的提交时,管道是否会再次运行,直到 PR 被合并?

以上是关于GitHub Actions:如何像合并一样构建拉取请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用可重用的Github Actions和Heroku构建简单的部署管道

如何使用 GitHub Actions 对构建工件进行版本化?

在 Github 中合并拉取请求时触发 Jenkins 构建

GitHub Actions 上的 SwiftLint 安装步骤失败

GitHub Actions:如何通过终端访问当前构建的日志

如何在 GitHub Actions 中构建的 Dockerfile 中使用 github 令牌并尝试克隆私有存储库?