2014-09-03 114 views
2

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

+0

您正在使用哪种版本控制工具? – Technext 2014-09-03 08:50:03

+0

GIT + phabricator – 2014-09-03 12:10:23

回答

5

是的,你可以使用Extended Choice Parameter插件。一旦你安装了插件,进入你的作业配置页面。现在按照以下步骤操作:

  1. 启用复选框This build is parameterized
  2. 在下拉菜单中,Add Parameter,选择Extended Choice Parameter
  3. 因为你会为构建可以只选择一个分支,离开Parameter Type作为Single Select
  4. 在第Choose Source for Value,点击单选按钮Property File。指定文件的绝对(完整)路径。
  5. 只是在Property File以下,你会看到Property Key。在这里你必须指定密钥。属性文件采用键值对的形式。 对于离,key=value1,value2,...

正如你可以从下图所示的属性文件内容看,我将使用branch_nameProperty Key框中的关键。

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

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

enter image description here

现在,如果你已经有了你的分支列表中,您可以创建在上述指定的格式属性文件。但是,由于分支创建会不时发生,因此您需要动态从您的版本控制工具中获取列表。我们使用Git,所以如果需要的话,我可以帮助你。如果你使用其他任何东西,你将不得不搜索所需的命令。要动态获取分支列表,我已经设置了一个cron,它不断检查Git仓库并获取分支列表。然后,它使用最新的分支列表填充属性文件,其然后由Jenkins加载动态

更新:

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

git ls-remote [email protected]:repository_name 

例如,

[[email protected] ~]$ git ls-remote [email protected]: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 [email protected]: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 

PS:确保属性文件在Jenkins Master上(在主从设置的情况下)。

+0

哇,感谢您的快速和详尽的答案!我会尽快尝试。另外,我使用GIT。 – 2014-09-03 12:13:36

+0

如何提取分支名称(以及唯一名称)?我试图使用下面的'git branch -r | sed -e's/origin \ /// g'-e's/HEAD。* // g''。然后解析结果并将它们粘贴到branch_list文件中。我认为可能有更好的办法。 – 2014-09-04 13:13:33

+0

检查更新的答案。 – Technext 2014-09-04 14:07:42

7

我发现这个groovy脚本。有点修改它。您需要选择'groovy script'而不是'Property file'

def gitURL = "ssh://[email protected]/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的想法。

+0

不客气! :)感谢您发布脚本!会帮助别人。 :) – Technext 2014-09-04 15:46:20