就Jenkins的声明性管道而言,我在使用 关键字时遇到了问题。
我一直收到错误No such DSL method 'when' found among steps
。我是Jenkins 2声明性管道的新手,并不认为我将脚本化管道与声明性管道混合在一起。
此管道的目标是在Sonar成功运行后运行mvn deploy
并发送失败或成功的邮件通知。我只希望在master或release分支上部署工件。
我遇到困难的部分是在帖子部分。 通知阶段效果很好。请注意,我在没有 when 子句的情况下使用它,但确实需要它或等效物。
pipeline {
agent any
tools {
maven 'M3'
jdk 'JDK8'
}
stages {
stage('Notifications') {
steps {
sh 'mkdir tmpPom'
sh 'mv pom.xml tmpPom/pom.xml'
checkout([$class: 'GitSCM', branches: [[name: 'origin/master']], doGenerateSubmoduleConfigurations: false, submoduleCfg: [], userRemoteConfigs: [[url: 'https://repository.git']]])
sh 'mvn clean test'
sh 'rm pom.xml'
sh 'mv tmpPom/pom.xml ../pom.xml'
}
}
}
post {
success {
script {
currentBuild.result = 'SUCCESS'
}
when {
branch 'master|release/*'
}
steps {
sh 'mvn deploy'
}
sendNotification(recipients,
null,
'https://link.to.sonar',
currentBuild.result,
)
}
failure {
script {
currentBuild.result = 'FAILURE'
}
sendNotification(recipients,
null,
'https://link.to.sonar',
currentBuild.result
)
}
}
}
答案 0 :(得分:12)
在documentation声明性管道中,提到您无法在when
块中使用post
。 when
仅允许在stage指令中使用。
所以你能做的是:
post {
success {
script {
if (${GIT_LOCAL_BRANCH} == 'master')
currentBuild.result = 'SUCCESS'
}
}
// failure block
}
答案 1 :(得分:4)
使用GitHub存储库和Pipeline plugin,我可以遵循以下几点:
pipeline {
agent any
stages {
stage('Build') {
steps {
sh '''
make
'''
}
}
}
post {
always {
sh '''
make clean
'''
}
success {
script {
if (env.BRANCH_NAME == 'master') {
emailext (
to: 'engineers@green-planet.com',
subject: "${env.JOB_NAME} #${env.BUILD_NUMBER} master is fine",
body: "The master build is happy.\n\nConsole: ${env.BUILD_URL}.\n\n",
attachLog: true,
)
} else if (env.BRANCH_NAME.startsWith('PR')) {
// also send email to tell people their PR status
} else {
// this is some other branch
}
}
}
}
}
这样,可以根据正在构建的分支类型发送通知。有关详细信息,请参见pipeline model definition和服务器上http://your-jenkins-ip:8080/pipeline-syntax/globals#env上可用的全局变量引用。
答案 2 :(得分:1)
遇到与post
相同的问题。通过用@groovy.transform.Field
注释变量来解决该问题。这是基于我在Jenkins文档中为defining global variables找到的信息。
例如
#!groovy
pipeline {
agent none
stages {
stage("Validate") {
parallel {
stage("Ubuntu") {
agent {
label "TEST_MACHINE"
}
steps {{
sh "run tests command"
recordFailures('Ubuntu', 'test-results.xml')
junit 'test-results.xml'
}
}
}
}
}
post {
unsuccessful {
notify()
}
}
}
// Make testFailures global so it can be accessed from a 'post' step
@groovy.transform.Field
def testFailures = [:]
def recordFailures(key, resultsFile) {
def failures = ... parse test-results.xml script for failures ...
if (failures) {
testFailures[key] = failures
}
}
def notify() {
if (testFailures) {
... do something here ...
}
}