DevOps / Jenkins

优化工作流:Jenkins Pipeline集成邮箱审批功能实践

浅时光博客 · 8月30日 · 2021年 7.6w 次已读

一、安装所需插件

实现邮箱审批功能,文章来源(Source):浅时光博客需要使用到下面的几个插件工具,需要自行确认是否安装。

  • Pipeline:Stage View:管道阶段视图插件
  • Conditional BuildStep:有条件的构建步骤
  • AnsiColorJenkins ANS文章来源(Source):浅时光博客I颜色插件
  • Email Extension:电子邮件扩展
  • build user vars:jenkins用户相关变量插件,使得在构建过程中可以使用用户相关环境变量,我们这里用来获取运行JOB的用户名
  • Email Extension Template:电子邮件扩展模板

二、相关插件配置

  • 这里主要配置下邮件,默认情况下Jenkins是可以发出来邮件的,只是html格式有问题,这里需要我们配置下

三、创建Job任务

四、编写Pipeline

def skipRemainingStages = false   //是否跳过生产部署
def timeout_mins = 5 //超时时间,单位分
def input_message   //提示语
def randomToken    //发布秘钥
def skipadminUser = false


//系统个人信息
def Applier_id
def Applier_name
def Applier_mail

pipeline{
    agent any
    options { //调用颜色插件
        ansiColor('xterm')
        skipDefaultCheckout(true)
    }
    environment {
       Applier_name = ""
       Applier_mail = ""
       Operator_mail = ""
       input_message = ""
   }
 stages{
        stage('构建初始化') {
            steps("拉取代码"){
                echo "3[32m ******开始拉取代码分支代码,****** 3[0m"
            }
        }
        stage("发送审批邮件"){
            steps{
                wrap([$class: 'BuildUser']) {
                script {
                    //获取当前登录用户账户、姓名、邮箱
                    Applier_id = "${env.BUILD_USER_ID}"
                    Applier_name = "${env.BUILD_USER}"
                    Applier_mail = "${env.BUILD_USER_EMAIL}"
                    }
                }
                script{
                    //判断当前任务是否需要审批
                    if ("$Mode" == "NO"){
                        skipadminUser = true
                        Exec = true
                        return
                    }

                    //判断审批人
                    if ("$adminUser" != ""){
                       adminUser = "$adminUser".split('@')[0] //只取审批人@前面字符
                        //如果审批人为自己,则退出任务
                        if (Applier_id == adminUser){
                            echo "3[31m 审批人不能为本人,任务已终止。 3[0m"
                            skipRemainingStages = true  //跳过下一个stage
                            currentBuild.result = 'ABORTED' //当前stage build result设置为 aborted
                            return
                        } 
                    }else{
                        echo "3[31m 审批人不能为空,任务已终止。 3[0m"
                        skipRemainingStages = true
                        currentBuild.result = 'ABORTED' //修改任务状态为终止状态
                        return
                    }
                    skipRemainingStages = false
                    echo "3[32m ******发布生产操作需审批,接下来执行生产审批流程****** 3[0m"
                    randomToken = sh (script: "echo $RANDOM" , returnStdout: true).trim()
                    input_message = " $Applier_name 申请发布生产"
                    emailext(
                        subject:"【请审批】${env.JOB_NAME}(#${env.BUILD_NUMBER})生产部署任务",
                        body:"""$input_message,随机验证码是:${randomToken}!!! <br> <a href="${BUILD_URL}input">请点击该链接登录后审批填入token发布</a><br><h3>或者将token值${randomToken}告诉运维人员:${Applier_name},让其输入token进行确认</h3>""",
                        to:"${emails}"
                    )
                    echo "3[32m ******申请邮件已经发送,待 $adminUser 审批****** 3[0m"
                }
            }
        }
   
        stage("等待审批"){
            when { expression {!skipRemainingStages}}
            steps{
                script{
                   def isAbort  = false   //取消按钮
                   timeout(timeout_mins){  //等待审批人审批,并通过timeout设置任务过期时间,防止任务永远挂起
                        try {
                           def userInput = input(
                               id: 'inputap', message: "$input_message", ok:"同意", submitter:"$adminUser", parameters: [
                               [$class: 'StringParameterDefinition',defaultValue: "", name: 'token',description: '请输入发布的秘钥' ]
                               ])
                           if (userInput == randomToken) {
                               skipRemainingStages = false
                           } else {
                               skipRemainingStages = true
                               echo "3[31m 秘钥错误  3[0m"
                           }
                            echo "3[31m 当前输入秘钥为: ${userInput}  3[0m"
                       }catch(err) { // input false
                           echo "3[31m ******任务已被审批人 $adminUser 拒绝****** 3[0m"
                           currentBuild.result = 'ABORTED'  //修改任务状态为终止状态
                           return
                       }
                   }
                }
            }
        }
    }
}

五、执行构建任务

  • 点击Input然后输入邮件中的token,点击同意即可发布完成

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

21 条回应

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

  1. lindytem福建·厦门2024-1-26 · 14:25

    最近正要学习jenkins,谢谢分享!

  2. daxiong上海2023-8-18 · 11:12

    写的很棒,跟随大佬的脚步

  3. studyman重庆2023-7-17 · 14:34

    一篇好博文

  4. 木偶戏北京2023-7-6 · 18:02

    努力学习,努力进步

  5. 热心市民刘同学重庆2023-6-26 · 10:19

    要好好学习,天天向上

  6. Vega2023-6-16 · 13:20

    学习jenkins,谢谢分享!

  7. Sun_591北京2023-6-16 · 12:10

    最近正要学习jenkins,谢谢分享!

  8. 阿三_༄༅上海2023-4-30 · 5:56

    最近正要学习jenkins,谢谢分享!

  9. LingHH广西·南宁2023-4-12 · 15:35

    最近正要学习jenkins,谢谢分享!

  10. fxf12345未知2023-4-10 · 7:52

    最近正要学习jenkins,谢谢分享!