Jenkins中并行级的动态生成

brqmpdu1  于 2023-06-05  发布在  Jenkins
关注(0)|答案(1)|浏览(153)

我试图在jenkins中生成动态并行阶段。我已经达到了一个点,其中它的工作,但他们不是动态的:

pipeline{
  agent {
    label "node-18"
  }
  parameters{
    ...
  }
  environment{
    ...
  }
  stages{
    stage('whatever previos stage'){
      script{
        .... whatever previos things here (it doesnt matter)
      }
    }
  }

  stage('Run test in parallel'){
    parallel{
      stage('test 0'){
        agent{
          label "node-18"
        }
        steps{
          script{
            runTest('0')
          }
        }
        post{
          always{
            publishrepo('0') //this method use the html publisher
          }
        }
      }
      stage('test 1'){
        agent{
          label "node-18"
        }
        steps{
          script{
            runTest('1')
          }
        }
        post{
          always{
            publishrepo('1') //this method use the html publisher
          }
        }
      }
    }
  }
}

这工作完美,并在jenkins页面中发布HTML报告,到目前为止一切顺利,问题是并不总是有两个阶段,有一种方法可以计算并行化的最大数量,根据这个数字,我必须创建0到N个阶段。
我试着在互联网上查看一些帖子等等:

def maxParallelSteps = [:]
pipeline{
  agent {
    label "node-18"
  }
  parameters{
    ...
  }
  environment{
    ...
  }
  stages{
    stage('whatever previos stage'){
      script{
        .... whatever previos things here (it doesnt matter)
      }
    }
  }

  stage('Check number of stages and create them'){
    steps{
      script {
        def max = checkMaxParallel()
        for(int i = 0 ; i< max ; i++){
           maxParallelSteps.put("test ${i}", generateStage(i)
        }
      }
    }
  }

  stage('Run test in parallel'){
    steps{
      script{
        parallel maxParallelSteps 
      }
    }
  }
}

def generateStage(slot){
  return {
    stage('test ' + slot){
      agent{
        label 'node-18'
      }
      steps{
        script{
          runTest('1')
        }
      }
      post{
        always{
          publishrepo('1') //this method use the html publisher
        }
      }
    } 
  }
}

在这种情况下,我得到以下错误:

考虑到我没有复制和粘贴,但想法是测试0等是P0_test等。
我还尝试在一个阶段中移动for循环,做了很多疯狂的事情。我不知道还有什么要测试的,也不知道在哪里可以找到一个关于如何动态地做到这一点的适当的文档示例。重点是我给你们看的第一段代码工作得很好,唯一的重点是能够根据一个数字创建X个阶段。
我希望我已经正确地解释了我的问题,并提前感谢大家!

tyg4sfes

tyg4sfes1#

在声明性管道中创建真实的的动态并行步骤确实是不可能的,所以你使用了唯一可用的方法,即使用从脚本管道语法中提取的parallel关键字(因此需要script上下文)。
这意味着传递给并行步骤的执行代码也应该以脚本语法编写,在您的情况下,generateStage函数正在生成减速语法代码,因此产生错误。
要解决这个问题,你可以修改你的函数脚本语法:

def generateStage(slot) {
  return {
    stage("test ${slot}") {
       node('node-18') {
          try {
             runTest('1')
          }
          finally {
              publishrepo('1') //this method use the html publisher
          }
      }
    }
  }
}

顺便说一句,你不需要分离成一个函数,可以在舞台内运行它:

pipeline{
  agent {
    label "node-18"
  }
  parameters{
    ...
  }
  environment{
    ...
  }
  stages{
    stage('whatever previos stage'){
      script{
        .... whatever previos things here (it doesnt matter)
      }
    }
  }

  stage('Create and run stages'){
    steps{
      script {
        def parallelSteps = (1..checkMaxParallel()).collectEntries {
          ["test ${i}" : {
              stage("test ${slot}") {
                  node('node-18') {
                     try {
                        runTest('1')
                     }
                     finally {
                        publishrepo('1') //this method use the html publisher
                     }
                 }
              }
           }]
        parallel parallelSteps 
      }
    }
  }
}

相关问题