我有这需要一个特定的Git分支在特定的Git回购输入参数化詹金斯工作。 目前,这个参数是一个字符串参数。
有没有什么办法,使这个参数选择参数和动态填充下拉与的Git分支列表? 我不想有人需要通过手动配置下每一次创建一个新的分支的下降,以保持这种选择参数。
我有这需要一个特定的Git分支在特定的Git回购输入参数化詹金斯工作。 目前,这个参数是一个字符串参数。
有没有什么办法,使这个参数选择参数和动态填充下拉与的Git分支列表? 我不想有人需要通过手动配置下每一次创建一个新的分支的下降,以保持这种选择参数。
扩展选择参数插件可以让你从文件中读取的选择。
当然,现在你有另外一个问题:如何确保文件是最新的最新(即可以用做post-commit钩子),并通过将其放置在一个共享传播到所有用户(可以做文件服务器)。 但也有可能是更好的解决方案。
我试着一对夫妇在这个环节提到的答案,但无法弄清楚如何告诉詹金斯关于用户选择的分支。 正如我以前在上面螺纹评论中提及,我已经离开了分支选择字段为空。
但是,在进一步的调查,我发现另一种方式做同样的事情- https://wiki.jenkins-ci.org/display/JENKINS/Git+Parameter+Plugin我发现这种方法是简单了很多,并有少的东西配置!
下面是我配置了什么 -
增加了以下值:
然后在工作的混帐SCM部分我加在“名称”一节中提到的相同的值,就好像它是一个环境变量。 (如果你读这个混帐参数仔细插件的帮助下,你会意识到这一点)
在此之后我刚刚运行的身材,选择了我的分支(詹金斯检查出这个科大厦前),并成功地完成了建设,并通过选择,我已经指定的分支。
我是能够实现使用这个结果詹金斯动态参数插件 。 我用了动态选择参数选项,适合自己的选择剧本,我用了以下内容:
proc1 = ['/bin/bash', '-c', "/usr/bin/git ls-remote -h ssh://user@server.com/path/to/repo.git"].execute()
proc2 = ['/bin/bash', '-c', "awk '{print \$2}'"].execute()
proc3 = ['/bin/bash', '-c', "sed s%^refs/heads%origin%"].execute()
all = proc1 | proc2 | proc3
String result = all.text
String filename = "/tmp/branches.txt"
boolean success = new File(filename).write(result)
def multiline = "cat /tmp/branches.txt".execute().text
def list = multiline.readLines()
它相当简单使用“混帐参数插件” 。
添加名称,如“SELECT_BRANCH” ##确保该变量,因为这将在以后使用。 然后,参数类型:分行
然后伸手SCM:选择:Git和分行符:$ {} SELECT_BRANCH
为了验证,在詹金斯外壳下面执行:
回声$ {} SELECT_BRANCH
这里env.enter图片说明
扩大对@ malenkiy_scot的答案。 我创建了一个新的詹金斯工作建立所使用的扩展插件选择的文件。
你可以做如下(我这样做是为执行在詹金斯外壳的步骤,但你能做到这一点在脚本中):
git ls-remote git@github.com:my/repo.git |grep refs/heads/* >tmp.txt
sed -e 's/.*refs\/heads\///' tmp.txt > tmp2.txt
tr '\n' ',' < tmp2.txt > tmp3.txt
sed '1i\branches=' tmp3.txt > tmp4.txt
tr -d '\n' < tmp4.txt > branches.txt
然后我用的是神器部署插件到文件推到共享位置,这是一个网络URL,那么就使用的“http://localhost/branches.txt”在扩展插件选择的网址。 奇迹般有效。
您可以使用malenkiy_scot之前提到的扩展选择参数插件和一个简单的PHP脚本如下完成相同的(假设你有地方的服务器部署PHP脚本,你可以从詹金斯机打)
<?php
chdir('/path/to/repo');
exec('git branch -r', $output);
print('branches='.str_replace(' origin/','',implode(',', $output)));
?>
要么
<?php
exec('git ls-remote -h http://user:pass@repo.git', $output);
print('branches='.preg_replace('/[a-z0-9]*\trefs\/heads\//','',implode(',', $output)));
?>
随着第一个选项,你将需要克隆回购。 随着第二个你不这样做,但在这两种情况下,你需要安装在主机的PHP脚本服务器饭桶。 任何丝毫的这个选择它得到完全动态的,你并不需要建立一个列表文件。 简而言之网址到脚本在扩展参数选择“属性文件”字段。
是的,我写了一个小的Groovy脚本,它不招你应该添加一个“动态选择参数”你的工作,并自定义以下Groovy脚本您的需求:
#!/usr/bin/groovy
def gitURL = "git repo url"
def command = "git ls-remote --heads --tags ${gitURL}"
def proc = command.execute()
proc.waitFor()
if ( proc.exitValue() != 0 ) {
println "Error, ${proc.err.text}"
System.exit(-1)
}
def text = proc.in.text
# put your version string match
def match = /<REGEX>/
def tags = []
text.eachMatch(match) { tags.push(it[1]) }
tags.unique()
tags.sort( { a, b ->
def a1 = a.tokenize('._-')
def b1 = b.tokenize('._-')
try {
for (i in 1..<[a1.size(), b1.size()].min()) {
if (a1[i].toInteger() != b1[i].toInteger()) return a1[i].toInteger() <=> b1[i].toInteger()
}
return 1
} catch (e) {
return -1;
}
} )
tags.reverse()
我在我的情况下,版本字符串是以下格式XXXX,可能的格式为XXX-用户名,用户等分支机构......所以我不得不写我自己的排序功能。 这是我第一次Groovy脚本,所以如果有,我想知道做事情的更好的方式。
我在这里面临着类似的问题。 我们的用户是从自由泳迁移他们的工作流水线。 他们不想Jenkinsfile存储在其回购(历史原因),并仍想使用“混帐参数”插件
因此,我们必须使用使用“管道脚本”,并制定不同的插件,它的工作原理是“混帐参数”。
这种新的插件不与SCM项目设置集成。 该插件是https://plugins.jenkins.io/list-git-branches-parameter
希望它可以帮助你以及
我,我使用的输入级PARAM:
当用户启动一个管道,这将是一个等待他的列表中供您选择。
pipeline{
agent any
stages{
stage('checkout scm') {
steps {
script{
git credentialsId: '8bd8-419d-8af0-30960441fcd7', url: 'ssh://jenkins@git.company.com:/usr/company/repositories/repo.git'
sh 'git branch -r | awk \'{print $1}\' ORS=\'\\n\' >>branch.txt'
}
}
}
stage('get build Params User Input') {
steps{
script{
liste = readFile 'branch.txt'
echo "please click on the link here to chose the branch to build"
env.BRANCH_SCOPE = input message: 'Please choose the branch to build ', ok: 'Validate!',
parameters: [choice(name: 'BRANCH_NAME', choices: "${liste}", description: 'Branch to build?')]
}
}
}
stage("checkout the branch"){
steps{
echo "${env.BRANCH_SCOPE}"
git credentialsId: 'ea346a50-8bd8-419d-8af0-30960441fcd7', url: 'ssh://jenkins@git.company.com/usr/company/repositories/repo.git'
sh "git checkout -b build ${env.BRANCH_NAME}"
}
}
stage(" exec maven build"){
steps{
withMaven(maven: 'M3', mavenSettingsConfig: 'mvn-setting-xml') {
sh "mvn clean install "
}
}
}
stage("clean workwpace"){
steps{
cleanWs()
}
}
}
}
然后,用户将withim构建互动:
在这里输入图像描述
在这里输入图像描述
以下Groovy脚本将是有益的, 如果你的工作不使用“源代码管理”直接 (同样“混帐参数插件”),但仍然可以访问到本地(克隆)的Git仓库:
import jenkins.model.Jenkins
def envVars = Jenkins.instance.getNodeProperties()[0].getEnvVars()
def GIT_PROJECT_PATH = envVars.get('GIT_PROJECT_PATH')
def gettags = "git ls-remote -t --heads origin".execute(null, new File(GIT_PROJECT_PATH))
return gettags.text.readLines()
.collect { it.split()[1].replaceAll('\\^\\{\\}', '').replaceAll('refs/\\w+/', '') }
.unique()
这里查看完整的解释: https://stackoverflow.com/a/37810768/658497
我们可以消除使用不必要的文件的读/写text
。 我的完整的解决方案如下:
proc1 = ['/bin/bash', '-c',
"/usr/bin/git ls-remote --heads ssh://repo_url.git"].execute()
proc2 = ['/bin/bash', '-c',
"/usr/bin/awk ' { gsub(/refs\\/heads\\//, \"\"); print \$2 }' "].execute()
all = proc1 | proc2
choices = all.text
return choices.split().toList();
我有这种情况下新的响应:最简单的方式来解决这个问题是有,你从源代码jenkinsFile。
然后你选择:这份工作有一个git参数
而与管道设置,选中“轻量级结账”复选框,这将执行对工作的工作空间真是混帐结账。
之后,参数会被你的Git分支被自动填充