当前位置: 首页 > article >正文

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

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

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

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

优点:
  • 简洁且易读:声明式流水线具有简洁的结构,通常适用于大多数标准构建、测试、部署的需求。
  • 内置语法支持:提供了一些内置的功能,比如 stages, steps, post, environment, agent 等,使用这些功能时不需要手动处理 Groovy 脚本的细节。
  • 自动化默认设置:Jenkins 会自动处理一些常见的任务,例如工作区清理、代理选择等。
  • 易于维护:由于有明确的结构,开发者可以更容易地查看和编辑流水线。
语法示例:
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 脚本动态生成或调整流水线中的各个部分(如动态阶段、条件步骤等)。
语法示例:
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 脚本:

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

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


http://www.kler.cn/a/447756.html

相关文章:

  • LabVIEW深海气密采水器测控系统
  • 【Maven】dependencyManagement依赖版本管理
  • 【活动邀请·深圳】深圳COC社区 深圳 AWS UG 2024 re:Invent re:Cap
  • 基于蓝牙通信的手机遥控智能灯(论文+源码)
  • Oracle 查询表占用空间(表大小)的方法
  • 电气设计 | 低压接地系统:TN-C 、TN-S、TN-C-S、TT适用哪些场所?
  • 关于 node-sass 库在windows下编译错误
  • C#都可以找哪些工作?
  • 【机器人】机械臂轨迹和转矩控制对比
  • 语言学习大冒险:粤语、英语、西语的酸甜苦辣
  • 编写Linux系统rhel9的网络配置脚本
  • PYTHON 自动化办公:更改图片尺寸大小
  • Spring之我见 - 从IOC谈到AOP实现原理
  • YOLO模型分布式训练:步骤与操作方式
  • 【面经】python后端开发工程师
  • CFD POST导出动画
  • Open3D 进阶(26)Hierarchical Clustering算法实现点云分割
  • 【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
  • 入门靶机:DC-1的渗透测试
  • OpenAI直播发布第11天:ChatGPT桌面客户端升级,就这?
  • 一些经济政治学类书籍推荐 --- 以及与之相关我的经历和理解
  • 前端生成docx文档、excel表格、图片、pdf文件
  • docker 软连接修改存储位置
  • MySQL列类型
  • 知网研学 | 知网文献(CAJ+PDF)批量下载
  • 前端实现图片压缩