web-dev-qa-db-fra.com

Comment puis-je utiliser `def` dans le pipeline jenkins

J'apprends le pipeline jenkins et j'ai essayé de suivre ceci code du pipeline . Mais mes Jenkins se plaignent toujours que def n'est pas légal. Je me demande si j'ai raté des plugins? J'ai déjà installé groovy, job-dsl, mais ne fonctionne pas.

8
Ron

Comme l'a dit @Rob, il existe 2 types de pipelines: scripted et declarative. C'est comme imperative vs declarative. def n'est autorisé que dans le pipeline scripted ou enveloppé dans script {}.

Pipeline scripté (impératif)

Commencez par node et def ou if est autorisé, comme ci-dessous. C'est de façon traditionnelle. node { stage('Example') { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } } }

Pipeline déclaratif (préféré)

Commencez par pipeline, et def ou if n'est PAS autorisé, sauf s'il est entouré de script {...}. Le pipeline déclaratif rend beaucoup de choses faciles à écrire et à lire.

déclencheur de temps

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

quand

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

Parallèle

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

incorporé avec du code scripté

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

Pour lire la grammaire du pipeline plus déclarative, veuillez vous référer au doc ​​officiel ici

12
Ron

Vous pouvez utiliser def avec un pipeline déclaratif, mais pas à l'intérieur, par exemple

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

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