循环进入Jenkins CICD管道并在同一作业中调用另一个JenkinsFiles

时间:2019-02-18 08:44:54

标签: jenkins jenkins-pipeline jenkins-groovy

我有Jenkins CICD管道,我需要读取一个配置文件,该文件包含需要使用标签号构建的Project的键值对。

我需要阅读此文件并在Loop中执行Jenkins管道步骤。

目前,我的Jenkins CICD管道适用于单个构建。尝试读取配置文件并循环执行步骤时遇到问题。

下面是我要实现的代码示例:

pipeline{
    agent any    
    environment {
        buildApp = "$ApplicationToBuild"
        cloudEnvironment = "$ENV"
        TIMESTAMP = new java.text.SimpleDateFormat('yyyyMMddHHmmss').format(new Date())
        WORKSPACE="${env.WORKSPACE}"
    }
    stages {
        stage ('Validation step for deployment') {      
            steps {
        script {
                    sh 'line_count=$( wc -l applicationSettings.config )'
                    echo 'line count is $line_count'
                    for (int lines = 0; lines < ${line_count}; lines++) {
                        gitAppRepo=""
                        gitAppTag=""
                        gitAppRepo=$(echo $lines |  sed 's/=.*//')
                        echo "gitAppRepo is $gitAppRepo"
                        gitAppTag=$(grep "^$gitAppRepo=" ./applicationSettings.config |cut -d= -f2)
                        echo "gitAppTag is $gitAppTag"                      
                    }
                    }
                }
            }
    }
    post {
        always {
            echo 'One way or another, I have finished'
            }
    }
}

我使用行数并遍历配置文件来部署应用程序和标记。实际的部署将在另一个jenkins文件中调用,该文件包含所有步骤。

在上面的循环中遇到下面的错误。在groovy中是否有任何紧急方法可以循环?

  

java.lang.NoSuchMethodError:在步骤之间找不到这样的DSL方法“ $”

以及我们如何在同一项目中调用另一个JenkinsFile。下面是我的文件结构。我需要在Jenkins_files中调用Jenkins_files_main。

Jenkins_files
README.md
applicationSettings.config
Jenkins_files_main

1 个答案:

答案 0 :(得分:0)

首先,您使用了${line_count},它仅在运行Shell脚本时有效(因为它查找环境变量)。除此之外,您还可以将其用作"${line_count}"或简单地用作line_count。然后,为此,您应该已经在像这样的变量中读取了命令的输出:

def line_count= sh(script: "wc -l applicationSettings.config",
                   returnStdout: true).trim()

因此您的for循环将变为:

for (int lines = 0; lines < line_count; lines++)

然后,还有一种更好的方式来读取json文件,如下所示:

    def object = readJSON file: "your.json"


            for (key in object.element.keySet()) {
               echo "key=${key}"
               echo "value= ${object.element.get(key)}"
}

希望这会有所帮助。