声明式Jenkins管道:如何为不同的存储库迭代同一阶段?

时间:2019-05-10 09:39:20

标签: maven jenkins jenkins-pipeline jenkins-declarative-pipeline

我有几个Maven项目都以相同的方式进行发布。

是否可以重用同一阶段,并使用另一个存储库名称进行迭代以进行克隆?

stage('Maven_microservices') {
steps {

    checkout([$class: 'GitSCM', 
        branches: [[name: "*/${env.BRANCH}"]], 
        doGenerateSubmoduleConfigurations: false, 
        extensions: [[$class: 'CleanBeforeCheckout'], 
        [$class: 'RelativeTargetDirectory', relativeTargetDir: 'maven_microservice_1']], 
        submoduleCfg: [], 
        userRemoteConfigs: [[credentialsId: 'autouser',
        url: 'ssh://mygerrit:29418/maven/maven_microservice_1']]])

    container('maven') {                 
        configFileProvider([configFile(fileId: 'maven_settings', variable: 'MAVEN_SETTINGS')]) {
            dir('maven_microservice_1') {
                sh 'mvn -s $MAVEN_SETTINGS versions:update-parent'
                sh 'mvn -s $MAVEN_SETTINGS versions:resolve-ranges'
                sh 'mvn -s $MAVEN_SETTINGS versions:use-releases'
                sh 'mvn -s $MAVEN_SETTINGS --batch-mode release:prepare'
            }
        }                                   
    }
}

}

2 个答案:

答案 0 :(得分:1)

不能100%地确定这个答案是否是您所需要的,但是您意思是这样的吗?

('maven_microservice_1', 'maven_microservice_2').each { projectName ->

  stage("${projectName}") {
    steps {

      checkout([$class: 'GitSCM', 
        branches: [[name: "*/${env.BRANCH}"]], 
        doGenerateSubmoduleConfigurations: false, 
        extensions: [[$class: 'CleanBeforeCheckout'], 
        [$class: 'RelativeTargetDirectory', relativeTargetDir: "${projectName}"]], 
        submoduleCfg: [], 
        userRemoteConfigs: [[credentialsId: 'autouser',
        url: "ssh://mygerrit:29418/maven/${projectName}"]]])

      container('maven') {                 
        configFileProvider([configFile(fileId: 'maven_settings', variable: 'MAVEN_SETTINGS')]) {
          dir("${projectName}") {
            sh 'mvn -s $MAVEN_SETTINGS versions:update-parent'
            sh 'mvn -s $MAVEN_SETTINGS versions:resolve-ranges'
            sh 'mvn -s $MAVEN_SETTINGS versions:use-releases'
            sh 'mvn -s $MAVEN_SETTINGS --batch-mode release:prepare'
          }
        }
      }                                   
    }
  }
}

答案 1 :(得分:0)

使用Jenkins声明式共享库可以解决此问题。请参阅Extending with Shared Libraries

在库-vars文件夹中创建GenericMavenRelease.groovy并嵌入此代码

def call(body){
    //evaluate the body block, and collect configuration into the object
    def config = [:]
    def builder
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    body()


    pipeline{
        agent any
        stages{
            stage('Maven_Microservices'){
                steps{
                        checkout([$class: 'GitSCM', 
                        branches: [[name: "*/${env.BRANCH}"]], 
                        doGenerateSubmoduleConfigurations: false, 
                        extensions: [[$class: 'CleanBeforeCheckout'], 
                        [$class: 'RelativeTargetDirectory', relativeTargetDir: "${projectName}"]], 
                        submoduleCfg: [], 
                        userRemoteConfigs: [[credentialsId: 'autouser',
                        url: "ssh://mygerrit:29418/maven/${projectName}"]]])

                        container('maven') {                 
                        configFileProvider([configFile(fileId: 'maven_settings', variable: 'MAVEN_SETTINGS')]) {
                          dir("${projectName}") {
                            sh 'mvn -s $MAVEN_SETTINGS versions:update-parent'
                            sh 'mvn -s $MAVEN_SETTINGS versions:resolve-ranges'
                            sh 'mvn -s $MAVEN_SETTINGS versions:use-releases'
                            sh 'mvn -s $MAVEN_SETTINGS --batch-mode release:prepare'
                          }
                        }
                }
            }
            }
    }

}

在每个存储库中如下创建Jenkinsfile

@Library('maven-library@1.0.0') _
GenericMavenRelease {
}

以这种方式遵循DRY-不要重复自己,并使用单个管道代码在多个存储库中构建代码