首页 > 解决方案 > 如何将数组分配给Jenkinsfile中的Env变量

问题描述

我正在尝试运行具有多个服务器的管道。选择选择参数时,我想一次在多个服务器中执行一些操作。我的想法是选择一个选择参数“应用程序”并在 4 个不同的服务器上依次执行一些操作(一次一个服务器)。我正在尝试将分配服务器值的环境变量放在一个数组中,然后要求环境变量执行操作。

pipeline {
    agent {
        node {
            label 'master'
        }
    }

    environment {

        APPLICATION = ['veappprdl001','veappprdl002','veappprdl003','veappprdl004']
        ROUTER = ['verouprdl001','verouprdl002']

    }

        parameters {
        choice(name: 'SERVER_NAME', choices: ['APPLICATION','ROUTER'], description: 'Select Server to Test' )
    }

    stages {

         stage ('Application Sync') {

            steps {
                script {                                
                    
                        if (env.SERVER_NAME == 'APPLICATION') { 
    
                
                sh """

                    curl --location --request GET 'http://${SERVER_NAME}//configuration-api/localMemory/update/ACTION'

                """
                        }
                }
            }
         }
    } }

如果在“使用参数构建”中选择了“APPLICATION”参数,我想在“APPLICATION”变量的所有服务器上执行该操作。

任何帮助将不胜感激。

谢谢

标签: jenkinsjenkins-pipelinejenkins-groovy

解决方案


您不能在环境变量中存储数组类型的值。无论您尝试分配给 env 变量,都会自动转换为字符串类型。(我在下面的博客文章或这个视频中更详细地解释了它。)所以当你尝试分配一个数组时,你分配的是它的toString()表示。

但是,您可以以不同的方式解决此问题。您可以使用公共分隔符存储一串值(例如),而不是尝试分配数组,。然后在期望使用元素列表的部分中,您只需调用tokenize(",")方法来生成字符串元素列表. 有了它,您就可以迭代并按顺序做事。

请考虑以下示例,该示例说明了此替代解决方案。

pipeline {
    agent any

    environment {
        APPLICATION = "veappprdl001,veappprdl002,veappprdl003,veappprdl004"
    }
    
    stages {
        stage("Application Sync") {
            steps {
                script {
                    env.APPLICATION.tokenize(",").each { server ->
                        echo "Server is $server"
                    }
                }
            }
        }
    }
}

当你运行这样的管道时,你会得到这样的东西:

在此处输入图像描述


推荐阅读