Ich bin ein Beispiel Jenkins Pipeline erstellen, hier ist der Code.
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'
}
}
}
}
diese Pipeline schlägt mit folgenden Fehlerprotokollen fehl
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') {
^
Aber wenn ich das folgende Beispiel von dieser URL ausführe, wird es erfolgreich ausgeführt und der else-Teil gedruckt.
node {
stage('Example') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}
Der einzige Unterschied, den ich sehen kann, ist, dass es im Arbeitsbeispiel keine Stages
gibt, aber in meinem Fall schon.
Was ist hier falsch, kann mir jemand einen Vorschlag machen?
Ihr erster Versuch verwendet deklarative Pipelines, und die zweite funktionierende ist mit geskripteten Pipelines. Sie müssen Schritte in einer Schrittdeklaration einschließen, und Sie können "if" nicht als Top-Level-Schritt in deklarativen verwenden, so müssen Sie es in einem "Skript"-Schritt verpacken. hier ist eine funktionierende deklarative Version:
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'
}
}
}
}
}
}
Sie können dies vereinfachen und möglicherweise die if-Anweisung vermeiden (solange Sie die else-Anweisung nicht benötigen), indem Sie "when" verwenden. Siehe "when-Direktive" auf https://jenkins.io/doc/book/pipeline/syntax/. Sie können jenkinsfiles auch mit der jenkins rest api validieren. das ist super nett. viel Spaß mit deklarativen Pipelines in jenkins!
Es erfordert ein wenig Umstellung, aber when
macht einen guten Job, um die obigen Konditionale zu ersetzen. Hier ist das Beispiel von oben, geschrieben mit der deklarativen Syntax. Beachten Sie, dass die "test3"-Stufe jetzt aus zwei verschiedenen Stufen besteht. Eine, die auf dem Master-Zweig läuft und eine, die auf allen anderen läuft.
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.'
}
}
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()
}