如何配置Travis-CI来构建拉取请求&合并为无冗余的主人

时间:2015-08-07 16:13:51

标签: github travis-ci pull-request

将其放入" BDD"术语:

  

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

     

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

     

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

     

当我将拉取请求合并到主人时   然后特拉维斯应该建立主人

Travis-CI" build pushes"让我很困惑。和#34;建立PR"设置,如:

  • 启用两者会导致每个Pull Request由Travis构建两次
    • 一次用于该分支的提交
    • 再次将该分支合并提交到其目的地
  • 仅启用"构建PR"导致PR建立,但不会导致合并后的构建(即在master上)。
  • 启用"推动"通过构建所有推送到回购,brute-force满足上述标准。你可以尝试通过white-& amp;黑名单分支,但除非你严格遵守分支机构名称,否则这可能会让你感到厌烦。

Travis-CI docsGH issue #3241中详细说明了这一点。

任何人都知道满足上述条件的配置吗?

6 个答案:

答案 0 :(得分:88)

我最终发现了另一个GH问题(#2111),它给了我一个尝试启用PR和&推送,但使用白名单限制推送到特定分支。这似乎满足我的工作流程的标准。这就是我的所作所为:

  1. 启用PR和&分支推送回购的Travis设置:
  2. travis push/pr settings enabled

    1. .travis.yml更改为white-list master branch(即仅构建推送到主人):
    2. branches:
        only: 
          - master
      
      1. 通过创建PR with the .travis.yml change来测试它,并使用一些空提交来验证它works for forks too

      2. 验证successful merge commit build from master

      3. build result of merge to master

答案 1 :(得分:8)

刚刚在travis docs

中找到

添加到.travis.yml

if: type = push

或者:

if: type = pull_request

答案 2 :(得分:3)

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

我打开了an issue asking for a better solution

答案 3 :(得分:2)

如果您不仅要测试master分支,还要测试其他分支,则可以使用下一个工作流程:

  • 同时保持" Build pushes"和#34;构建拉取请求" ON
  • branches:except指令添加到.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
  • 即可

在上述所有步骤中,只会触发一个构建。

答案 4 :(得分:1)

假设您要构建所有公关,则可以使用以下方法解决问题。在设置页面上启用分支和PR构建,并将此行作为travis.yml的第一行:

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

这将尝试在所有推送上进行推送构建,并在所有推送上进行PR构建,以打开PR,但是会过滤掉不符合条件的任何内容。您可能需要对此进行一些修改-关于不使用名称中的no-ci构建分支的子句显然是可选的,并且您可能没有两个总是希望在其上运行构建的分支。

您可以在Travis网站上的conditionsconditional builds上阅读更多内容。

答案 5 :(得分:0)

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

有一个origin存储库,它是执行所有发行版的主要存储库。

我希望所有传至master分支的拉取请求都只能一次用Travis构建,无论它来自 fork 回购或origin本身的任何其他分支

在这种情况下,它就像一个饰物

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