【问题标题】:TeamCity Trigger on Pull Request vs Trigger on Merge拉取请求上的 TeamCity 触发器与合并上的触发器
【发布时间】:2016-12-01 20:25:50
【问题描述】:

我们在 GitHub 分支中构建功能(一个功能分支到一个功能)。我们有一个开发分支和一个主分支。两者都应该始终是绿色的。

我们使用 TeamCity 进行构建和部署。我想要的是,当创建拉取请求(从功能分支到开发)时,TeamCity 会自动构建和测试请求,然后启动 EC2 实例以便手动测试它。然后合并拉取请求时,TeamCity 构建、测试并创建一个 docker 镜像,我们将其推送到 ECS 上。

这一切都有效,除了我们的触发错误。

1) 对于构建拉取请求,VCS 根有一个默认分支设置为develop,并且分支规范为+:refs/pull/(*/merge) - 我们不想单独构建拉取请求,而是构建合并代码。然后我们将其部署到 EC2 实例上进行手动测试。

2) TeamCity 向 GitHub 报告构建拉取请求的状态,并在使用 EC2 实例进行手动测试后,将代码从功能分支合并到开发中。此时,我们要在开发中构建代码,然后将新的微服务推送到 Amazon ECS 上。对于将拉取请求合并到开发中后进行构建,VCS 根有一个默认分支设置为develop

实际上,1 总是被触发,例如用于提出拉​​取请求和合并到开发中。 2只有在合并到develop时才会触发,这是正确的。

任何帮助将不胜感激。

编辑

我已经阐明了我们上面使用的两种构建配置

【问题讨论】:

  • 您描述的方式听起来像是有两个 VCS 根,或者您正在尝试动态设置默认分支(可能是我解释它的方式)您能否确认您只有一个 VCS 根,并且您不会动态更改默认/分支规范。
  • 我们确实有两个用于项目的 VCS 根目录,一个用于每个构建配置的 VCS 根目录。我们不会动态更改默认或分支规范,只是我们对两个 VCS 根进行了不同的设置。
  • 啊哈 - 我会质疑是否需要两个 VCS 根,因为这应该可以从一个根上工作 - 你想聊聊这个吗? chat.stackoverflow.com/rooms/117201/evolve-software-ltd
  • 确实,不需要两个 VCS 根指向同一个存储库。

标签: git github teamcity


【解决方案1】:

根据文档,如果您只想构建拉取请求的合并代码,则不需要指定括号。

https://blog.jetbrains.com/teamcity/2013/02/automatically-building-pull-requests-from-github-with-teamcity/

现在,(...) 查看特定请求是合并的结果还是只是分支本身的结果。为此,我们可以在分支规范中指定以下内容

+:refs/pull/(*/merge)

一旦创建拉取请求,TeamCity 只会将合并代码的结果测试到开发中。

使用 TeamCity automatic merge 功能(包含在 TC9 中),将在 develop 分支上触发新的提交,该分支将正确运行您的配置(在开发时构建、在开发时测试、部署...)

因此,您可能只需将分支规范从:+:refs/pull/(*/merge) 替换为 +:refs/pull/*/merge

【讨论】:

  • 我已经这样做了——我现在有一个单独的 VCS 根监控开发,然后在分支规范中我有 +:refs/pull/*/merge。这显然会触发两种构建配置,因此我尝试使用 +:refs/pull/*/merge 向触发器添加分支过滤器 - 但这会阻止它在新的拉取请求上被触发。有什么想法吗?
【解决方案2】:

答案很简单。是 github 造成了这个问题。
+:refs/pull/*/merge 分支会在 github 每次认为有变化并“重建”合并结果时更新,并且每次都会触发 teamcity 触发器。

有时这只是在有人阅读并 cets 开放的拉取请求时发生。它首先是在打开 PR(根据需要)时确定地发生,其次是在实际合并发生并且结果是重建时发生。目前没有办法解决这个问题。 Github webhook 应该通知 PR 的状态(打开/关闭和完成),其余的应该由 TC 触发规则完成......也许在未来!

顺便说一句,我为每个构建配置都有单独的 VCS。工作正常,使其更灵活...

【讨论】:

    【解决方案3】:

    我同意 Evolve Software Ltd 的观点,即您可以使用单个 VCS 根来解决所有构建配置需求。我不知道场景 1 到底有什么问题,但暗示您不想构建合并以在那里开发。 我认为您正在为相关的构建配置在您的 VCS 触发器中寻找适当的分支过滤器规范。语法相当简单,如果我不清楚,TC 文档会涵盖这部分:

    • +:<default> 将包含默认分支(在 vcs root 中指定)
    • -:<default> 将排除默认分支
    • + or -:branch_name 将包含或排除分支规范中指定的逻辑分支名称(括号中的部分或整个事物,如果没有括号)

    请注意,如果您指定一个“排除”条目,您也需要指定一个“包含”条目,即使只是 +:* 并且您可以根据需要指定任意数量的条目(在不同的行上)。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 2013-02-21
      • 1970-01-01
      相关资源
      最近更新 更多