在一个规范化的研发流程中,一般遵循如下流程:

开发阶段:研发功能或者修复bug,在本地自测。

代码审核阶段:提交代码,并请求团队内人员做code review。

测试环境测试阶段:部署到测试环境并请求测试。

发布线上待测阶段:测试环境通过测试发布到线上进行测试。

验收完成任务:线上验证成功,关闭这个任务。

实际上这只是一种最理想化的过程,因为我们默认每次状态流转都是顺利的,开发没有毛病,测试一次就通过,现实中的研发

流程的情况更复杂,如图所示。

整个过程一气呵成,环环相扣。而其中可以被自动化的正好是第二步:请求他人进行code review的时候的反馈消息。

根据实践的经验,比较好的内容格式如下(包含Markdown格式,因为跟踪任务的系统支持这种格式):

**Changes has been committed to feature/xxx-xxx**

- https://git.xxx.com/xxxx/ddaf18f9be4613c31363d4c92b8bafc3sdfdsf

**Details**

Remove invalid logic for admin pannel

由于每次走到Code Review的步骤的时候都需要写类似的回复在任务管理系统中,所以考虑使用Python脚本去自动生成这段文字,简化工作。

根据样例回复进行分析,需要获取项目的分支名(任务目标分支),项目最后一次提交的commit id去组装第二行的git commit的链接,然后Details的内容可以从git log中的提交信息里面提取。

第一步:获取分支名称。

为了简化过程,默认项目的当前分支就是我们需要的分支,那么问题简化为获取当前分支名。可以利用git的相关命令实现,如下:

git branch | sed -n '/\* /s///p'

第二步:获取commit id。

而获取commit id也非常简单,只需要如下命令:

git rev-parse HEAD

第三步:获取提交信息。

还需要获取提交信息,利用git log的命令进行过滤也能得到:

git log --pretty=format:"%s" -1

git log --pretty=format命令很强大,除了获得提交信息外,还有如下参数可以使用。

%H 提交对象(commit)的完整哈希字串

%h 提交对象的简短哈希字串

%T 树对象(tree)的完整哈希字串

%t 树对象的简短哈希字串

%P 父对象(parent)的完整哈希字串

%p 父对象的简短哈希字串

%an 作者(author)的名字

%ae 作者的电子邮件地址

%ad 作者修订日期(可以用 -date= 选项定制格式)

%ar 作者修订日期,按多久以前的方式显示

%cn 提交者(committer)的名字

%ce 提交者的电子邮件地址

%cd 提交日期

%cr 提交日期,按多久以前的方式显示

%s 提交说明

所以第二步也可以使用git log命令实现,如下所示:

git log --pretty=format:"%H" -1

当然还需要在后面加一点人性化的感谢的话,毕竟是麻烦其他人来对你代码进行审核,说一些感谢的话吧,这里我就用一个list来装一些感谢的话,然后随机获取一段贴到最后。

如果是以面向过程的方式去编写,那么可以编写如下代码:

#coding=utf-8

#!/usr/bin/python

import os, subprocess

import random

# use subprocess to get the current branch name from output

def get_branch_name(cd_path):

os.chdir(cd_path)

status, branch_name = subprocess.getstatusoutput("git branch | sed -n '/\* /s///p'")

# print(output)

# exit(0)

return branch_name

def get_latest_git_log(cd_path):

"""

docstring

"""

os.chdir(cd_path)

status, log_info = subprocess.getstatusoutput("git log --pretty=format:\"%s\" -1")

return log_info

def get_latest_commit_id(cd_path):

os.chdir(cd_path)

status, commit_id = subprocess.getstatusoutput("git rev-parse HEAD")

return commit_id

def get_reviewer_by_random(reviewers):

return random.choice(reviewers)

def get_thanks_words_by_random(thanks_words):

return random.choice(thanks_words)

def create_comment(reviewers, branch_name, log_info, commit_id, thanks_words):

print(get_reviewer_by_random(reviewers))

print("*Changes made has been committed to " + branch_name + "*")

print("- https://git.xxxxx.com/someproject/subname/-/commit/" + commit_id)

print("*Details*")

print("-" + log_info)

print(get_thanks_words_by_random(thanks_words))

branch_name = get_branch_name('/Users/tony/www/autoWork')

log_info = get_latest_git_log('/Users/tony/www/autoWork')

commit_id = get_latest_commit_id('/Users/tony/www/autoWork')

reviewers = [

'[~Harry]',

'[~Tom]'

]

random_thanks_words = [

'Review it please, thanks.',

'Actually, I am glad to see you have time to review it, thanks a lot.',

'Please check it if you have free time, thanks.',

'Check it please.'

'Waiting for your code review, thank you.'

]

create_comment(reviewers, branch_name, log_info, commit_id, random_thanks_words)

由于Python脚本和项目没有放在一个目录下面,所以每次在执行git相关命令之前都需要先cd到目标项目目录下。而分别执行git命令的时候使用subprocess.getstatusoutput()来执行,方便获取标准化输出的结果。这里之所以不使用os.system来执行命令,是因为os.system运行命令的返回值里面包括两个部分,第一部分是命令的结果输出,第二部分是结果是否成功的标识符。

例如执行os.system("git branch | sed -n '/* /s///p'")会返回如下内容:

feature/ST-247

0

第一行是我们获取到的分支名,第二行是成功的标识符,0表示命令没有任何问题。

所以我考虑使用subprocess.getstatusoutput来运行命令,这个函数会分别返回结果标识和输出,方便得到想要的执行输出结果。

虽然代码还可以进一步优化,但是已经能满足我的需求了,运行这个脚本就能得到如下的输出结果:

[~Harry]

*Changes made has been committed to feature/ST-247*

- https://git.xxxxx.com/someproject/subname/-/commit/d21033057677e6d49d9cea07c64c49e35529545dx

*Details*

- Remove some invalid logic

Please check it if you have free time, thanks.

如果改写成面向对象的方式会更好,调用更简单,传递参数也更少,采用Python3语法编写的代码如下所示:

#coding=utf-8

#!/usr/bin/python

import os

import subprocess

import random

class CommitComment:

def __init__(self, project_path: str, reviewers: list, thanks_words: list):

self.project_path = project_path

self.reviewers = reviewers

self.thanks_words = thanks_words

# use subprocess to get the current branch name from output

def get_branch_name(self) -> str:

os.chdir(self.project_path)

status, branch_name = subprocess.getstatusoutput("git branch | sed -n '/\* /s///p'")

return branch_name

# use subprocess to get the latest commit message from git log

def get_latest_git_log(self) -> str:

os.chdir(self.project_path)

status, log_info = subprocess.getstatusoutput("git log --pretty=format:\"%s\" -1")

return log_info

# use subprocess to get the latest commit id from git log

def get_latest_commit_id(self) -> str:

os.chdir(self.project_path)

status, commit_id = subprocess.getstatusoutput("git rev-parse HEAD")

return commit_id

def get_reviewer_by_random(self) -> str:

return random.choice(self.reviewers)

def get_thanks_words_by_random(self) -> str:

return random.choice(self.thanks_words)

def create_comment(self):

print(self.get_reviewer_by_random())

print("*Changes has been committed to " + self.get_branch_name() + "*")

print("- https://git.xxxx.com/MyProject/ProjectName/-/commit/" + self.get_latest_commit_id())

print("*Details*")

print("-" + self.get_latest_git_log())

print(self.get_thanks_words_by_random())

thanks_words = [

'Review it please, thanks.',

'Actually, I am glad to see you have time to review it, thanks a lot.',

'Please check it if you have free time, thanks.',

'Check it please.'

'Waiting for your code review, thank you.'

]

reviewers = [

'[~Harry]',

'[~Tom]'

]

comment = CommitComment('/Users/tony/www/autoWork', reviewers, thanks_words)

comment.create_comment() # will print out the complete comment

thanks_words列表可以在增加多一点,这样随机获取之下重复的概率会更少。当然最后一段也可以自己每次diy,毕竟感谢要发自内心的最好。

这种简化工作流的脚本本质是减少重复性劳动,特别是一天完成了很多个任务的时候。但是反思本身是无法被简化的,不做工作的奴隶,而是工作的主人。

抛砖引玉,希望对自己和未来的自己也是一个还原镜像。

Todo:

1.可以每天定时执行这个脚本去生成回复消息。

2.通过脚本传参来动态选择需要被处理的项目目录。在这个案例代码中是hard code的,默认是选择了autoWork这个项目。

3.还可以考虑接入语料库(thanks words),这样感谢的话永不重复,还能学点新单词。:)

以上就是python实现代码审查回复消息生成的详细内容,更多关于python 回复消息生成的资料请关注脚本之家其它相关文章!

python实现淘宝自动回复_python实现代码审查自动回复消息相关推荐

  1. python爬虫淘宝评论_Python爬取淘宝店铺和评论

    1 安装开发需要的一些库 (1) 安装mysql 的驱动:在Windows上按win+r输入cmd打开命令行,输入命令pip install pymysql,回车即可. (2) 安装自动化测试的驱动s ...

  2. python爬虫淘宝登录_python爬虫实现模拟淘宝登录

    就算所有人都不支持你.这条路会很曲折,你也会一度认为是不是自己选错了,但只要坚持,就算最后没有成功,但努力了就不会有遗憾. python爬虫模拟淘宝登录 小贴士 这个爬虫和搜索引擎的爬虫是有区别的.搜 ...

  3. Python 模拟淘宝客服小蜜自动回复

    首先,新建一个文本文件做准备: 订单|如果您有任何订单问题,可以登录淘宝账号,点击"我的订单",查看订单详情. 物流|如果您有任何订单问题,可以登录淘宝账号,点击"我的订 ...

  4. python提交淘宝订单_python实现同步淘宝客订单到本地数据库

    阿里不对小淘客开放淘客订单查询功能,所以只能通过程序登录联盟账号爬取订单信息.网上找了一个别人python写的,我增加了一段同步mysql数据库代码.第一次写python,遇到了很多坑,不过pytho ...

  5. python实现淘宝秒杀_python实现简单淘宝秒杀功能

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. python写淘宝秒杀脚本_python实现淘宝秒杀脚本

    本文实例为大家分享了python实现淘宝秒杀脚本的具体代码,供大家参考,具体内容如下 1.安装pycharm.网上教程很多. 2.安装 Selenium 库. Selenium支持很多浏览器,我选择的 ...

  7. python淘宝秒杀_Python 实现淘宝秒杀的示例代码

    新手学习Python,之前在网上看见一位朋友写的40行Python代码搞定京东秒杀,想在淘宝上帮女朋友抢玩偶,所以就照猫画虎的写了下淘宝的秒杀脚本,经自己实验可行.直接上代码: #-*- coding ...

  8. 利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...

    数据挖掘入门与实战 公众号: datadw 本文讲述如何利用Python模拟淘宝的搜索过程并对搜索结果进行初步的数据可视化分析. 搜索过程的模拟:淘宝的搜索页面有两种形式, 一种形式是, 2019/2 ...

  9. 用python实现淘宝毫秒级秒!! 天猫淘宝的抢购完美实现 而且说实话有很多人需要它。 每次在抢购前的无法提交订单导致很多买家无法购买。 今天我教给大家如何更好快速实现你的购买愿望! 教程如下!请仔

    用python实现淘宝毫秒级秒!! 天猫淘宝的抢购完美实现 而且说实话有很多人需要它. 每次在抢购前的无法提交订单导致很多买家无法购买. 今天我教给大家如何更好快速实现你的购买愿望! 教程如下!请仔细 ...

最新文章

  1. 为放大器模拟输入模块提供可靠的输入过电压保护
  2. 数据库模型设计——主键的设计
  3. 为什么忘记commit也会造成select查询的性能问题
  4. Linux_CentOS-服务器搭建 六
  5. [Vue]组件——通过$emit为组件自定义事件
  6. python用pip安装numpy mac_Mac下python安装numpy,pandas,matplotlib
  7. 【2019.09.21】ICPC Latin American Regional-2017
  8. Python 第五章 因子分析
  9. 33. 对包含指针的容器使用remove这一类算法时要特别小心
  10. Java代码优化的35个细节,你用了吗?
  11. 服务器设置 上传excel文件夹,excel上传服务器
  12. jdk1.6-64下载
  13. 港科报道 | 8位校友入选香港25青年科创先锋人物
  14. 和Keyle一起学ShaderForge – Create Base Shader
  15. Babylongjs-纹理
  16. 大业达公司裁员风云2
  17. 运维工程师社招、校招面试经验汇总
  18. 我原以为我不会伤心......
  19. Android Wi-Fi Display(Miracast)介绍
  20. TCP/IP Socket 服务器对接

热门文章

  1. 用python的小海龟 Turtle 画一朵好看又有趣的小花
  2. android studio模拟手机黑屏,Android studio 模拟器启动黑屏解决办法
  3. 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。...
  4. android 8 修改ip,android 8.1 framework层修改以太网静态ip功能
  5. Android系统下的文件权限
  6. 怎样在Powerpoint中剪裁视频或音频ppt背景素材
  7. 王垠:自动编程是不可能的 我为什么不在乎人工智能
  8. 简述 css 盒子模型
  9. Android MaterialButton的一些问题
  10. 我眼中的西安(r11笔记第52天)