每日git commit汇总钉钉通知脚本实现

背景

公司一直倡导测试要对开发改动的代码进行codereview。
小的需求一般在一个项目里面几个commit的情况下,的确所花的review成本也不高。
但是一旦项目比较大型,涉及的代码仓库比较多,且前期开发提交频繁的情况下,一旦等到提测才进行codereview,这个堆积的工作量就太大了,看着就有一种不想review的感觉呢。
而且这么多的commit的情况下,一次性光看commit message都觉得负担很重,谈何review?

解决思路

既然一次过review的量太大,我们为何不尝试每天抽时间完成当天提交的review呢?
在提测之前提前介入review,还能及时发现问题,把bug扼杀在开发阶段~
于是我们基于jenkins和钉钉机器人做了一个每日git commit汇总钉钉通知小工具。

  • 支持多仓库汇总
  • 支持一个仓库多分支汇总
  • 支持同时发送多个机器人消息

具体实现

所用到的工具

  • jenkins——用于定期执行+仓库配置
  • GitPython——一个git操作的python库
  • 钉钉机器人——发送通知

流程

  1. 从命令行中获取到git url以及钉钉机器人token(支持以列表形式传入)
  2. 根据git url将项目有仓库克隆到本地
  3. 获取仓库中一天以内的commit,解析获取其中的commit message、committer、基于giturl拼接成的commit 详情URL。形成一个字典数组
  4. 拼接成markdown格式的文案
  5. 根据命令行中的token,给对应机器人发送钉钉通知

效果图

image.png

核心代码

以下代码python版本为2.7.10。

git仓库操作

def getCommitMessages( repos,day_count ):
    repos_list = repos.split(";")
    summary=[]
    # 遍历列表中所有仓库
    for repo_str in repos_list:
        # 执行前清空临时文件夹
        deleteDir(tmp_path)
        repo = json.loads(repo_str)
        project_name = repo['url'].split('/')[-1]
        project_title = project_name+'-'+repo['branch']
        repo['title'] = project_title
        work_dir = os.path.join(tmp_path,project_title)
        if 'http' not in repo['url']:
            repo['error']='仓库链接仅支持http/https的格式,请修改仓库链接。当前的仓库链接为:{}'.format(repo['url'])
            summary.append(repo)
            continue
        try:
            # 克隆到本地
            git.Repo.clone_from(repo['url'], work_dir, branch=repo['branch'], progress=None)
            repository = git.Repo(work_dir)
            results=[]
            # 获取每一个n天以内的commit并打印出时间和拼接详情链接
            today = datetime.now()
            last_commit_date = time.mktime((today - timedelta(days=day_count)).timetuple())
            commits=repository.iter_commits(rev=None,paths='', max_age=last_commit_date)
            for commit in commits:
                result={}
                commit_date = datetime.fromtimestamp(commit.committed_date)
                result['date'] = str(commit_date)
                result['committer'] = commit.author.name.encode('utf-8')
                # 需要对markdown的标签进行转义
                result['message']= commit.message.replace('# ','\# ') \
                    .replace('* ',"\* ") \
                    .replace('\r\n\r\n',' >>> ') \
                    .replace('\n','  ') \
                    .replace('\r','  ') \
                    .split('Conflicts:')[0] \
                    .encode('utf-8')
                result['url']= '{}/commit/{}'.format(repo['url'], str(commit))
                results.append(result)
            repo['commits']=results
            if results == []:
                repo['error'] = '暂无更新'
        except Exception as e:
            repo['error']='仓库克隆失败,请检查是否仓库地址有误或是否有权限问题。仓库地址:{}'.format(repo['url'])
            print (str(e))
        summary.append(repo)
    return summary

转换成markdown格式

# 生成对应格式的的message
def summaryToMarkdown( summary ):
    message=''
    for repo in summary:
        message += '#### {}:  \n'.format(repo['title'])
        message += '>  \n'
        if repo.has_key('error') :
            message += repo['error']+"\n\n"
            continue
        for commit in repo['commits']:
            message += '* 【{} **{}**】[{}]({})  \n'.format(commit['date'], commit['committer'], commit['message'], commit['url'])
        message += '\n\n'
    return message

发送钉钉消息

# 发送钉钉消息  
def sent_dingding_message(token,content,
                          template="""## 最近24小时内git commit汇总情况如下:  \n {}"""):
    headers = {'content-type': 'application/json'}
    payload = {
        "msgtype": "markdown",
        "markdown": {
            "title": "每日git commit汇总",
            "text": template.format(content)
        }
    }
    s = requests.session()
    resp = s.post('https://oapi.dingtalk.com/robot/send?access_token={}'.format(token),
                  headers=headers,
                  data=json.dumps(payload))
    if resp.status_code != 200:
        resp.encoding="utf-8"
        print(resp.text)
        raise Exception("消息发送失败")

如何使用

  1. 将脚本上传到一个git仓库保存。
  2. 在jenkins的宿主机安装好GitPython依赖库
pip install gitpython
  1. 新建一个jenkins 自由风格的Job
    1. 在源码管理中添加脚本的仓库。
    2. 新增一个日程表,每天定时执行。
    3. 新增一个Execute Shell脚本,按照以下格式填写即可。
    # 这里修改钉钉机器人token
    export token=token1,token2
    # 按照如下格式配置需要汇总的仓库和分支,通过英文分号;隔开,同一个仓库的多个分支需要分开两条写
    export repos='{"url":"http://github.com/xx/xx","branch":"develop"};{"url":"http://github.com/xx/xx","branch":"master"}'
    python gitCommitNotice.py
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,653评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,321评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,833评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,472评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,306评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,274评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,658评论 3 385
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,335评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,638评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,697评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,454评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,311评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,699评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,986评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,254评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,647评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,847评论 2 335

推荐阅读更多精彩内容

  • 近年来,由于开源项目、社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更多的人在说协同开发、敏...
    a6fc544968bb阅读 9,321评论 0 30
  • 什么是编程?人们对此一直各持己见。有人说它是科学,有人说它是艺术,还有人称之为技能或手艺。我认为这三方面兼而有之。...
    被称为L的男人阅读 1,858评论 19 32
  • 油菜含羞已收场,麦子耍风光。杨梅闹市,樱桃窜巷,六月繁忙。 一年一度高天热,炎暑恋阴凉。短裙盖伞,露肩流汗,苦了姑娘。
    木貞ma阅读 267评论 3 2