详解Jenkins 的 Declarative Pipeline中post 语法

在 Jenkins 的 Declarative Pipeline 中,post 是一个非常重要的 声明式语法块,用于定义在 Pipeline 或某个 stage 执行完成后,根据其执行结果自动执行的后续操作。

简单来说:

post 就是"事后处理"的逻辑,比如:无论成功还是失败,都要发送通知、归档日志、清理资源等。

一、post 的作用

post 块可以放在两个位置:

  1. Pipeline 级别:作用于整个 Pipeline 执行完成后
  2. Stage 级别:作用于某个 stage 执行完成后

它支持根据不同的构建状态来触发不同的操作,常见的状态包括:

状态 触发条件
success Pipeline/stage 成功完成
failure Pipeline/stage 失败(例如编译失败、测试失败)
unstable 构建完成但有测试失败、静态检查警告等(如单元测试失败)
aborted 用户手动取消构建
always 无论什么结果,都会执行
changed 当前状态与上一次构建状态不同时才执行

二、语法结构

复制代码
post {
    // 根据不同状态定义要执行的操作
    success {
        // 构建成功时执行
    }
    failure {
        // 构建失败时执行
    }
    unstable {
        // 构建不稳定时执行
    }
    aborted {
        // 构建被取消时执行
    }
    always {
        // 总是执行
    }
    changed {
        // 状态发生变化时执行(如从失败变成功)
    }
}

三、例子中的 post 解读

复制代码
post {
    always {
        cleanWs()  // 总是清理工作空间
    }
    failure {
        emailext(
            subject: "构建失败: ${currentBuild.fullDisplayName}",
            body: "扫描发现高危漏洞,请查看报告:${env.BUILD_URL}",
            recipientProviders: [developers(), requestor()],
            mimeType: 'text/html'
        )
    }
}

含义解释:

  • always { cleanWs() }

    → 无论构建成功、失败还是被取消,都会执行 cleanWs(),即清理 Jenkins 工作区(workspace),释放磁盘空间,避免残留文件影响下次构建。

  • failure { emailext(...) }

    → 只有当整个 Pipeline 失败时(比如安全门禁触发 error),才会发送一封邮件通知相关责任人(开发者 + 触发者)。

四、常见使用场景

场景 使用方式
发送通知 邮件、企业微信、钉钉、Slack
归档报告 成功时归档测试报告、安全扫描报告
清理资源 总是清理临时文件、容器、工作区
告警通知 失败时通知负责人
上报指标 构建完成后上报到监控系统

五、完整示例(Pipeline 级 + Stage 级)

复制代码
pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                sh 'make'
            }
            post {
                success {
                    echo "编译成功!"
                }
                failure {
                    echo "编译失败!"
                }
            }
        }

        stage('Test') {
            steps {
                sh 'make test'
            }
        }
    }

    post {
        success {
            emailext(
                subject: '构建成功',
                body: '构建成功,一切正常。',
                to: 'dev-team@example.com'
            )
        }
        failure {
            emailext(
                subject: '构建失败',
                body: '构建失败,请立即查看:${BUILD_URL}',
                to: 'dev-team@example.com, manager@example.com'
            )
        }
        always {
            cleanWs()  // 清理工作空间
            sh 'rm -f *.tmp'  // 删除临时文件
        }
    }
}

六、注意事项

  1. post 中不能写 stagessteps,它本身就是 steps 的容器。
  2. 支持所有 Jenkins Step,如 sh, echo, mail, script, junit, archiveArtifacts 等。
  3. 推荐将资源清理(如 cleanWs())放在 always 中,确保不残留文件。
  4. 敏感操作(如部署生产)可放在 success 中,避免失败后继续执行。

总结

关键词 含义
post 声明"事后动作"
always 不管结果如何都执行
success 成功后执行
failure 失败后执行
cleanWs() 清理工作区,常用在 always

一句话总结
post 就像是"构建完成后的钩子函数",让你可以优雅地处理通知、清理、归档等收尾工作。

相关推荐
小飞程序员1 天前
Docker本地部署gitlab实践(windows,linux)
devops
牛奶咖啡132 天前
DevOps自动化运维实践_使用再生龙对Linux系统进行备份还原
运维·自动化·devops·linux系统的备份还原·linux系统克隆备份·再生龙
海兰2 天前
Jina Embeddings V5 Text + Elasticsearch 9.x 本地部署指南
elasticsearch·jenkins·jina
觅特科技-互站2 天前
告别手动微调Prompt:DevOps用陌讯Skills重构AI运维工作流
运维·prompt·线性回归·kmeans·devops
luod2 天前
Docker 快速安装Jenkins
java·docker·jenkins
加农炮手Jinx3 天前
Flutter for OpenHarmony: Flutter 三方库 icon_font_generator 自动化将 SVG 图标集转化为字体文件(鸿蒙矢量资源全自动管理)
运维·flutter·华为·自动化·harmonyos·devops
小道仙973 天前
jenkins对接、jenkins-rest
java·servlet·jenkins·jenkins-rest
成为你的宁宁3 天前
Jenkins 自动化部署前后端分离若依项目全攻略:涵盖环境配置、Maven/Node.js 工具安装、GitLab 项目协同,及前后端构建、服务器推送与代码更新验证全步骤
node.js·自动化·gitlab·jenkins·maven
声声长乐3 天前
Jenkins + Docker 完整部署指南
ubuntu·docker·jenkins
古斯塔夫歼星炮3 天前
Dify + Jenkins 实现AI应用持续集成与自动化部署
ci/cd·jenkins·dify