2017-08-02 45 views
4

我想一个dynamic choice parameter添加到Jenkinsfile与声明语法,使用这样的事情:(当Jenkinsfile处理)选择参数动态评估

def myChoices = listBranchesFromGithub(MY_REPO) 

pipeline { 
    parameters { 
     choice(name: 'mychoice', choices: myChoices) 
    } 
} 

listBranchesFromGithub(MY_REPO)计算一次,不是每次运行这个工作。

每当作业被触发时,是否有办法填充choices

+0

您是否曾想到这一点? – Mike

+0

不,这个插件不再被分发,所以它不太可能在jenkins 2中被支持。也许[Extended choice parameter](https://wiki.jenkins.io/display/JENKINS/Extended+Choice+Parameter+plugin)plugin [可以做类似的事情](https://stackoverflow.com/a/46122406/2029354),但只能使用脚本管道(而不是声明式)和[它在蓝色海洋中播放不好](https://gist.github .com/jgraglia/44a7443847cff6f0d87387a46c7bb82f#gistcomment-2158077) – Albert

回答

0

您有两种选择。

在您的jenkins文件中,处理后再次调用属性。

#!groovy 
@Library('shared') _ 

properties() 

// Do pipeline 

properties() 

def properties() { 
    // Set Jenkins job properties 
    properties([ 
     buildDiscarder(logRotator(numToKeepStr: '20')), 
     parameters([//params]) 
    ]) 
} 

亲的,简单吗?缺点:只有在步骤成功并且不提前退出时才有效。

替代方案:在构建期间动态调整(我们将这些函数放在共享库中,并在我们需要更新参数(如工件列表)时调用它们)。注意:可能需要脚本安全审批

/** 
* Change param value during build 
* 
* @param paramName new or existing param name 
* @param paramValue param value 
* @return nothing 
*/ 
def setParam(String paramName, String paramValue) { 
    List<ParameterValue> newParams = new ArrayList<>(); 
    newParams.add(new StringParameterValue(paramName, paramValue)) 
    $build().addOrReplaceAction($build().getAction(ParametersAction.class).createUpdated(newParams)) 
} 

/** 
* Add a new option to choice parameter for the current job 
* 
* @param paramName parameter name 
* @param optionValue option value 
* @return nothing 
*/ 
def addChoice(String paramName, String optionValue) { 
    addChoice($build().getParent(), paramName, optionValue) 
} 

在上述情况下,这些方法存在于共享库内的/ vars中。 /vars/jobParams.groovy。因此,从Jenkinsfile或其他共享库中,可以使用以下语法调用这些文件:

jobParams.addChoice("ARTIFACT_NAME", "da-name") 
+0

您是否以某种方式从Jenkinsfile调用setParam()和addChoice()? –

+0

如果是这样,怎么样?你能提供一个Jenkinsfile的例子,详细说明如何做到这一点? –

+0

是的,所以setParam()和addChoice()存在于/ vars(/vars/jobParams.groovy)下的另一个共享库中。从jkinskins文件或其他共享库只需调用jobParams.addChoice(“ARTIFACT_NAME”,“the name”)即可 – metalisticpain