如何在jenkins管道中使用`def`

时间:2017-11-10 06:19:12

标签: jenkins jenkins-plugins jenkins-pipeline

我正在学习jenkins管道,我试图遵循这个pipeline code。但我的詹金斯总是抱怨def不合法。我想知道我是否错过任何插件?我已安装groovyjob-dsl,但无法正常工作。

3 个答案:

答案 0 :(得分:10)

正如@Rob所说,有两种类型的管道:scripteddeclarative。它就像imperative vs declarativedef仅在scripted管道中允许或包含在script {}中。

脚本管道(势在必行)

node开始,允许defif,如下所示。这是传统的方式。 node { stage('Example') { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } } }

声明性管道(首选)

pipeline开始,不允许defif,除非它包含在script {...}中。声明性管道使得很容易编写和读取。

时间触发器

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

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

并行

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

嵌入了脚本代码

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

要阅读更多声明性管道语法,请参阅官方文档here

答案 1 :(得分:1)

您可以将def与声明性管道一起使用,只是不在其内部使用

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

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

答案 2 :(得分:0)

您可以使用def来使用node,如下所示:

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

另一种方式:使用script{..}

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