【Jenkins】Declarative和Scripted两种脚本模式有什么具体的区别

Jenkins Pipeline 有两种主要的脚本模式:Declarative Pipeline (声明式流水线)和 Scripted Pipeline(脚本化流水线)。它们的主要区别在于结构、语法的复杂性、灵活性以及适用场景。以下是详细的比较:

1. 声明式流水线(Declarative Pipeline)

声明式流水线是一种结构化且易于理解和维护的流水线定义方式。它主要用于简单和常规的 CI/CD 流程。

优点:
  • 简洁且易读:声明式流水线具有简洁的结构,通常适用于大多数标准构建、测试、部署的需求。
  • 内置语法支持 :提供了一些内置的功能,比如 stages, steps, post, environment, agent 等,使用这些功能时不需要手动处理 Groovy 脚本的细节。
  • 自动化默认设置:Jenkins 会自动处理一些常见的任务,例如工作区清理、代理选择等。
  • 易于维护:由于有明确的结构,开发者可以更容易地查看和编辑流水线。
语法示例:
groovy 复制代码
pipeline {
    agent any  // 在任何可用代理上执行

    environment {
        MY_VAR = 'value'  // 设置环境变量
    }

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
                // 构建步骤
            }
        }

        stage('Test') {
            steps {
                echo 'Testing...'
                // 测试步骤
            }
        }

        stage('Deploy') {
            steps {
                echo 'Deploying...'
                // 部署步骤
            }
        }
    }

    post {
        success {
            echo 'Build succeeded!'
        }
        failure {
            echo 'Build failed!'
        }
    }
}
适用场景:
  • 简单到中等复杂度的流水线。
  • 不需要太多条件逻辑或复杂控制结构。
  • 推荐给大多数开发人员和团队,尤其是在项目中使用标准的 CI/CD 流程时。

2. 脚本化流水线(Scripted Pipeline)

脚本化流水线提供了完全的自由和灵活性,允许开发者完全控制流水线的行为。它是基于 Groovy 脚本的,因此可以实现更复杂的逻辑和条件控制。

优点:
  • 更大的灵活性:由于是基于 Groovy 脚本,脚本化流水线可以执行任何 Groovy 支持的逻辑,允许在流水线中实现复杂的控制流、循环、条件判断等。
  • 完全控制:开发者可以手动管理构建、测试、部署等各个阶段的执行,甚至可以定制代理分配、异常处理等。
  • 动态构建:可以通过 Groovy 脚本动态生成或调整流水线中的各个部分(如动态阶段、条件步骤等)。
语法示例:
groovy 复制代码
node {
    try {
        stage('Build') {
            echo 'Building...'
            // 自定义构建逻辑
        }

        stage('Test') {
            echo 'Running Tests...'
            // 自定义测试逻辑
        }

        stage('Deploy') {
            echo 'Deploying...'
            // 自定义部署逻辑
        }

    } catch (Exception e) {
        currentBuild.result = 'FAILURE'
        throw e
    } finally {
        echo 'Cleaning up...'
        // 清理工作
    }
}
适用场景:
  • 当流水线需要更复杂的控制逻辑(如条件语句、循环等)时。
  • 需要动态创建阶段或动态决定是否执行某些步骤的场景。
  • 比如当构建、测试、部署过程需要根据不同条件变化时(例如根据分支选择不同的部署方式)。
  • 高度定制的工作流,可能涉及不同的节点、代理、复杂的错误处理等。

3. 关键区别总结

特性 声明式流水线 (Declarative) 脚本化流水线 (Scripted)
结构化 是,提供明确的语法结构,简洁易读 否,完全自由,基于 Groovy 脚本
灵活性 较低,适用于常规流水线,易于维护 高,允许使用 Groovy 脚本自定义复杂的流程
可读性 高,代码组织清晰,适合大多数开发者 较低,复杂逻辑可能影响可读性
配置方式 使用 pipeline, stages, steps 等简洁语法 使用 nodestage 等更低级的 API
错误处理 post 块处理成功或失败的流程 可以使用 try-catch 自定义异常处理机制
适用场景 常规的 CI/CD 流程,标准化项目 高度定制化的流程,需要动态控制和灵活性较大的场景

4. 何时选择哪种模式?

  • 选择声明式流水线

    • 项目流程相对简单,构建、测试、部署流程较为固定。
    • 团队成员需要一个易于理解和维护的流水线脚本。
    • 没有太多复杂的条件、逻辑或者动态行为需求。
  • 选择脚本化流水线

    • 需要实现复杂的构建逻辑、条件判断、循环等动态行为。
    • 流水线需要根据不同条件(如分支、环境)选择性地执行不同的步骤或阶段。
    • 有需要编写自定义错误处理、异常捕获、清理操作等。

5. 混合使用

实际上,声明式流水线和脚本化流水线并不是完全独立的,你可以在声明式流水线的某些步骤中嵌入脚本化的代码,利用其灵活性来完成一些复杂的任务。例如,在声明式流水线的 steps 中使用 script 块来执行复杂的 Groovy 脚本:

groovy 复制代码
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                script {
                    // 这里使用 Groovy 脚本实现更复杂的逻辑
                    echo "Custom build logic"
                }
            }
        }
    }
}

这样,你可以结合两种模式的优点,根据实际需求选择最合适的实现方式。

相关推荐
潜意识起点4 分钟前
精通 CSS 阴影效果:从基础到高级应用
前端·css
奋斗吧程序媛9 分钟前
删除VSCode上 origin/分支名,但GitLab上实际上不存在的分支
前端·vscode
IT女孩儿19 分钟前
JavaScript--WebAPI查缺补漏(二)
开发语言·前端·javascript·html·ecmascript
m0_748256563 小时前
如何解决前端发送数据到后端为空的问题
前端
请叫我飞哥@3 小时前
HTML5适配手机
前端·html·html5
Java小白中的菜鸟3 小时前
centos7的磁盘扩容
linux·运维·服务器
黑客老陈3 小时前
面试经验分享 | 北京渗透测试岗位
运维·服务器·经验分享·安全·web安全·面试·职场和发展
橘子师兄3 小时前
如何在自己的云服务器上部署mysql
运维·服务器·mysql
@泽栖4 小时前
Docker 常用命令
运维·服务器·docker
@解忧杂货铺4 小时前
前端vue如何实现数字框中通过鼠标滚轮上下滚动增减数字
前端·javascript·vue.js