Declarative Pipeline vs Scripted Pipeline 对比

特性Declarative Pipeline 声明式Scripted Pipeline 脚本式
语法基于结构化 DSL,语法固定基于 Groovy 脚本,更灵活
可读性好,适合团队协作灵活性强,但不易读
复杂逻辑处理适合常规流程,有一定限制可写复杂逻辑和控制结构
学习曲线简单上手需要掌握 Groovy
错误提示更明确,容易调试错误提示偏底层
使用推荐首选!90% 用 Declarative 就够高级用法用 Scripted

 ✅ Declarative 示例

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo "Building..."
            }
        }
        stage('Test') {
            steps {
                echo "Testing..."
            }
        }
    }
    post {
        always {
            echo "Pipeline finished"
        }
    }
}

⚙️ Scripted 示例

node {
    try {
        stage('Build') {
            echo "Building..."
        }
        stage('Test') {
            echo "Testing..."
        }
    } finally {
        echo "Pipeline finished"
    }
}

🧠 适用场景建议

  • Declarative

    • 团队协作(代码可读性好)

    • 常规 CI/CD 流程(编译/测试/部署)

    • 配合 Jenkins UI 编辑器使用(比如 Blue Ocean)

  • Scripted

    • 构建逻辑特别复杂,比如循环、条件嵌套很多

    • 需要使用 Groovy 高级特性(比如自定义类、闭包)

    • 与外部系统做精细交互


💡 综合建议

除非你特别需要高级 Groovy 控制结构或动态构建流程,否则 建议优先使用 Declarative Pipeline,更稳定、更容易维护。

🟦 原始:Declarative Pipeline(声明式)

pipeline {
    agent {
        node {
            customWorkspace pipelineCustomWorkspace
        }
    }
    stages {
        stage('Example') {
            steps {
                dir("bar") {
                    script {
                        myFunction()
                        sh("pwd")
                        sh("ls")
                    }
                }
            }
        }
    }
    post {
        always {
            archiveArtifacts "**/foo.json"
        }
    }
}

🟨 转换后的 Scripted Pipeline(脚本式)

String pipelineCustomWorkspace = "/jenkins/pipeline-${BRANCH_NAME}/${BUILD_NUMBER}"

def myFunction() {
    def content = '{"foo":"bar"}'
    sh("echo '${content}' > foo.json")
}

node {
    // 切换到自定义工作目录
    ws(pipelineCustomWorkspace) {
        try {
            stage('Example') {
                dir("bar") {
                    myFunction()
                    sh("pwd")
                    sh("ls")
                }
            }
        } finally {
            archiveArtifacts artifacts: "**/foo.json", fingerprint: true
        }
    }
}

🧠 对照说明:

内容声明式脚本式
指定 Agent / Nodeagentnode {}
自定义工作目录customWorkspacews() 包裹在 node
阶段和目录切换stage + dir + scriptstage {} + dir() 组合
后置操作如归档文件post { always { archiveArtifacts }}finally { archiveArtifacts }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值