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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了詹金斯:对于每个循环问题相关的知识,希望对你有一定的参考价值。

我正在使用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"
                    )
                }
            }
        }
    }
}
答案

我对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}"
    }
}

OUTPUT:

[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}"
                    }
                }
            }
        }
    }
}

以上是关于詹金斯:对于每个循环问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用事件侦听器来加载动画片段的循环

如何管理在每个 git 版本中添加私有代码片段?

如何向正在运行的詹金斯作业发送信号

如何从詹金斯访问maven属性?

每个詹金斯奴隶只能运行一个作业吗?

当每个文件都应该符合标准时,为啥詹金斯会说“没有找到工件”?