groovy Jenkinsfile Stages可以被重构以重用/DRY吗

aelbi1ox  于 4个月前  发布在  Jenkins
关注(0)|答案(2)|浏览(52)

我的jenkinsfile包含像这样的阶段:

stages {
  stage('init'){
    steps {
      sh 'do-init'
    }
  }
  stage('region1') {
    stages {
      stage('build') {
        steps{
          script {
            dir("testing"){
              build(region:'region1', labels:"label1")
            }
          }
        }
      }
      stage('delete') {
        steps{
          script {
            dir ("testing"){
              delete('region1')
            }
          }
        }
      }
    }
  }
  stage('region2') {
    // repeat region1 stage for region2, label2 - edited for brevity
  }
}

字符串
有没有可能将内部的“region stage”重构为一个共享库,然后在script {}块中调用它两次?
到目前为止,我的尝试都以常见的DSL错误“stages not found in steps”结束

kknvjkwl

kknvjkwl1#

是的,这是有可能实现你想要的,你只需要确保在共享库函数中,你使用的是脚本管道语法,而不是减速语法。
例如,在您的管道中,您可以执行以下操作:

stages {
  stage('init'){
    steps {
      sh 'do-init'
    }
  }
  stage('region1') {
    steps {
       buildAndDelete('region1', 'label1') // or using the Map version buildAndDelete region: 'region1', labels: 'label1'
    }
   
  stage('region2') {
    steps {
       buildAndDelete('region2', 'label2')
    }
  }
}

字符串
现在,在您的共享库vars文件夹中,您将拥有一个名为buildAndDelete.groovy的文件,其内容如下:

def call(Map params) {
    call(params.region, params.labels)
}

def call(String region, String labels) {
   stage('build') {
       dir("testing"){
           build(region: region, labels:labels)
       }
   }
   stage('delete') {
       dir("testing"){
           delete(region)
       }
   }
}


当然,您可以根据需要更改输入参数。

9lowa7mx

9lowa7mx2#

我得到了同样的问题,而试图使一个动态的多个小阶段内的一个大阶段。你可以得到的原因,你得到DSL错误“阶段未找到步骤”的问题与id 42113655
换句话说,在我的例子中,我用输入参数创建了一个新的管道,所以当我想重用相同的阶段时,jenkins使用pipeline-build-step plugin和重要参数触发第二个管道
如果您有一个很长的区域列表,可以将我的解决方案与jenkinsfile中的一个循环结合起来,以获得动态数量的区域。

相关问题