发布条件时的声明性管道

时间:2018-04-12 13:58:15

标签: jenkins

就Jenkins的声明性管道而言,我在使用 关键字时遇到了问题。

我一直收到错误No such DSL method 'when' found among steps。我是Jenkins 2声明性管道的新手,并不认为我将脚本化管道与声明性管道混合在一起。

此管道的目标是在Sonar成功运行后运行mvn deploy并发送失败或成功的邮件通知。我只希望在master或release分支上部署工件。

我遇到困难的部分是在帖子部分。 通知阶段效果很好。请注意,我在没有 when 子句的情况下使用它,但确实需要它或等效物。

pipeline {
  agent any
  tools {
    maven 'M3'
    jdk 'JDK8'
  }
  stages {
    stage('Notifications') {
      steps {
        sh 'mkdir tmpPom'
        sh 'mv pom.xml tmpPom/pom.xml'
        checkout([$class: 'GitSCM', branches: [[name: 'origin/master']], doGenerateSubmoduleConfigurations: false, submoduleCfg: [], userRemoteConfigs: [[url: 'https://repository.git']]])
        sh 'mvn clean test'
        sh 'rm pom.xml'
        sh 'mv tmpPom/pom.xml ../pom.xml'
      }
    }
  }
  post {
    success {
      script {
        currentBuild.result = 'SUCCESS'
      }
      when { 
        branch 'master|release/*' 
      }
      steps {
        sh 'mvn deploy'
      }     
      sendNotification(recipients,
        null,             
        'https://link.to.sonar',
        currentBuild.result,
      )
    }
    failure {
      script {
        currentBuild.result = 'FAILURE'
      }    
      sendNotification(recipients,
        null,             
        'https://link.to.sonar',
        currentBuild.result
      )
    }
  }
}

3 个答案:

答案 0 :(得分:12)

documentation声明性管道中,提到您无法在when块中使用postwhen仅允许在stage指令中使用。 所以你能做的是:

post {
success {
  script {
    if (${GIT_LOCAL_BRANCH} == 'master')
        currentBuild.result = 'SUCCESS'
  }
 }
// failure block
}

答案 1 :(得分:4)

使用GitHub存储库和Pipeline plugin,我可以遵循以下几点:

pipeline {
  agent any
  stages {
    stage('Build') {
      steps {
        sh '''
          make
        '''
      }
    }
  }
  post {
    always {
      sh '''
        make clean
      '''
    }
    success {
      script {
        if (env.BRANCH_NAME == 'master') {
          emailext (
            to: 'engineers@green-planet.com',
            subject: "${env.JOB_NAME} #${env.BUILD_NUMBER} master is fine",
            body: "The master build is happy.\n\nConsole: ${env.BUILD_URL}.\n\n",
            attachLog: true,
          )
        } else if (env.BRANCH_NAME.startsWith('PR')) {
          // also send email to tell people their PR status
        } else {
          // this is some other branch
        } 
      }
    }     
  }
}

这样,可以根据正在构建的分支类型发送通知。有关详细信息,请参见pipeline model definition和服务器上http://your-jenkins-ip:8080/pipeline-syntax/globals#env上可用的全局变量引用。

答案 2 :(得分:1)

遇到与post相同的问题。通过用@groovy.transform.Field注释变量来解决该问题。这是基于我在Jenkins文档中为defining global variables找到的信息。

例如

#!groovy

pipeline {
    agent none
    stages {
        stage("Validate") {
            parallel {
                stage("Ubuntu") {
                    agent {
                        label "TEST_MACHINE"
                    }
                    steps {{
                        sh "run tests command"
                        recordFailures('Ubuntu', 'test-results.xml')
                        junit 'test-results.xml'
                    }
                }
            }
        }
    }
    post { 
        unsuccessful { 
            notify()
        }
    }
}

// Make testFailures global so it can be accessed from a 'post' step
@groovy.transform.Field
def testFailures = [:]

def recordFailures(key, resultsFile) {
    def failures = ... parse test-results.xml script for failures ...
    if (failures) {
        testFailures[key] = failures
    }
}

def notify() {
    if (testFailures) {
        ... do something here ...
    }
}