有没有办法以编程方式在声明性管道中注入后期操作

时间:2017-10-19 20:54:08

标签: jenkins groovy jenkins-pipeline

我需要在几个阶段之间共享一些代码,这也需要添加后期操作。为此,我考虑将所有内容放在一个方法中,该方法将从

中调用
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()
}

但是想知道是否有更优雅的方式...

2 个答案:

答案 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块中的任何其他步骤一样使用它。