Jenkins声明式流水线与脚本式流水线对比

共享库

无论是在脚本式(Scripted)还是声明式(Declarative)流水线中,调用共享库(Shared Libraries)的方式基本相同。你可以使用 @Library 注解或 library 步骤来导入共享库,然后按照相同的方式调用库中的函数或类。

在声明式流水线中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
@Library('my-shared-library') _

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                // 使用共享库中的函数或变量
                mySharedFunction()
            }
        }
    }
}

在脚本式流水线中

1
2
3
4
5
6
7
8
@Library('my-shared-library') _

node {
    stage('Example') {
        // 使用共享库中的函数或变量
        mySharedFunction()
    }
}

或者在 Pipeline 脚本中动态加载:

node {
    stage('Example') {
        // 动态加载共享库
        def myLib = library('my-shared-library').com.example
        // 调用共享库中的函数
        myLib.mySharedFunction()
    }
}

如果共享库中有定义的类或者对象,你也可以按照同样的方式在两种类型的流水线中进行调用。 总的来说,调用方式非常相似,主要的区别在于流水线自身的结构和语法。

post阶段

在脚本式流水线中

在脚本式(Scripted)流水线中,post 阶段不是一个内置的结构,但可以通过 Groovy 的 try、catch 和 finally 语句来模拟 post 阶段的行为。 这里是一个简单的例子:

node {
    try {
        // 主要的构建步骤
        stage('Build') {
            echo 'Building...'
        }
        stage('Test') {
            echo 'Testing...'
        }
    } catch (Exception e) {
        // 如果构建失败,会进入这里
        currentBuild.result = 'FAILURE'
        echo "Caught exception: ${e}"
    } finally {
        // 这里的代码相当于声明式流水线中的 post { always { ... } }
        echo 'This will always run'
        
        // 可以根据 currentBuild.result 来决定执行什么操作
        if (currentBuild.result == 'FAILURE') {
            echo 'Do something for failure'
        } else {
            echo 'Do something for success'
        }
    }
}

在声明式流水线中

在声明式流水线(Declarative Pipeline)中,捕获异常并保存到变量以供后续使用是比较受限的。通常,只能在 post 的 failure 块中处理失败的情况,但不能捕获具体的异常信息。 然而,可以在声明式流水线的 script 块中使用 try/catch 语法来捕获并处理异常。这样,可以获取到错误信息,并通过接口发送。这是一个简单的例子:

pipeline {
    agent any
    stages {
        stage('Example Stage') {
            steps {
                script {
                    try {
                        // 你的代码
                    } catch (Exception e) {
                        // 保存错误信息
                        env.ERROR_MESSAGE = e.toString()
                        // 可以调用发送接口的步骤
                        // httpPost(...)
                        currentBuild.result = 'FAILURE'
                        error "Stage failed due to: ${env.ERROR_MESSAGE}"
                    }
                }
            }
        }
    }
    post {
        always {
            echo "This will always run."
        }
        failure {
            echo "Build failed. Error message: ${env.ERROR_MESSAGE}"
        }
    }
}

在上面的例子中,我们在 script 块中使用了 try/catch 来捕获异常,然后将异常信息保存到环境变量 env.ERROR_MESSAGE 中。这样,你就可以在 post 阶段或其它地方使用这个变量,并通过接口发送。 所以,虽然声明式流水线在处理异常方面没有脚本式流水线灵活,但通过使用 script 块,仍然可以达到相似的效果。

updatedupdated2024-08-182024-08-18