首页 > 解决方案 > 基于文本文件内容jenkins管道迭代并行循环动态阶段

问题描述

我是 jenkins dsl groovy 脚本的新手。我有一个参数化的詹金斯作业,它需要两个输入 $param1 $param2 我有两个阶段。第一阶段生成 output.txt 文件,该文件在工作区中具有如下内容。output.txt 文件根据 stage1 中的 shell 脚本执行更改内容。所以,这些值是动态的 output.txt

svn-test
svn_prod
svn_dev

第二阶段必须从文件 output.txt 中获取输入并在并行循环中迭代动态创建阶段。我有以下代码,但它不接受 output.txt 文件的输入。我无法在舞台上覆盖数组并并行迭代

def jobs = []
def parallelStagesMap = jobs.collectEntries {
    ["${it}" : generateStage(it)]
}

def generateStage(job) {
    return {
        stage("stage: ${job}") {
script{
git credentialsId: 'github', url: 'ssh://github.com/promp/${job}.git', branch: master
                echo "This is ${job}."
                sh ''' make ${parameter1}@"${paramete2}" '''
               }
        }
    }
}

pipeline {
    agent any
parameters {
        parameters {
        string(name: 'parameter1', defaultValue: 'UIAutomation', description: 'Please enter the value')
    string(name: 'parameter2', defaultValue: 'UISite', description: 'Please enter the value')
    }
    stages {
        stage('non-parallel stage') {
            steps {
                script {  
                echo 'This stage will be executed first.'
                sh '''./rotate_script.sh output.txt'''
                }
            }
        }
        stage('parallel stage') {
            failFast false
            steps {
                script {
                    def filePath = readFile('output.txt').trim()
                    def lines = filePath.readLines()
                    line.each {
                    // I have tried to read lines and pass it value. It didn't workout``
                    }
                    parallel parallelStagesMap
                }
            }
        }
    }
}

理想情况下,这就是我的第二阶段之一的样子,并根据 output.txt 文件创建多个并行阶段

stage('svn-test'){
        steps{
            sh 'mkdir -p svn-test'
          dir("svn-test"){
        script{
            git credentialsId: 'github', url: 'ssh://github.com/promp/svn-test.git', branch: master
            sh ''' make ${parameter1}@"${parameter2}"
            '''
        }
      }
    }
  }

标签: arraysjenkinsgroovyjenkins-pipelinejenkins-groovy

解决方案


我终于得到了这样的工作。我不得不将我的 Groovy List 和 the 移动parallelStageMap到我的管道中。当StageMap您的列表为空时,将在脚本开头设置,因此您永远不会得到任何结果。如果在填充列表后移动它,它将起作用。

def generateStage(job) {
    return {
        stage("stage: ${job}") {
            script{
                git credentialsId: 'github', url: 'ssh://github.com/promp/${job}.git', branch: master
                echo "This is ${job}."
                sh ''' make ${parameter1}@"${paramete2}" '''
            }
        }
    }
}

pipeline {
    agent any
    parameters {
         string(name: 'parameter1', defaultValue: 'UIAutomation', description: 'Please enter the value')
         string(name: 'parameter2', defaultValue: 'UISite', description: 'Please enter the value')
    }
    stages {
        stage('non-parallel stage') {
            steps {
                script {  
                    echo 'This stage will be executed first.'
                    sh '''./rotate_script.sh output.txt'''
                }
            }
        }
        stage('parallel stage') {
            failFast false
            steps {
                script {
                    def jobs=[]
                    def filePath = readFile('output.txt').trim()
                    def lines = filePath.readLines()
                    lines.each { job ->
                        jobs.add("${job}")
                    }
                    def parallelStagesMap = jobs.collectEntries {
                        ["${it}" : generateStage(it)]
                    }
                    parallel parallelStagesMap
                }
            }
        }
    }
}

推荐阅读