Declarative pipeline when condition in post

前端 未结 3 807
無奈伤痛
無奈伤痛 2020-12-30 21:35

As far as declarative pipelines go in Jenkins, I\'m having trouble with the when keyword.

I keep getting the error No such DSL method \'when\' found a

相关标签:
3条回答
  • 2020-12-30 22:05

    Using a GitHub Repository and the Pipeline plugin I have something along these lines:

    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
            } 
          }
        }     
      }
    }
    

    And that way, notifications can be sent based on the type of branch being built. See the pipeline model definition and also the global variable reference available on your server at http://your-jenkins-ip:8080/pipeline-syntax/globals#env for details.

    0 讨论(0)
  • 2020-12-30 22:08

    Ran into the same issue with post. Worked around it by annotating the variable with @groovy.transform.Field. This was based on info I found in the Jenkins docs for defining global variables.

    e.g.

    #!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 ...
        }
    }
    
    0 讨论(0)
  • 2020-12-30 22:26

    In the documentation of declarative pipelines, It is mentionned that you can't use when in the post block. when is allowed only inside a stage directive. So what you can do is test the conditions using an if in a script:

    post {
    success {
      script {
        if (${env.BRANCH_NAME} == 'master')
            currentBuild.result = 'SUCCESS'
      }
     }
    // failure block
    }
    
    0 讨论(0)
提交回复
热议问题