使用groovy脚本的Jenkins参数

fcwjkofz  于 2022-11-01  发布在  Jenkins
关注(0)|答案(1)|浏览(357)

更新

我有一个简单的管道,我想从一个文件中以参数的形式接收多个选择。

@Test1,Accounts
@Test2,Services
@Test3,Accesses

并且我希望复选框中的所有“@Test1”、“@Test2”和“@Test3”都作为参数,这样我就可以只运行选定的测试。但是我不明白我做错了什么。管道

def code = """tests = getChoices()
return tests
def getChoices() {
    def filecontent = readFile "/var/jenkins_home/test.txt"
    def stringList = []
    for (line in filecontent.readLines()) {stringList.add(line.split(",")[0].toString())}
    List modifiedList = stringList.collect{'"' + it + '"'}
    return modifiedList
}""".stripIndent()

properties([
        parameters([
                [$class              : 'CascadeChoiceParameter',
                 choiceType          : 'PT_CHECKBOX',
                 description         : 'Select a choice',
                 filterLength        : 1,
                 filterable          : false,
                 name                : 'choice1',
                 referencedParameters: 'role',
                 script              : [$class        : 'GroovyScript',
                                        fallbackScript: [
                                                classpath: [],
                                                sandbox  : true,
                                                script   : 'return ["ERROR"]'
                                        ],
                                        script        : [
                                                classpath: [],
                                                sandbox  : true,
                                                script   : code
                                        ]
                 ]
                ]
        ])
])

pipeline {
    agent {
        docker { image 'node:latest' }
    }

    stages {
        stage('Tags') {
            steps {
                getChoices()
            }
        }
    }
}

def getChoices() {
    def filecontent = readFile "/var/jenkins_home/test.txt"
    def stringList = []

    for (line in filecontent.readLines()) {
        stringList.add(line.split(',')[0].toString())
    }
    List modifiedList = stringList.collect { '"' + it + '"' }
    echo "$modifiedList"
    return modifiedList
}

通过这种方法,我知道我可以使用多选复选框,因为我尝试将

def code = """ tests = ["Test1", "Test2", "Test3"]
return tests""".stripIndent()

我得到了我想要的输出。
但是当我运行我的管道时,我得到了构建成功,但总是在我的构建参数复选框中得到fallbackScript。有人能帮助我了解是什么导致fallbackScript总是运行吗?谢谢:)

z31licg0

z31licg01#

如果要自动填充生成参数,则必须从函数返回参数列表。执行管道时,将填充带有参数的生成。请注意,只有在第二次执行管道时,新参数才可用。请参阅以下内容。

pipeline {
    agent any
    parameters{
            choice(name: 'TESTES', choices: tests() , description: 'example')
    }

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

def tests() {
    return ["Test01", "Test2", "Test4"]
}

如果您希望在每次执行构建时都获得用户输入,则应将choice参数移到一个阶段中。请参考以下内容。

pipeline {
    agent any

    stages {
        stage('Get Parameters') {
            steps {
                script{
                def choice = input message: 'Please select', ok: 'Next',
                             parameters: [choice(name: 'PRODUCT', choices: tests(), description: 'Please select the test')]
                    echo '$choice'
                }
            }
        }
    }
}

def tests() {
    return ["Test01", "Test2", "Test4"]
}

更新02

以下是如何从文件中读取并动态创建选择列表。

pipeline {
    agent any

    stages {
        stage('Get Parameters') {
            steps {
                script{
                        sh''' 
                        echo "@Test1,Accounts" >> test.txt
                        echo "@Test2,Services" >> test.txt
                        '''
                def choice = input message: 'Please select', ok: 'Next',
                                parameters: [choice(name: 'PRODUCT', choices: getChoices(), description: 'Please select the test')]
                }
            }
        }
    }
}

def getChoices() {
    def filecontent = readFile "test.txt"
    def choices = []
    for(line in filecontent.readLines()) {
        echo "$line"
        choices.add(line.split(',')[0].split('@')[1])

    }
    return choices
}

相关问题