当从带有映射的导入类中的函数被触发时,詹金斯并行失败

问题描述 投票:0回答:1

Jenkins并行失败,当从带有映射的导入类中触发函数时:

java.lang.IllegalArgumentException: Expected a closure or failFast but found dev=automation_dev

管道:

#!/usr/bin/env groovy
@Library('SharedLibraries@master') _

def lib = new com.jenkins.dir()

pipeline {
    agent {
        node {
            label "master"
        }
    }
    parameters {
        string(defaultValue: "automation", description: '', name: 'createdir')
    }
    stages {
        stage('Create dir') {
            steps {
                script {
                    parallel lib.parallelCreateDir(createdir, this)
                }
            }
        }
    }
    post {
        always {
            script {
                deleteDir()
                cleanWs()
            }
        }
    }
}

在src / com / jenkins / dir.groovy中

package com.jenkins

class dir {
    // need to create constructor to use below variables or methods
    public dir() {
    }
    // variable for the environments
    def profiles = ["dev", "stg", "prod"]
    // variables converted to map
    def parallelCreateDir(String createdir, caller) {
         profiles.collectEntries { it ->
            caller.stage("Generate: ${it}") {
                caller.echo "${createdir}_${it}"
            }
            ["${it}": "${createdir}_${it}"]
        }
    }
}

一般方法之所以有效,是因为打印目录,但是直到最后失败:

[Pipeline] {
[Pipeline] stage
[Pipeline] { (Create dir)
[Pipeline] script
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Generate: dev)
[Pipeline] echo
automation_dev
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Generate: stg)
[Pipeline] echo
automation_stg
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Generate: prod)
[Pipeline] echo
automation_prod
[Pipeline] }
[Pipeline] // stage
[Pipeline] parallel
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline

java.lang.IllegalArgumentException: Expected a closure or failFast but found dev=automation_dev
    at org.jenkinsci.plugins.workflow.cps.steps.ParallelStep$DescriptorImpl.newInstance(ParallelStep.java:278)
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:266)
jenkins groovy jenkins-pipeline jenkins-groovy
1个回答
0
投票
@ daggett回答后,这里是提出的解决方案:

管道:

#!/usr/bin/env groovy @Library('SharedLibraries@master') _ def profiles = ["dev", "stg", "prod"] def lib = new com.jenkins.dir() pipeline { agent { node { label "master" } } parameters { string(defaultValue: "automation", description: '', name: 'createdir') } stages { stage('Create dir') { steps { script { parallel lib.parallelCreateDir(createdir, this, profiles) } } } } post { always { script { deleteDir() cleanWs() } } } }

src / com / jenkins / dir.groovy:

package com.jenkins class dir implements Serializable { // need to create constructor to use below variables or methods public dir() { } // variables converted to map def parallelCreateDir(createdir, caller, List<String> pProfiles) { pProfiles.collectEntries { it -> ["${it}": generateMap(createdir, caller, it)] } } def generateMap(String pCreateDir, caller, String profile) { return { it -> caller.stage("Generate: ${profile}") { caller.sh "cp -a ${pCreateDir} ${pCreateDir}_${profile}" } } } }

© www.soinside.com 2019 - 2024. All rights reserved.