简化工作流之代码审查回复消息生成

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

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

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

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

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

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

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

图1 研发流程图


图1

整个过程一气呵成,环环相扣。而其中可以被自动化的正好是第二步:请求他人进行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)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyspyp.html