我正在学习jenkins管道,我试图遵循这个pipeline code。但我的詹金斯总是抱怨def
不合法。我想知道我是否错过任何插件?我已安装groovy
,job-dsl
,但无法正常工作。
答案 0 :(得分:10)
正如@Rob所说,有两种类型的管道:scripted
和declarative
。它就像imperative
vs declarative
。 def
仅在scripted
管道中允许或包含在script {}
中。
从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
答案 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'
}}