web-dev-qa-db-ja.com

Jenkinsパイプラインで「def」を使用するにはどうすればよいですか

私はジェンキンスのパイプラインを学んでいます、そして、私はこれを追おうとしました パイプラインコード 。しかし、私のジェンキンスは常にdefが合法ではないと文句を言います。プラグインを見逃していませんか? groovyjob-dsl、しかし動作しません。

8
Ron

@Robが言ったように、パイプラインにはscripteddeclarativeの2種類があります。 imperativedeclarativeのようなものです。 defは、scriptedパイプラインでのみ許可されるか、_script {}_でラップされます。

スクリプトパイプライン(Imperative)

nodeで始まり、以下のようにdefまたはifが許可されます。それは伝統的な方法です。 node { stage('Example') { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } } }

宣言的パイプライン(推奨)

pipelineで始まり、defまたはifは、_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

12
Ron

Defを宣言パイプラインで使用できますが、その内部だけではありません

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

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