选择要在 Jenkins 中构建的分支

Posted

技术标签:

【中文标题】选择要在 Jenkins 中构建的分支【英文标题】:Select branch to build in Jenkins 【发布时间】:2014-09-03 08:48:24 【问题描述】:

我的项目中有几个分支。詹金斯的工作中是否可以进行动态分支选择? 这个想法是 Jenkins 将获取当前分支的列表并将它们显示为可能的选择参数。有没有办法做到这一点?谢谢

【问题讨论】:

你用的是哪个版本控制工具? 【参考方案1】:

我为此找到了 groovy 脚本。稍微修改了一下。您需要选择“groovy 脚本”而不是“属性文件”

def gitURL = "ssh://jenkins@phabricator.com/project.git"
def command = "git ls-remote -h $gitURL"

def proc = command.execute()
proc.waitFor()         

if ( proc.exitValue() != 0 ) 
   println "Error, $proc.err.text"
   System.exit(-1)
     

def branches = proc.in.text.readLines().collect 
    it.replaceAll(/[a-z0-9]*\trefs\/heads\//, '') 
   
return branches.join(",")

想法是一样的。只是现在您的密钥是 $Branch 在工作中。效果很好。非常感谢@Technext 的想法。

【讨论】:

不客气! :) 感谢您发布脚本!会帮助别人。 :)【参考方案2】:

是的,您可以使用Extended Choice Parameter 插件来做到这一点。安装插件后,转到作业的配置页面。现在按照以下步骤操作:

    启用复选框This build is parameterized。 在下拉菜单中,Add Parameter,选择Extended Choice Parameter 由于您将只选择 一个 分支进行构建,请将 Parameter Type 保留为 Single SelectChoose Source for Value 部分,单击单选按钮Property File。指定文件的绝对(完整)路径。 就在Property File 下方,您将看到Property Key。在这里您必须指定密钥。属性文件采用键值对的形式。 例如,key=value1,value2,...

从下面显示的属性文件内容中可以看出,我将使用branch_name 作为Property Key 框中的键。

[tom@master ]# cat /data/branch_list
branch_name=master,mainline,branch_A,branch_B,branch_C,branch_N,

请参阅下面的快照以更好地理解我上面解释的内容:

现在,如果您已经有了分支列表,您可以按照上面指定的格式创建属性文件。但是,由于不时会创建分支,因此您需要动态地从版本控制工具中获取列表。我们使用 Git,因此如果需要,我可以帮助您。如果您使用其他任何东西,则必须搜索所需的命令。为了动态地获取分支列表,我设置了一个 cron 来不断检查 Git 存储库并获取分支列表。然后它使用 up-to-date 分支列表填充属性文件,然后 动态 由 Jenkins 加载。

更新:

我们使用 Gitolite 并使用 git ls-remote 命令访问分支名称。

git ls-remote gitolite@git.server.com:repository_name

例如,

[tom@master ~]$ git ls-remote gitolite@git.server.com:repository_name
08a119f0aec5d4286708d2e16275fcd7d80d2c25        HEAD
a91ef29f1be5bfe373598f6bb20d772dcc65b8ca        refs/heads/dev-mob
d138356cf752a46fd8c626229809c9eaae63a719        refs/heads/dev-ssorel
e7d7e2c617c4a42b299b29c0119283813800f1bb        refs/heads/dev-omni
3193b36d678f1af2dcc3a291c6313f28ede97149        refs/heads/dev-pay
72fd9d8586708011c763cd7bc4f7bd2a3513a12f        refs/heads/dev-sell
39455fc2672039a7f325e9cafe3777ed563368ef        refs/heads/dev-apis
a22eb000ffa1ac0fbbf51b6bc8aea31b040567a3        refs/heads/dev-front
78a63105ec754d7ba758af97d542e749ceb9c533        refs/heads/dev-tpsp
82d99796690b6c562872ea68655c74ebc3f0abfb        refs/heads/mainline
fd82522f9999cedb11e245b515d480187c2e9cc6        refs/heads/master

要仅过滤掉分支名称并以键值对的形式将其填充到文件中,您可以使用以下脚本:

#!/bin/bash

git ls-remote gitolite@git.server.com:repository_name | grep -v HEAD | cut -d/ -f3 | sort > /data/branch_list_temp
tr '\n' ',' < /data/branch_list_temp | sed "s/^\(.*\)/branch_name=\1/" > /data/branch_list

rm /data/branch_list_temp

P.S.:确保属性文件位于 Jenkins Master 上(以防主从设置)。

【讨论】:

哇,感谢您快速而详尽的回答!我会尽快尝试的。另外,我使用 GIT。 你如何获取分支名称(并且只有名称)?我正在尝试使用以下 'git branch -r | sed -e 's/origin\///g' -e 's/HEAD.*//g''。然后解析结果并将它们粘贴到 branch_list 文件中。我认为可能有更好的方法。

以上是关于选择要在 Jenkins 中构建的分支的主要内容,如果未能解决你的问题,请参考以下文章

jenkins实现手动选择分支构建项目

jenkin控制台输出乱码,jenkins.xml文件设置utf-8都没有用

jenkins发布代码选择不同分支

K8S环境的Jenkin性能问题处理

jenkin运行jmeter自动化脚本(jenkins+jmeter+ant)

Jenkin配置执行远程shell命令