如何配置Travis-CI以在没有冗余的情况下构建拉取请求和合并到主分支

81
以“BDD”的术语来说:
背景: 给定我正在为一个 GH 存储库做贡献
当我创建一个拉取请求时, 那么 Travis 应该构建最新的提交。
当我推送到现有的拉取请求时, 那么 Travis 应该构建最新的提交。
当我将拉取请求合并到主分支时, 那么 Travis 应该构建主分支。
我被 Travis-CI 的 "build pushes" 和 "build PRs" 设置所困惑,因为:
启用这两个选项会导致每个拉取请求被 Travis 构建两次, 一次是针对该分支上的提交, 另一次是针对该分支合并到其目标分支的合并提交。
只启用 "build PRs" 会导致构建 PRs,但不会在合并后进行构建(即在主分支上)。
启用 "pushes" 可以通过构建所有对存储库的推送来满足上述标准。您可以尝试通过白名单和黑名单分支来调整设置,但除非您严格遵守分支名称,否则可能会遇到麻烦。
这在 Travis-CI 文档GH 问题#3241 中有更详细的说明。
有人知道满足上述标准的配置吗?

分支构建和PR构建是不同的构建,可能会有不同的结果。分支构建只是分支的顶端。PR构建是将分支合并到主分支的顶端。这实际上就是在该点将分支合并到主分支时所发生的情况。如果自从打开分支以来已经将其他内容合并到主分支中,因此无法进行快进式合并,则与分支构建不同。 - Daniel Stevens
6个回答

110

我最终找到了另一个 GH 问题(#2111),这给了我尝试启用PR和推送的想法,但是使用白名单来限制推送到特定分支。这似乎满足了我的工作流程的标准。以下是我的做法:

  1. 在仓库的Travis设置中启用PR和分支推送:

travis push/pr settings enabled

  1. 更改.travis.yml文件,将主分支master加入白名单(即只构建推送到主分支的代码):
branches:
  only: 
    - master
  1. 通过创建一个包含.travis.yml更改的PR和另一个包含空提交以验证它也适用于forks的PR来测试它。

  2. 验证从主分支成功合并的构建

build result of merge to master


确认这项工作。请查看此 pull request - Brandon Bradley
5
这对于指向除“master”以外的其他东西的子功能分支PR仍然适用吗?我认为这依赖于Travis的PR构建环境变量的奇怪问题,不适用于该情况。 - fotinakis
我相信它应该可以,因为它被配置为构建所有拉取请求(无论基础分支如何),但仅限于构建对master推送 - Brian Gerstle
@fotinakis - GitHub中有三个选项对应于三种不同类型的合并。选择保留所有子分支/功能以将它们包含在推送中的选项。然后,您可能需要在travis.yml上进行操作,以获取特定的分支/功能或排除它们。 - user2347763
1
这对于不针对主分支的拉取请求无效 - 它们根本无法构建。 - Corey Noel

18

刚在travis文档中发现

将其添加到.travis.yml中

if: type = push

或者:

if: type = pull_request

这个问题,但是下面的@Corey Noel给出了一个更完整的答案,我用来解决我们的问题。 - John Gardner

14
假设您想要构建所有 PR,类似以下代码可以实现。在设置页面上启用分支和PR构建,并将此行作为travis.yml文件中的第一行: if: (type = push AND branch IN (master, dev)) OR (type = pull_request AND NOT branch =~ /no-ci/) 这将尝试在所有推送上进行push构建,以及在推送到打开的PR时进行PR构建,但会过滤掉不符合条件的构建。您可能需要稍微修改一下这个条件 - 不构建名称中包含no-ci的分支是可选的,您可能没有两个总是要运行构建的分支。
您可以在Travis网站上阅读有关条件条件构建的更多信息。

谢谢,这正是我们所需要的! - vvkuznetsov

4

2

如果您想测试不仅是master分支,还有其他分支,可以使用下面的工作流程:

  • Keep both "Build pushes" and "Build pull requests" ON
  • Add branches:except directive to your .travis.yml:

    branches:
      except:
        - /^pr\..*/
    
在这个配置中:
  • 对分支feature-A的任何提交都会触发构建
  • 对分支pr.feature-A的任何提交都不会触发构建
  • 如果在打开的拉取请求中使用了分支pr.feature-A,则会触发构建

工作流示例

  • 临时WIP分支由多个开发人员共享:wip.feature-A,此分支上的任何提交都将触发构建
  • 当分支准备合并到master时,您可以将其从wip.feature-A重命名为pr.feature-A并打开拉取请求
  • 如果在审核拉取请求时要应用新修复程序,只需将其推送到pr.feature-A
在上述所有步骤中,只会触发一个构建。

1

对于我正在处理的其中一个代码库,这是我想要的:

有一个名为origin的主要代码库,它执行所有发布操作。

我希望所有发送到originmaster分支的拉取请求都应该只在Travis上构建一次,无论它来自一个forked仓库还是origin本身的任何其他分支

对于此情况,这个命令非常有效:

if: (type == push) OR (type == pull_request AND fork == true)


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