DevOps / GitLab / Jenkins

优化 Jenkins CI/CD 流程,集成审批功能

浅时光博客 · 2月21日 · 2022年 · · 15.3w 次已读

一、流程介绍

  1. 自动化代码构建:代码构建过程已自动化,可选择自动触发,无需手动干预。
  2. 审批流程:引入流程审批节点,确保发布前经过审批流程的验证。
  3. 通知机制:通过钉钉、企业微信等平台的机器人,自动触发发布审批信息,实现及时通知。
  4. 确认审批:审批人登录Jenkins平台,在指定界面填写随机Token,用于确认发布审批。
  5. 发布通知:在Token认证成功后,系统会自动发送站内信通知,提文章来源(Source):浅时光博客供详细的发版时间信息。
  6. 自动发布:到达预定发布时间后,系统将自动触发线上K8s集群的发布操作。

通过这个优化后的流程,实现了从代码构建到发布的端到端自动化,结合审批节点和通知机制,文章来源(Source):https://dqzboy.com确保了流程的可控性和透明度,进一步提升了整体的流程效率和管理质量

特别提示:本文仅概述建设过程,附上核心代码,不适合初学者直接使用。如不了解相关知识,请勿阅读。读者需要根据自己的项目修改代码。

相关的Jenkinsfile文件已经上传至本人的GitHub仓库,可自行进行克隆下载;如果对您有帮助别忘记点个start

二、核心代码

#!groovy
@Library('jenkinslib') _  
//调用方法库文件
def approval = new org.devops.library()

def skipRemainingStages = false   //当前节点是否跳过
def input_message   //提示语
def randomToken    //发布秘钥
def skipadminUser = false

pipeline {
    agent any
    options {
        timestamps() // 在日志中打印时间
        skipDefaultCheckout() // 删除隐式的checkout scm 语句
        timeout(time:1, unit:'HOURS') // 流水线超时设置为1H
    }
    environment {
        //生成随机数0-10000
        max = 100000
        randomToken = "${Math.abs(new Random().nextInt(max+1))}"
        approve = "${approve}"  //jenkins参数化构建定义审批人员名单
    }
        stage("发送审批通知"){
            when {
                expression { env.approve != 'NO' }
            }
            steps{
                wrap([$class: 'BuildUser']) {
                script {
                    //获取当前登录用户账户、姓名
                    Applier_id = "${env.BUILD_USER_ID}"
                    Applier_name = "${env.BUILD_USER}"
                    }
                }
                script{
                    //判断审批人
                    if ("$adminUser" != ""){
                        adminUser = "$adminUser"
                        //如果审批人为自己,则退出任务
                        if (Applier_id == adminUser){
                            error '审批人不能为本人,任务已终止'
                        } 
                    } else{
                        error '审批人不能为空,任务已终止'
                    }
                    if ("$adminUser" == "dingqz") {
                        env.approvalDD = "xxx"
                        input_message = "$Applier_name 申请发布生产"
                        approval.HttpReq("生产发布申请")
                    } else if ("$adminUser" == "xxx") {
                        env.approvalDD = "xxxx"   //定义变量,赋值对应审批人手机号,实现钉钉消息推送@指定审批人员
                        input_message = "$Applier_name 申请发布生产"
                        approval.HttpReq("生产发布申请")
                    } else {
                        error '审批人信息获取失败,任务已终止'
                    }
                }
            }
        }   
        stage("等待审批"){
            when {
                expression { env.approve != 'NO' }
            }
            steps{
                script{
                    def isAbort  = false   //取消按钮
                    timeout(time:1, unit:'HOURS'){  //等待审批人审批,并通过timeout设置任务过期时间,防止任务永远挂起
                        try {
                           def token = input(
                               id: 'inputap', message: "$input_message", ok:"同意", submitter:"$adminUser", parameters: [
                               [$class: 'StringParameterDefinition',defaultValue: "", name: 'token',description: '请输入发布的秘钥' ]
                               ])
                            if ( "${token}" == env.randomToken) {
                            } else {
                               error '秘钥错误,任务已终止'
                            }
                        }catch(e) { // input false
                           throw e
                       }
                   }
                }
            }
        }          
        stage('版本发布') {
            steps{
                script {
                    printSh("""
                      echo "版本发布"
                    """)
                }
            }
        }
    }
    post {
        success {
            script {
                echo "success"
            }
        }
        failure {
            script {
                echo "failure"
            }
        }
        aborted {           
            script {
                echo "aborted"
            }
        }
    }
}

三、效果演示


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/9686.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站内容仅供个人学习与研究,严禁用于商业或非法目的。请在下载后24小时内删除相应内容。继续浏览或下载即表明您接受上述条件,任何后果由用户自行承担。

89 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

  1. container北京2022-6-9 · 15:36

    学习了,666

  2. 丨个代名词广东·广州2022-5-31 · 10:41

    学习了,666

  3. A'live上海2022-5-26 · 17:16

    非常不错的文章,赞

  4. 流氓兔辽宁·大连2022-5-17 · 15:43

    学习了,666

  5. kingen上海2022-5-6 · 17:35

    非常不错的文章,赞

  6. svsky福建·厦门2022-4-15 · 9:02

    有点意思 学习!

  7. hxtyl江苏·苏州2022-4-14 · 15:53

    非常不错的文章,赞

  8. 星火广东·深圳2022-4-5 · 0:06

    非常不错的文章

  9. 亦如当初韩国2022-4-4 · 16:52

    学习了,很强

  10. open上海2022-4-1 · 20:36

    非常不错的文章