我正在创建一个示例jenkins管道,这里是代码。
pipeline {
agent any
stages {
stage('test') {
steps {
sh 'echo hello'
}
}
stage('test1') {
steps {
sh 'echo $TEST'
}
}
stage('test3') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}
}
此管道失败并显示以下错误日志
Started by user admin
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 15: Not a valid stage section definition: "if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}". Some extra configuration is required. @ line 15, column 9.
stage('test3') {
^
WorkflowScript: 15: Nothing to execute within stage "test3" @ line 15, column 9.
stage('test3') {
^
但是当我执行以下示例from this url时,它会成功执行并打印else部分。
node {
stage('Example') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}
我能看到的唯一区别是,在工作示例中没有stages
但在我的情况下它有。{/ p>
这里有什么问题,有人可以建议吗?
答案 0 :(得分:72)
您的第一次尝试是使用声明性管道,第二次尝试使用脚本化管道。您需要在步骤声明中包含步骤,并且您不能将if
用作声明中的顶级步骤,因此您需要将其包装在script
步骤中。这是一个有效的声明版本:
pipeline {
agent any
stages {
stage('test') {
steps {
sh 'echo hello'
}
}
stage('test1') {
steps {
sh 'echo $TEST'
}
}
stage('test3') {
steps {
script {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}
}
}
}
你可以通过使用"当"来简化这个并且可能避免if语句(只要你不需要其他语句)。参见"何时指令"在https://jenkins.io/doc/book/pipeline/syntax/。你也可以使用jenkins rest api验证jenkinsfiles。它非常甜蜜。在jenkins中使用声明性管道获得乐趣!
答案 1 :(得分:19)
它需要一些重新排列,但when
可以很好地替换上面的条件。以下是使用声明性语法编写的上述示例。请注意,test3
阶段现在是两个不同的阶段。一个在主分支上运行,另一个在其他任何分支上运行。
stage ('Test 3: Master') {
when { branch 'master' }
steps {
echo 'I only execute on the master branch.'
}
}
stage ('Test 3: Dev') {
when { not { branch 'master' } }
steps {
echo 'I execute on non-master branches.'
}
}
答案 2 :(得分:1)
如果您想创建一个条件来仅根据表达式执行一个阶段,您可以使用关键字 when
stage ('test3'){
when { expression { return env.BRANCH_NAME == 'master'} }
steps {
echo 'I only execute on the master branch.'
}
}
}
使用 expression
关键字可以添加任何条件。
例如如果 stage 依赖于工作区中生成的文件。
stage ('File Dependent stage'){
when { expression { return fileExists ('myfile') } }
steps {
echo "file exists"
}
}
}
答案 3 :(得分:-2)
if ( params.build_deploy == '1' ) {
println "build_deploy 是 ${params.build_deploy}"
jobB = build job: 'k8s-core-user_deploy', propagate: false, wait: true, parameters: [
string(name:'environment', value: "${params.environment}"),
string(name:'branch_name', value: "${params.branch_name}"),
string(name:'service_name', value: "${params.service_name}"),
]
println jobB.getResult()
}