How can I use `def` in jenkins pipeline

别等时光非礼了梦想. 提交于 2020-12-28 18:26:43

问题


I am learning jenkins pipeline, and I tried to follow this pipeline code. But my jenkins always complain that def is not legal. I am wondering did I miss any plugins? I already installed groovy, job-dsl, but doesn't work.


回答1:


As @Rob said, There are 2 types of pipelines: scripted and declarative. It is like imperative vs declarative. def is only allowed in scripted pipeline or wrapped in script {}.

Scripted pipeline (Imperative)

Start with node, and def or if is allowed, like below. It is traditional way. node { stage('Example') { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } } }

Declarative pipeline (Preferred)

Start with pipeline, and def or if is NOT allowed, unless it is wrapped in script {...}. Declarative pipeline make a lot things easy to write and read.

time trigger

pipeline {
    agent any
    triggers {
        cron('H 4/* 0 0 1-5')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

when

pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                branch 'production'
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}

Parallel

pipeline {
    agent any
    stages {
        stage('Non-Parallel Stage') {
            steps {
                echo 'This stage will be executed first.'
            }
        }
        stage('Parallel Stage') {
            when {
                branch 'master'
            }
            failFast true
            parallel {
                stage('Branch A') {
                    agent {
                        label "for-branch-a"
                    }
                    steps {
                        echo "On Branch A"
                    }
                }
                stage('Branch B') {
                    agent {
                        label "for-branch-b"
                    }
                    steps {
                        echo "On Branch B"
                    }
                }
            }
        }
    }
}

embedded with scripted code

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'

                script {
                    def browsers = ['chrome', 'firefox']
                    for (int i = 0; i < browsers.size(); ++i) {
                        echo "Testing the ${browsers[i]} browser"
                    }
                }
            }
        }
    }
}

To read more declarative pipeline grammar, please refer the official doc here




回答2:


You can use def with a declarative pipeline, just not inside it eg

def agentLabel
if (BRANCH_NAME =~ /^(staging|master)$/)  {
    agentLabel = "prod"
} else {
    agentLabel = "master"
}

pipeline {
  agent { node { label agentLabel } } 
..



回答3:


You can use def by using node like below:

node {
stage('Example') {
    if (env.BRANCH_NAME == 'master') {
        echo 'I only execute on the master branch'
    } else {
        echo 'I execute elsewhere'
    }
}

Another way : by using script{..}

    stage ('jon'){
steps{
script{                                                                                              
    def imageLine = 'chiducaff/user_containers:sonnginx'
}
    writeFile file: 'anchore_images', text: imageLine
    anchore name: 'anchore_images'
                           }}


来源:https://stackoverflow.com/questions/47216731/how-can-i-use-def-in-jenkins-pipeline

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!