动态填充詹金斯选择参数使用Git分支在指定的回购动态填充詹金斯选择参数使用Git分支在指定的回购(D

2019-05-13 19:28发布

我有这需要一个特定的Git分支在特定的Git回购输入参数化詹金斯工作。 目前,这个参数是一个字符串参数。

有没有什么办法,使这个参数选择参数和动态填充下拉与的Git分支列表? 我不想有人需要通过手动配置下每一次创建一个新的分支的下降,以保持这种选择参数。

Answer 1:

扩展选择参数插件可以让你从文件中读取的选择。

当然,现在你有另外一个问题:如何确保文件是最新的最新(即可以用做post-commit钩子),并通过将其放置在一个共享传播到所有用户(可以做文件服务器)。 但也有可能是更好的解决方案。



Answer 2:

我试着一对夫妇在这个环节提到的答案,但无法弄清楚如何告诉詹金斯关于用户选择的分支。 正如我以前在上面螺纹评论中提及,我已经离开了分支选择字段为空。

但是,在进一步的调查,我发现另一种方式做同样的事情- https://wiki.jenkins-ci.org/display/JENKINS/Git+Parameter+Plugin我发现这种方法是简单了很多,并有少的东西配置!

下面是我配置了什么 -

  1. 安装git的参数插件
  2. 经过了“此版本是参数化”,并增加了“混帐参数”
  3. 增加了以下值:

  4. 然后在工作的混帐SCM部分我加在“名称”一节中提到的相同的值,就好像它是一个环境变量。 (如果你读这个混帐参数仔细插件的帮助下,你会意识到这一点)

在此之后我刚刚运行的身材,选择了我的分支(詹金斯检查出这个科大厦前),并成功地完成了建设,并通过选择,我已经指定的分支。



Answer 3:

我是能够实现使用这个结果詹金斯动态参数插件 。 我用了动态选择参数选项,适合自己的选择剧本,我用了以下内容:

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()


Answer 4:

它相当简单使用“混帐参数插件” 。

添加名称,如“SELECT_BRANCH” ##确保该变量,因为这将在以后使用。 然后,参数类型:分行

然后伸手SCM:选择:Git和分行符:$ {} SELECT_BRANCH

为了验证,在詹金斯外壳下面执行:

回声$ {} SELECT_BRANCH

这里env.enter图片说明



Answer 5:

扩大对@ 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”在扩展插件选择的网址。 奇迹般有效。



Answer 6:

您可以使用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脚本服务器饭桶。 任何丝毫的这个选择它得到完全动态的,你并不需要建立一个列表文件。 简而言之网址到脚本在扩展参数选择“属性文件”字段。



Answer 7:

是的,我写了一个小的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脚本,所以如果有,我想知道做事情的更好的方式。



Answer 8:

我在这里面临着类似的问题。 我们的用户是从自由泳迁移他们的工作流水线。 他们不想Jenkinsfile存储在其回购(历史原因),并仍想使用“混帐参数”插件

因此,我们必须使用使用“管道脚本”,并制定不同的插件,它的工作原理是“混帐参数”。

这种新的插件不与SCM项目设置集成。 该插件是https://plugins.jenkins.io/list-git-branches-parameter

希望它可以帮助你以及



Answer 9:

我,我使用的输入级PARAM:

  1. 我开始通过检查出Git项目我的管道。
  2. 我用AWK commade产生与所有分支机构的列表中barnch.txt文件
  3. 在阶段setps,我读该文件,并用它来生成一个输入选择PARAMS

当用户启动一个管道,这将是一个等待他的列表中供您选择。

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构建互动:

在这里输入图像描述

在这里输入图像描述



Answer 10:

以下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



Answer 11:

我们可以消除使用不必要的文件的读/写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();


Answer 12:

我有这种情况下新的响应:最简单的方式来解决这个问题是有,你从源代码jenkinsFile。

然后你选择:这份工作有一个git参数

而与管道设置,选中“轻量级结账”复选框,这将执行对工作的工作空间真是混帐结账。

之后,参数会被你的Git分支被自动填充



文章来源: Dynamically Fill Jenkins Choice Parameter With Git Branches In a Specified Repo