Jenkins 活动选项参数中的通用Groovy脚本
我有一个groovy脚本,它对许多作业都是通用的,它们都包含一个Active参数。我不想重复同一个脚本几十次,而是想把它放在一个(库|?)中一次,并在每个作业中引用它 这个脚本在我粘贴的任何工作中都能很好地工作。只需要知道是否有可能把它放在一个地方,并在所有工作中共享。更新一次,即更新所有作业Jenkins 活动选项参数中的通用Groovy脚本,jenkins,shared-libraries,jenkins-groovy,Jenkins,Shared Libraries,Jenkins Groovy,我有一个groovy脚本,它对许多作业都是通用的,它们都包含一个Active参数。我不想重复同一个脚本几十次,而是想把它放在一个(库|?)中一次,并在每个作业中引用它 这个脚本在我粘贴的任何工作中都能很好地工作。只需要知道是否有可能把它放在一个地方,并在所有工作中共享。更新一次,即更新所有作业 import jenkins.model.Jenkins; ArrayList<String> res = new ArrayList<String>(); def requir
import jenkins.model.Jenkins;
ArrayList<String> res = new ArrayList<String>();
def requiredLabels = [new hudson.model.labels.LabelAtom ("Product")];
requiredLabels.add(new hudson.model.labels.LabelAtom(ClientName));
Jenkins.instance.computers.each {
if (it.assignedLabels.containsAll(requiredLabels)) {
res.add(it.displayName);
}
}
return res;
导入jenkins.model.jenkins;
ArrayList res=新的ArrayList();
def requiredLabels=[new hudson.model.labels.LabelAtom(“产品”)];
requiredLabels.add(新的hudson.model.labels.LabelAtom(ClientName));
Jenkins.instance.computers.each{
if(it.assignedLabels.ContainesAll(requiredLabels)){
res.add(it.displayName);
}
}
返回res;
不,看起来还不可能
警告:只有在您有权访问Jenkins box的情况下,此操作才有效。我还没有尝试通过向詹金斯家添加路径来实现这一点 您可以使用以下选项:
jar cvf
将该文件转换为jar。例如:jar-cvf-activeChoiceParams.jar-activeChoiceParams.groovy
导入activeChoiceParams
返回()
所有函数都必须返回一个列表或映射我们决定的选项是使用一个公共参数函数。groovy存储在git中。有一个服务钩子,在签入时将文件推出到已知的网络位置。 在Jenkins构建步骤中,我们让控件动态加载脚本并调用传递任何参数的函数
ArrayList<String> res = new ArrayList<String>();
try {
new GroovyShell().parse( new File( '\\\\server\\share\\folder\\parameterFunctions.groovy' ) ).with {
res = getEnvironments(ClientName);
}
} catch (Exception ex) {
res.add(ex.getMessage());
}
return res;
ArrayList res=new ArrayList();
试一试{
新建GroovyShell().parse(新文件('\\\\server\\share\\folder\\parameterFunctions.groovy'))。带有{
res=getEnvironments(ClientName);
}
}捕获(例外情况除外){
res.add(例如getMessage());
}
返回res;
我们的parameterFunctions.groovy将以我们想要的方式响应:
public ArrayList<String> getEnvironments(String p_clientName) {
ArrayList<String> res = new ArrayList<String>();
if (!(p_clientName?.trim())){
res.add("Select a client");
return res;
}
def possibleEnvironments = yyz.getEnvironmentTypeEnum();
def requiredLabels = [new hudson.model.labels.LabelAtom ("PRODUCT")];
requiredLabels.add(new hudson.model.labels.LabelAtom(p_clientName.toUpperCase()));
Jenkins.instance.computers.each { node ->
if (node.assignedLabels.containsAll(requiredLabels)) {
// Yes. Let's get the environment name out of it.
node.assignedLabels.any { al ->
def e = yyz.getEnvironmentFromString(al.getName(), true);
if (e != null) {
res.add(al.getName());
return; // this is a continue
}
}
}
}
return res;
}
public ArrayList getEnvironments(字符串p_clientName){
ArrayList res=新的ArrayList();
如果(!(p_clientName?.trim()){
res.add(“选择客户”);
返回res;
}
def possibleEnvironments=yyz.getEnvironmentTypeEnum();
def requiredLabels=[new hudson.model.labels.LabelAtom(“产品”)];
requiredLabels.add(新的hudson.model.labels.LabelAtom(p_clientName.toUpperCase());
Jenkins.instance.computers.each{node->
if(node.assignedLabels.containsAll(requiredLabels)){
//是的。让我们把环境名称从中去掉。
node.assignedLabels.any{al->
def e=yyz.getEnvironmentFromString(al.getName(),true);
如果(e!=null){
res.add(al.getName());
return;//这是一个continue
}
}
}
}
返回res;
}
我通过使用Job DSL插件找到了有趣的解决方案
通常,活动选项的作业定义如下所示:
从
在Jenkins管道中,您可以使用共享库提取管道的公共部分。有关更多信息,请参阅此链接:非常适合管道作业-但我对在构建开始之前在活动选项参数中使用共享函数感兴趣。在参数Groovy脚本中,我将“@LIbrary(”libname@master")'like do for pipeline and get'启动失败:Script1.groovy:1:无法解析类库,找不到注释@line 1,column 1,@Library('libname@master“”“”,如果使用jenkins作业DSL API()生成jenkins作业可以参考特定作业中的常用方法。幸运的是,开发脚本和必须放入jar/重新启动Jenkins/安全性会对系统造成太大的破坏。需要一些开发人员可以在工作时间轻松更改的内容,而不需要重新启动。谢谢!如果没有共享库,这是可能的。您只需指定一个文件。
public ArrayList<String> getEnvironments(String p_clientName) {
ArrayList<String> res = new ArrayList<String>();
if (!(p_clientName?.trim())){
res.add("Select a client");
return res;
}
def possibleEnvironments = yyz.getEnvironmentTypeEnum();
def requiredLabels = [new hudson.model.labels.LabelAtom ("PRODUCT")];
requiredLabels.add(new hudson.model.labels.LabelAtom(p_clientName.toUpperCase()));
Jenkins.instance.computers.each { node ->
if (node.assignedLabels.containsAll(requiredLabels)) {
// Yes. Let's get the environment name out of it.
node.assignedLabels.any { al ->
def e = yyz.getEnvironmentFromString(al.getName(), true);
if (e != null) {
res.add(al.getName());
return; // this is a continue
}
}
}
}
return res;
}
job('example') {
parameters {
activeChoiceParam('CHOICE-1') {
choiceType('SINGLE_SELECT')
groovyScript {
script(readFileFromWorkspace('className.groovy') + "\n" + readFileFromWorkspace('executionPart.groovy'))
}
}
}
}