如何配置特拉维斯-CI 建立拉请求和合并,以掌握 W/O 冗余

用“ BDD”的术语来说:

背景:
鉴于我正在为 GH 回购做贡献

当我创建一个请求时
然后 Travis 应该构建最新的提交

当我推到一个现有的拉请求时
然后 Travis 应该构建最新的提交

当我向 master 合并请求时
那崔维斯应该建造主人

我对 Travis-CI 的“构建推送”和“构建公关”设置感到困惑:

  • 启用这两个导致每个拉请求建立两次由特拉维斯
    • 一次用于该分支上的提交
    • 并再次为该分支向其目的地的合并提交
  • 只启用“构建 PR”会导致构建 PR,但不会导致合并后的构建(即在主机上)。
  • 启用“推”蛮力满足上述标准通过建立 所有推回购。您可以尝试通过白名单和黑名单分支来欺骗事情,但是这可能会伤害到您,除非您严格遵守分支名称的规定。

这在 Travis-CI 的医生GH 第3241期中有更多的解释。

有人知道满足上述条件的配置吗?

27672 次浏览

我最终发现了另一个 GH 问题(# 2111) ,它给了我一个想法,尝试同时启用 PR 和 push,但是使用白名单来限制对特定分支的推。这似乎满足了我的工作流的标准。我是这么做的:

  1. 启用两个 PR 和分支推特拉维斯设置的回购:

travis push/pr settings enabled

  1. .travis.yml更改为 白名单 master分行(即只向主版本推送构建) :
branches:
only:
- master
  1. 通过创建一个 公关与 .travis.yml的变化和另一个具有一些空提交的 PR 来测试它,以验证它是否为 也为叉子工作

  2. 验证 从 master 成功合并提交 build

build result of merge to master

公认答案中描述的白名单方法有一些重大的局限性。特别是,它不支持在不打开 PR 的情况下非冗余地构建任意分支。

我打开了 寻求更好解决办法的问题

如果您不仅想测试 master分支,还想测试其他一些分支,那么您可以使用下一个工作流:

  • 保持“构建推送”和“构建拉请求”都处于开机状态
  • branches:except指令添加到 .travis.yml:

    branches:
    except:
    - /^pr\..*/
    

In this configuration:

  • any commit to branch feature-A will trigger the build
  • any commit to branch pr.feature-A will not trigger the build
  • if branch pr.feature-A is used in opened pull request then build will be triggered

Workflow example

  • temporary WIP branch shared between several developers: wip.feature-A, any commit to this branch will trigger the build
  • when branch is ready to be merged to master you can rename it from wip.feature-A to pr.feature-A and open pull request
  • if while reviewing pull request you want to apply new fixes, just push to pr.feature-A

On all the steps above only one build will be triggered.

Travis 医生里找到的

添加到

if: type = push

或者:

if: type = pull_request

假设您想要构建 所有 PR,下面这样的代码就可以实现这个目的。在设置页面上启用分支和 PR 构建,并将这一行作为 travis.yml中的第一行:

if: (type = push AND branch IN (master, dev)) OR (type = pull_request AND NOT branch =~ /no-ci/)

这将尝试一个推建立在所有的推和一个公关建立在所有的推到一个开放的公关,但将过滤出任何不符合条件。您可能需要稍微修改一下这一点——关于不在分支名称中某处添加 no-ci 的子句显然是可选的,并且您可能没有两个总是希望在其上运行构建的分支。

你可以在特拉维斯的网站上阅读更多关于 条件条件构建的内容。

对于其中一个仓库,我正在使用,这是我想要的:

有一个 origin回购,这是主要的回购,做所有的发行。

我希望所有的拉请求来到 master分行的原产地应该建立与特拉维斯只有 一次不管事实上,它来自 叉子回购或任何 另一家分行origin本身。

对于这个案子来说,这就像魔法一样有效

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