背景

从去年开始,团队的大部分工作都已经采用持续集成和自动化了。但是,合适的管理模式和具体措施也是在工作中逐步摸索取舍。
目前,前后端、运维的项目加起来的数量已经很可观了。每次在git上面提交代码,触发自动化构建构建完毕之后,还需要登录Jenkins后台去看一下结果报告。所以,最合理的方式应该是把构建报告自动发送到开发者邮箱和团队的钉钉群(当然了,要多建几个群才行,不然几十个项目的构建报告都推送到一个群,会信息爆炸的)。

关键词

Jenkins
Email
Report
Mailbox

前言

因为团队目前使用Jenkins Pineline,所以要把发送邮件和发送钉钉的功能写在Jenkinsfile里面。



一、配置邮件通知

post {
          always {
              echo 'One way or another, I have finished'
              echo sh(returnStdout: true, script: 'env')
              deleteDir() /* clean up our workspace */
          }
          success {
              //SendEmail("success")
              SendDingding("success")
          }
          failure {
              //SendEmail("failure")
              SendDingding("failure")
          }
          unsuccessful {
              //SendEmail("unsuccessful")
              SendDingding("unsuccessful")
          }
          aborted {
              //SendEmail("aborted")
              SendDingding("aborted")
          }
          unstable {
              //SendEmail("unstable")
              SendDingding("unstable")
          }
   }
//发送邮件和钉钉的函数,是定义在Jenkinsfile的最外层,也就是pipeline{}的外部的
void SendEmail(res)
{
  //在这里定义邮箱地址
  addr="wa48-09trt-09fggkjg77u@bifsdfn.com"
  if( res == "success" )
  {
    mail to: addr,
    subject: "构建成功 :${currentBuild.fullDisplayName}",
    body: "\n项目顺利构建成功,恭喜你! \n\n任务名称: ${env.JOB_NAME} 第 ${env.BUILD_NUMBER} 次构建 \n\n 更多信息请查看 : ${env.BUILD_URL}"
  }
  else
  {
    mail to: addr,
    subject: "构建失败 :${currentBuild.fullDisplayName}",
    body: "\n完蛋了,快去看一下出了啥问题! \n\n任务名称: ${env.JOB_NAME} 第 ${env.BUILD_NUMBER} 次构建 \n\n 更多信息请查看 : ${env.BUILD_URL}"
  }
}

二、配置钉钉通知

//转义字符比较多,复制粘贴有可能出问题,请自行解决
void SendDingding(res)
{
  //钉钉机器人的地址,暂时不用修改
  dingding_url="https://oapi.dingtalk.com/robot/send\\?access_token\\=1dc00fdbb9bfgdkjsgjksdfjkgkjsgkjgkglkg4f5f18646gfhdh01347946"
  //输入相应的手机号码,才能在钉钉群指定通知某个人
  tel_num="176456543g4237"
  post_header="Content-Type:application/json;charset=utf-8"
  if( res == "success" )
  {
    json_msg='{\\"msgtype\\":\\"text\\",\\"text\\":{\\"content\\":\\"@' + tel_num +' 恭喜你,' + "${env.JOB_NAME} 第${env.BUILD_NUMBER} 次"  + '构建成功 \\"},\\"at\\":{\\"atMobiles\\":[\\"' + tel_num + '\\"],\\"isAtAll\\":false}}'
    sh_cmd="curl -X POST " + dingding_url + " -H " + "\'" + post_header + "\'" + " -d " + "\""  + json_msg + "\""
    sh sh_cmd
  }
  else
  {
    json_msg='{\\"msgtype\\":\\"text\\",\\"text\\":{\\"content\\":\\"@' + tel_num +' 完蛋了!!!' + "${env.JOB_NAME} 第${env.BUILD_NUMBER} 次"  + '构建出问题了 \\"},\\"at\\":{\\"atMobiles\\":[\\"' + tel_num + '\\"],\\"isAtAll\\":false}}'
    sh_cmd="curl -X POST " + dingding_url + " -H " + "\'" + post_header + "\'" + " -d " + "\""  + json_msg + "\""
    sh sh_cmd
  }
}

三、错误处理

  1. SMTPSenderFailedException: 501 mail from address must be same as authorization user
    这个错误的原因是:
    Jenkins管理员邮箱和发送邮件的邮箱不一致。
    解决办法:
    发送邮件SMTP那里(系统管理->SMTP),设置的邮箱要和管理员邮箱(系统管理->Jenkins Location->管理员邮箱)一致。如果不一致,那就二选一,改其中一个。
  2. 构建频繁,被腾讯邮箱限制了。可能需要一个限制没那么多的邮箱。

参考





http://xzh.i3geek.com

爱唠叨的老鱼

爱唠叨的老鱼

技术经理,个人站长,创业者

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据