最近尝试用jenkins在定时构建环节统计开发人员的代码变更情况,统计方法参考http://qa.blog.163.com/blog/static/19014700220142131203191/。结果实际运行时遇到一个奇怪的问题,在命令行中明明运行很好的git shortlog命令,放到jenkins里面运行,总是无输出,在度娘上搜了一个下午,一开始以为是环境变量问题(参考https://blog.csdn.net/zzusimon/article/details/57080337),加上”#!/bin/bash -ilex”后,仍然不行,最后还是bing搜索给力,在stackoverflow上找到解决方案(https://stackoverflow.com/questions/43041659/git-shortlog-does-not-show-output-in-jenkins-shell),最后成型的脚本如下,供参考(btw:博客黏贴代码时缩进没了,请自行处理吧~~):
#!/usr/bin/python # -*- encoding: utf-8 -*- import sys import os import time import datetime import smtplib import commands # 不要用os.system if len(sys.argv) < 3: print "input argument not enough" sys.exit() os.chdir(sys.argv[1]) # PATH不存在,脚本会立即终止 projectPATH = sys.argv[1] pathArray = projectPATH.split('/') projectName = pathArray[len(pathArray)-1] daily=1 if sys.argv[2] == "weekly": daily = 0 todayStr = "%04d-%02d-%02d" % (datetime.date.today().year,datetime.date.today().month,datetime.date.today().day) calTime = time.strftime("%Y-%m-%d %H:%M") untilDate = datetime.date.today() + datetime.timedelta(days=-1) if daily == 0: untilDate = datetime.date.today() + datetime.timedelta(weeks=-1) untilDayStr = "%04d-%02d-%02d" % (untilDate.year, untilDate.month,untilDate.day) authorList=[] resultTxt="" try: S, R = commands.getstatusoutput("/usr/local/git/bin/git shortlog --numbered --summary HEAD") except Exception as e: resultTxt="get git shortlog error:\n" resultTxt=resultTxt + e.strerror + "\n" else: if S == 0: authorSummaryList=R.split('\n') count=0 for authorLine in authorSummaryList: authorArray=authorLine.split('\t') if len(authorArray) < 2: break authorName=authorArray[1] #authorList.append(authorName) try: commandStr="/usr/local/bin/git log --since={0} --until={1} --author={2} --pretty=tformat: --numstat ".format(untilDayStr,todayStr,authorName) commandStr= commandStr + "| awk '{add += $1; subs +=$2; loc += $1-$2} END {printf \"<td width=100>++: %s </td><td width=100>--: %s </td><td valign=center>total: %s </td>\", add, subs, loc}'" S, R1 = commands.getstatusoutput(commandStr) except Exception as e: resultTxt=resultTxt + "get git shortlog error:" + "\n" resultTxt=resultTxt + e.strerror + "\n" else: if S == 0: if R1.find("--: ")<0 and R1.find("++: ")<0 : resultTxt=resultTxt + "<tr><td width=160>" + authorName + " result:</td>" + R1 + "</tr><br>\n" count=count+1 else: resultTxt = resultTxt + "<tr>excute command error?:%d|%s" % (S ,commandStr) + "</tr><br>\n" if count == 0: resultTxt = "null output:[" + R + "]" else: resultTxt=resultTxt + "get git shortlog error2:%d" % S + "\n" if daily == 1: mailContent = "<h3>[" + projectName + "]代码量统计</h3><br>\n<br>\n" else: mailContent = "<h3>[" + projectName + "]周代码量统计</h3><br>\n<br>\n" mailContent = mailContent + "<p>since:" + untilDayStr + "</p>\n" mailContent = mailContent + "<p>until:" + todayStr+ "</p>\n" mailContent = mailContent + "<p>caltime:" + calTime+ "</p>\n" mailContent = mailContent + "<br>\n<br>\n<table border=1 width=\"500\">" + resultTxt + "</table>" from email.mime.text import MIMEText from email.header import Header sender = 'noreply@corp.xxx.com' receivers = ['hunter@corp.xxx.com'] message = MIMEText(mailContent, 'html', 'utf-8') if daily == 1: message['From'] = Header("daily statistical", 'utf-8') else: message['From'] = Header("weekly statistical", 'utf-8') message['To'] = Header("开发组", 'utf-8') subject = "%s代码量统计" % todayStr message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP('192.168.1.1') smtpObj.sendmail(sender, receivers, message.as_string()) print "send success" except smtplib.SMTPException: print "Error: 无法发送邮件"