我需要在几个阶段之间共享一些代码,这也需要添加后期操作。为此,我考虑将所有内容放在一个方法中,该方法将从
中调用pipeline {
stages {
stage('Some') {
steps {
script { commonCode() }
}
}
}
}
但是,我不确定如何从commonCode
安装发布操作。文档没有提到一件事。查看代码,暗示这个DSL基本上只是在玩哈希映射,但我不知道是否可以从方法中访问它并在运行中进行修改。
基本上我想在commonCode
中执行类似的操作:
if (something) {
attachPostAction('always', { ... })
} else {
attachPostAction('failure', { ... })
}
到目前为止唯一有效的方法是commonCode
我做:
try {
...
onSuccess()
} catch (e) {
onError()
} finally {
onAlways()
}
但是想知道是否有更优雅的方式...
答案 0 :(得分:2)
现在我更好地理解了这个问题(我希望)......
这是一个非常有趣的想法 - 在前几个阶段动态生成你的帖子动作。
事实证明这很容易。我尝试了一个选项(成功),它在列表中存储了各种闭包,然后遍历列表并运行post操作中的所有闭包。然后我做了另一个(失败),我刚刚将一个闭包保存为变量并运行它。两者都运作良好。
以下是执行此操作的代码。取消注释error
行以模拟失败的构建。
def postSuccess = []
def postFailure
pipeline {
agent any
stages {
stage('Success'){
steps {
script {
println "Configure Success Post Steps"
postSuccess[0] = {echo "This is a successful build"}
postSuccess[1] = {
echo "Running multiple steps"
sh "ls -latr"
}
}
}
}
stage('Failure'){
steps {
script {
println "Configure Failure Post Steps"
postFailure = {
echo "This build failed"
echo "Running multiple steps for failure"
sh """
whoami
pwd
"""
}
}
// error "Simulate a failed build" //uncomment this line to make the build fail
}
}
} // stages
post {
success {
echo "SUCCESS"
script {
for (def my_closure in postSuccess) {
my_closure()
}
}
}
failure {
echo "FAILURE!"
script {
postFailure()
}
}
}
} // pipeline
答案 1 :(得分:0)
您可以在pipeline
块之外使用常规groovy脚本。虽然我还没有尝试过,但您应该能够在那里定义一个方法,然后从管道内部调用它。但是方法调用不能被称为步骤。您需要将其包装在脚本步骤中。但post
操作采用与steps{}
块相同的步骤,因此如果您可以在steps
中使用它,则可以在帖子部分中使用它。你需要仔细观察范围,否则你最终会在某些地方弄清楚为什么事情是空的。
您还可以使用共享库。您可以在共享库中定义一个步骤,然后像steps{}
块或其中一个post块中的任何其他步骤一样使用它。