Jenkins 活动选项参数中的通用Groovy脚本

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

我有一个groovy脚本,它对许多作业都是通用的,它们都包含一个Active参数。我不想重复同一个脚本几十次,而是想把它放在一个(库|?)中一次,并在每个作业中引用它

这个脚本在我粘贴的任何工作中都能很好地工作。只需要知道是否有可能把它放在一个地方,并在所有工作中共享。更新一次,即更新所有作业

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的情况下,此操作才有效。我还没有尝试通过向詹金斯家添加路径来实现这一点

您可以使用以下选项:

  • 将所有函数放入groovy文件中。例如,我们将其命名为:activeChoiceParams.groovy
  • 通过:
    jar cvf
    将该文件转换为jar。例如:
    jar-cvf-activeChoiceParams.jar-activeChoiceParams.groovy
  • 将jar文件移动到/packages/lib/ext
  • 重新启动詹金斯
  • 在活动选项中,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插件找到了有趣的解决方案

    通常,活动选项的作业定义如下所示:

  • 在className.groovy中,可以将类定义为公共部分
  • 使用executionPart.groovy,您可以创建实例并生成特定的部分

  • 在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'))
                }
            }
         }
      }