日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python實(shí)現(xiàn)代碼審查自動(dòng)回復(fù)消息

瀏覽:23日期:2022-06-28 16:15:36

在一個(gè)規(guī)范化的研發(fā)流程中,一般遵循如下流程:

開發(fā)階段:研發(fā)功能或者修復(fù)bug,在本地自測(cè)。 代碼審核階段:提交代碼,并請(qǐng)求團(tuán)隊(duì)內(nèi)人員做code review。 測(cè)試環(huán)境測(cè)試階段:部署到測(cè)試環(huán)境并請(qǐng)求測(cè)試。 發(fā)布線上待測(cè)階段:測(cè)試環(huán)境通過測(cè)試發(fā)布到線上進(jìn)行測(cè)試。 驗(yàn)收完成任務(wù):線上驗(yàn)證成功,關(guān)閉這個(gè)任務(wù)。

實(shí)際上這只是一種最理想化的過程,因?yàn)槲覀兡J(rèn)每次狀態(tài)流轉(zhuǎn)都是順利的,開發(fā)沒有毛病,測(cè)試一次就通過,現(xiàn)實(shí)中的研發(fā)

流程的情況更復(fù)雜,如圖所示。

python實(shí)現(xiàn)代碼審查自動(dòng)回復(fù)消息

整個(gè)過程一氣呵成,環(huán)環(huán)相扣。而其中可以被自動(dòng)化的正好是第二步:請(qǐng)求他人進(jìn)行code review的時(shí)候的反饋消息。

根據(jù)實(shí)踐的經(jīng)驗(yàn),比較好的內(nèi)容格式如下(包含Markdown格式,因?yàn)楦櫲蝿?wù)的系統(tǒng)支持這種格式):

**Changes has been committed to feature/xxx-xxx**- https://git.xxx.com/xxxx/ddaf18f9be4613c31363d4c92b8bafc3sdfdsf**Details**Remove invalid logic for admin pannel

由于每次走到Code Review的步驟的時(shí)候都需要寫類似的回復(fù)在任務(wù)管理系統(tǒng)中,所以考慮使用Python腳本去自動(dòng)生成這段文字,簡(jiǎn)化工作。

根據(jù)樣例回復(fù)進(jìn)行分析,需要獲取項(xiàng)目的分支名(任務(wù)目標(biāo)分支),項(xiàng)目最后一次提交的commit id去組裝第二行的git commit的鏈接,然后Details的內(nèi)容可以從git log中的提交信息里面提取。

第一步:獲取分支名稱。

為了簡(jiǎn)化過程,默認(rèn)項(xiàng)目的當(dāng)前分支就是我們需要的分支,那么問題簡(jiǎn)化為獲取當(dāng)前分支名。可以利用git的相關(guān)命令實(shí)現(xiàn),如下:

git branch | sed -n ’/* /s///p’第二步:獲取commit id。

而獲取commit id也非常簡(jiǎn)單,只需要如下命令:

git rev-parse HEAD第三步:獲取提交信息。

還需要獲取提交信息,利用git log的命令進(jìn)行過濾也能得到:

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

git log --pretty=format命令很強(qiáng)大,除了獲得提交信息外,還有如下參數(shù)可以使用。

%H 提交對(duì)象(commit)的完整哈希字串 %h 提交對(duì)象的簡(jiǎn)短哈希字串 %T 樹對(duì)象(tree)的完整哈希字串 %t 樹對(duì)象的簡(jiǎn)短哈希字串 %P 父對(duì)象(parent)的完整哈希字串 %p 父對(duì)象的簡(jiǎn)短哈希字串 %an 作者(author)的名字 %ae 作者的電子郵件地址 %ad 作者修訂日期(可以用 -date= 選項(xiàng)定制格式) %ar 作者修訂日期,按多久以前的方式顯示 %cn 提交者(committer)的名字 %ce 提交者的電子郵件地址 %cd 提交日期 %cr 提交日期,按多久以前的方式顯示 %s 提交說(shuō)明

所以第二步也可以使用git log命令實(shí)現(xiàn),如下所示:

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

當(dāng)然還需要在后面加一點(diǎn)人性化的感謝的話,畢竟是麻煩其他人來(lái)對(duì)你代碼進(jìn)行審核,說(shuō)一些感謝的話吧,這里我就用一個(gè)list來(lái)裝一些感謝的話,然后隨機(jī)獲取一段貼到最后。如果是以面向過程的方式去編寫,那么可以編寫如下代碼:

#coding=utf-8#!/usr/bin/pythonimport os, subprocessimport random# use subprocess to get the current branch name from outputdef 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_namedef get_latest_git_log(cd_path): ''' docstring ''' os.chdir(cd_path) status, log_info = subprocess.getstatusoutput('git log --pretty=format:'%s' -1') return log_infodef get_latest_commit_id(cd_path): os.chdir(cd_path) status, commit_id = subprocess.getstatusoutput('git rev-parse HEAD') return commit_iddef 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腳本和項(xiàng)目沒有放在一個(gè)目錄下面,所以每次在執(zhí)行g(shù)it相關(guān)命令之前都需要先cd到目標(biāo)項(xiàng)目目錄下。而分別執(zhí)行g(shù)it命令的時(shí)候使用subprocess.getstatusoutput()來(lái)執(zhí)行,方便獲取標(biāo)準(zhǔn)化輸出的結(jié)果。這里之所以不使用os.system來(lái)執(zhí)行命令,是因?yàn)閛s.system運(yùn)行命令的返回值里面包括兩個(gè)部分,第一部分是命令的結(jié)果輸出,第二部分是結(jié)果是否成功的標(biāo)識(shí)符。

例如執(zhí)行os.system('git branch | sed -n ’/* /s///p’')會(huì)返回如下內(nèi)容:

feature/ST-2470

第一行是我們獲取到的分支名,第二行是成功的標(biāo)識(shí)符,0表示命令沒有任何問題。

所以我考慮使用subprocess.getstatusoutput來(lái)運(yùn)行命令,這個(gè)函數(shù)會(huì)分別返回結(jié)果標(biāo)識(shí)和輸出,方便得到想要的執(zhí)行輸出結(jié)果。

雖然代碼還可以進(jìn)一步優(yōu)化,但是已經(jīng)能滿足我的需求了,運(yùn)行這個(gè)腳本就能得到如下的輸出結(jié)果:

[~Harry]*Changes made has been committed to feature/ST-247*- https://git.xxxxx.com/someproject/subname/-/commit/d21033057677e6d49d9cea07c64c49e35529545dx*Details*- Remove some invalid logicPlease check it if you have free time, thanks.

如果改寫成面向?qū)ο蟮姆绞綍?huì)更好,調(diào)用更簡(jiǎn)單,傳遞參數(shù)也更少,采用Python3語(yǔ)法編寫的代碼如下所示:

#coding=utf-8#!/usr/bin/pythonimport osimport subprocessimport randomclass 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列表可以在增加多一點(diǎn),這樣隨機(jī)獲取之下重復(fù)的概率會(huì)更少。當(dāng)然最后一段也可以自己每次diy,畢竟感謝要發(fā)自內(nèi)心的最好。

這種簡(jiǎn)化工作流的腳本本質(zhì)是減少重復(fù)性勞動(dòng),特別是一天完成了很多個(gè)任務(wù)的時(shí)候。但是反思本身是無(wú)法被簡(jiǎn)化的,不做工作的奴隸,而是工作的主人。拋磚引玉,希望對(duì)自己和未來(lái)的自己也是一個(gè)還原鏡像。

Todo:

1.可以每天定時(shí)執(zhí)行這個(gè)腳本去生成回復(fù)消息。2.通過腳本傳參來(lái)動(dòng)態(tài)選擇需要被處理的項(xiàng)目目錄。在這個(gè)案例代碼中是hard code的,默認(rèn)是選擇了autoWork這個(gè)項(xiàng)目。3.還可以考慮接入語(yǔ)料庫(kù)(thanks words),這樣感謝的話永不重復(fù),還能學(xué)點(diǎn)新單詞。:)

以上就是python實(shí)現(xiàn)代碼審查回復(fù)消息生成的詳細(xì)內(nèi)容,更多關(guān)于python 回復(fù)消息生成的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
av在线最新| 日韩国产精品久久久久久亚洲| 欧美日韩一区二区三区不卡视频 | 蜜臀av一区二区在线免费观看| 蜜桃视频欧美| 日韩精品一级中文字幕精品视频免费观看| 亚洲香蕉久久| 国产精品日本一区二区三区在线| 久久av导航| 久久精品卡一| 丝袜亚洲另类欧美 | 久久久水蜜桃av免费网站| 亚洲美洲欧洲综合国产一区| 亚洲精选91| 激情不卡一区二区三区视频在线| 久久久一二三| 丝袜a∨在线一区二区三区不卡| 亚洲区第一页| 国产成人免费av一区二区午夜| 欧美日一区二区| 日本成人在线一区| 激情黄产视频在线免费观看| 亚洲一区黄色| 国产精品亚洲二区| 99久久亚洲精品| 欧美一级二级三级视频| 九九精品调教| 青草久久视频| 亚洲网站视频| 91p九色成人| 91精品亚洲| 日韩av一区二区三区四区| 国产福利片在线观看| 久久成人亚洲| 国产精品2023| 免费视频一区三区| 美女精品久久| 综合激情视频| 九九久久婷婷| 久久精品国产福利| 亚洲无线观看| 日韩中文在线播放| 国产欧美丝祙| 99国产一区| 国产精品毛片久久| **爰片久久毛片| 激情五月综合网| 国产成人精品免费视| 亚洲精品第一| 国产一区久久| 丰满少妇一区| 国产乱人伦精品一区| 蜜桃传媒麻豆第一区在线观看| 日韩一区电影| 麻豆极品一区二区三区| 中文字幕视频精品一区二区三区| 久久久噜噜噜| 日本一区二区高清不卡| 日韩国产一二三区| 国产精品免费看| 日韩精品久久久久久久电影99爱| 欧美欧美黄在线二区| 免费在线观看成人| 99香蕉国产精品偷在线观看 | 国产精品久久国产愉拍| 黄色亚洲免费| 久久夜夜操妹子| 成人污污视频| 免费不卡中文字幕在线| 久久亚洲不卡| 综合亚洲视频| 亚洲另类av| 国产91精品对白在线播放| 国产精品日韩精品在线播放| 中文字幕日本一区| 麻豆91精品| 在线看片不卡| 欧美va亚洲va日韩∨a综合色| 日韩电影在线视频| 日本一区二区高清不卡| 九九久久国产| 开心激情综合| 红杏一区二区三区| 欧美黑人巨大videos精品| 日本aⅴ免费视频一区二区三区| 欧美午夜不卡| 精品国模一区二区三区| 亚洲一级少妇| 日韩欧美一区二区三区在线观看| 日韩中文首页| 精品一区毛片| 免费中文字幕日韩欧美| 免费人成在线不卡| 亚洲欧美在线综合| 日本91福利区| 欧美一区不卡| 久久久国产精品入口麻豆| 国产一区二区久久久久| 国产精品久久久久av电视剧| 久久久久久黄| 亚洲一区二区成人| 天堂av在线一区| 精品欧美日韩精品| 亚洲涩涩在线| 午夜精品免费| 色综合视频一区二区三区日韩 | 欧美色图一区| 日韩网站在线| 亚洲日本久久| 国产精品一在线观看| 韩国一区二区三区视频| 成人看片网站| 午夜久久tv| 午夜久久av| 久久久久黄色| 欧美亚洲日本精品| 99国产精品久久久久久久成人热| 亚洲久草在线| 美女国产一区二区三区| 久久精品中文| 亚洲69av| 国产成人久久精品一区二区三区| 亚洲午夜视频| 中文字幕av一区二区三区四区| 欧美天堂一区| 欧美日韩免费观看视频| 午夜精品亚洲| 欧美日韩亚洲一区在线观看| 国产成人久久| 美女久久网站| 欧美亚洲综合视频| 日韩久久一区二区三区| 日本大胆欧美人术艺术动态| 欧美日韩 国产精品| 日韩在线观看一区| 亚洲麻豆一区| 欧美三级精品| 欧美啪啪一区| 九九综合九九| 国产精品日韩精品在线播放 | 精品久久美女| 亚洲欧美日韩专区| 成人亚洲一区| 亚洲免费专区| a国产在线视频| 91午夜精品| 亚洲精品网址| 久久精品九色| 免费日本视频一区| 久久男人天堂| 久久国际精品| 免费视频国产一区| 九九久久国产| 日本国产亚洲| 欧美日韩国产在线一区| 精品国产精品久久一区免费式 | 亚洲一区二区三区高清不卡| 国产精品亚洲欧美日韩一区在线 | 91精品99| 精品视频免费| 日本不卡一二三区黄网| 日韩精品dvd| 国产亚洲观看| 水野朝阳av一区二区三区| 在线人成日本视频| 欧美日韩一区二区三区不卡视频| 蜜桃成人av| 色在线视频观看| 国产精品密蕾丝视频下载| 欧美专区18| 国产精品91一区二区三区| 国产精品一区三区在线观看| 免费看欧美美女黄的网站| 日本精品在线中文字幕| 久久av资源| 国产亚洲欧美日韩精品一区二区三区 | 在线亚洲成人| 日韩成人综合| 麻豆精品视频在线观看免费| 国产亚洲毛片在线| 鲁鲁在线中文| 麻豆成人在线观看| 亚洲精品观看| 蜜桃久久久久久| 欧美女激情福利| 肉色欧美久久久久久久免费看| 国产欧美综合一区二区三区| 亚洲资源网站| 中文一区一区三区免费在线观| 不卡av一区二区| 久久九九电影| 老司机精品久久| 综合激情视频| 日韩欧美激情电影| 蜜桃久久久久久| 丝袜美腿高跟呻吟高潮一区| 国产视频一区三区| 美女国产一区二区三区| 国产精品tv| 精品淫伦v久久水蜜桃|