26

I am learning Jenkins Pipeline, and I tried to follow this Pipeline code. But my Jenkins always complains that def is not legal.

I am wondering did I miss any plugins? I already installed groovy, job-dsl, but it doesn't work.

2
  • 2
    There are 2 types of pipelines: scripted and declarative. Certain things can't be used in part of the declarative pipeline. Learn the difference between the two and you should learn where def is valid. Commented Nov 10, 2017 at 6:22
  • 2
    Thanks for your hints, it leads to the answer. def is used in scripted pipeline, which start with node {...}; while my file starts with pipeline, which is declarative, and def is not allowed, unless it is wrapped by script {...} Commented Nov 10, 2017 at 8:22

3 Answers 3

30

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

Sign up to request clarification or add additional context in comments.

1 Comment

See my example of it above as an alternative way to use it on a declarative pipeline
10

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

Comments

-2

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

1 Comment

The latter form doesn't work. It seems you have to use the variable within the script block or you get groovy.lang.MissingPropertyException for it.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.