詹金斯:对于每个循环问题

时间:2018-03-27 15:09:52

标签: jenkins groovy

我正在使用Jenkins来触发Ansible剧本。我想传递一系列计算机名称,以便Ansible剧本能够触发剧本并逐一对机器进行成像。

为了做到这一点,我相信我需要一个foreach循环。

我在groovy / Jenkins方面没什么技巧,遇到了一个问题。

error = "Expected a symbol @ line..."这指的是HOSTS.each {item - >

有人可以帮助我吗?我的脚本如下(我已经编辑了一些私人数据)

pipeline {
    agent any
    // every day
    triggers {
        cron('H 7 * * *')
    }

    environment {
          HOSTS = ['node1','node2']
    }

stages {

    stage('MachineDB Scheduler') {
            steps {
                HOSTS.each { item -> // review
                    HOSTNAME = ${item} // review
                    ansibuildPlaybookperf(
                        sshUser: env.USER,
                        vaultUser: env.USER,
                        server: "$SERVER",
                        dir: "$HOMEDIR/$BUILD_TAG",
                        playbook: "$PLAYBOOK",
                        extras: "--vault-password-file passmgr.sh",
                        extraVars: "$VARS_JENKINS"
                    )
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我对ansible并不是很了解但也许这会有所帮助。 此管道显示了PC的列表。在声明性管道中,我调用了一个在管道之后定义的groovy函数。在这个函数中,我浏览列表并通过每个PC名称。

def list = [
        'PCNAME1',
        'PCNAME2',
        'PCNAME3'
]

pipeline {
    agent any

    stages {
        stage('Loop through PCs') {
            steps {
                loopPC(list)
            }
        }
    }
}

def loopPC(list){
    list.each {
        println "Computer ${it}"
    }
}

输出:

[Pipeline] {
[Pipeline] stage
[Pipeline] { (Loop through PCs)
[Pipeline] echo
Computer PCNAME1
[Pipeline] echo
Computer PCNAME2
[Pipeline] echo
Computer PCNAME3
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

您还可以在声明性管道中使用脚本块立即执行脚本。它不太干净,但在开始时可能更容易并使其工作(并且更接近您的尝试):

def list = [
        'PCNAME1',
        'PCNAME2',
        'PCNAME3'
]

pipeline {
    agent any

    stages {
        stage('Loop through PCs') {
            steps {
                script {
                    list.each {
                    println "Computer ${it}"
                    }
                }
            }
        }
    }
}