仅构建已推送到的Git分支

Lór*_*tér 22 git github jenkins jenkins-plugins

我有一个Jenkins工作来构建master我的GitHub仓库的分支.当我提交一个提交时master,它很好地触发,我很高兴.

我还希望有一个Jenkins工作,可以在这个存储库中构建任何其他分支.即每当我将提交推送到分支(不是master)时,我想让这个Jenkins工作来构建该分支,并且只有那个分支.

使用GitHub pull-request插件需要我创建一个pull-request,并将我的提交合并到master.我想这样做而不必创建一个pull-request,并且只在没有合并它的情况下构建我的提交master.

设置Git插件来构建所有分支意味着无论何时我推送到掌握,都会构建所有分支.我想只构建一个已修改过的分支.

这可以在詹金斯做吗?

Mig*_*g82 10

我遇到了同样的问题所以我设置了一个虚拟项目进行实验并找到了解决方案.并且发现是的,你只能构建被推入的分支.

简短的回答是使用"分支说明符".例如origin/feature**.

如果您正在使用GitFlow并且所有功能分支都使用feature/前缀命名,那么这就是解决方案.

如果你对此感到好奇,我是如何理解它的.

从存储库的设置我使用Jenkins钩子设置服务"Github插件"https://<jenkin server>/github-webhook/.请注意,至少对我来说,发生的事情是由于某种原因,在按下"test"之后,发送的有效负载的消息从未改变以确认它已被接收/确认或任何事情.也许没有回复.令人困惑,但无论如何......

我创建了一个新的Jenkins作业并将分支说明符设置为空白 - 然后Jenkins自动设置为**.

我创建了一个功能分支feature/foo并将其推入其中.

  • Build 1被解雇了,但是在master分支上.
  • Build 2也被feature/foo分支机构解雇了.

所以看起来使用**or blank说明符,只要有任何推送,插件就会在repo的所有分支上触发构建.

然后我尝试使用模式refs/heads/feature/foo并将另一个更改推送到feature/foo分支.

  • Build 3在feature/foo分支机构被解雇了.
  • 没有其他构建被解雇.

好吧,但这太僵硬了.它会迫使我们为每个功能分支创建一个构建作业.我想为所有功能分支创建一个构建作业.

然后我尝试使用带有模式的通配符refs/heads/feature\*\*并将更改推送到feature/foo.

  • 没有构建被解雇.

然后我尝试了分支说明符refs/heads/feature/\*\*并推送.

  • 没有构建被解雇

然后我看到"分支说明符"字段的帮助在"通配符"部分下面读取了这个:

语法的形式如下:REPOSITORYNAME/BRANCH.另外,BRANCH被识别为简写*/BRANCH,*被识别为通配符,并被**识别为包含分隔符的通配符/.因此,origin/branches*匹配origin/branches-foo但不匹配origin/branches/foo,而origin/branches**将匹配origin/branches-fooorigin/branches/foo.

所以我试过了 origin/feature**

  • Build 4被解雇了origin/feature/foo.

找到了!看起来你不能在引用中使用通配符(从开头refs/),但你可以使用实际分支的名称(以...开头origin/).

然后我创建了分支feature/bar并推送到它.要验证是否只构建了这个,而不是从其他分支开始feature/.

  • Build 5被解雇了origin/feature/bar.

几乎看那里.只需要几个测试.

然后我推了另一个改变 origin/master

  • 没有构建被解雇.大!

然后我推动另一个更改feature/bar,以测试只有这个分支将被构建.尽管事实origin/master也已被推入.

  • Build 6被解雇了feature/bar.
  • 没有其他构建被解雇.

在我看来很好.


小智 -4

您可以轻松地在作业配置中指定分支:

在源代码管理部分中,您已经指定了 git 存储库 URL,您还可以选择指定要构建的分支。只需输入您的分支名称而不是 master (这是默认值)。

  • 这个想法是将这个字段留空......并且构建应该知道哪个分支被推送 (2认同)