阿捷外传之Git代码统计:DotNetCore + PowerBI 实现Git仓库日志分析
前言
2020年3月初春,雖然春節(jié)已經過去一個多月,大街上還未恢復往年的熱鬧。由于春節(jié)前夕突然降臨的冠狀病毒,導致很多員工無法回到城市復工。春節(jié)之后,阿捷所在的公司考慮到復工帶來的風險,通知所有員工以遠程的方式在家辦公。
某一天,PM聯(lián)系到阿捷,說目前有一個需求,想要對各個項目組的Git倉庫提交信息進行相關統(tǒng)計,讓阿捷調研一下。于是阿捷查了一番資料,了解到可以直接用原生 Git 命令行的方式來實現(xiàn)。
即使用內置的?git log?命令,提取倉庫下的提交日志。
實踐經過
git log?默認的輸出格式是下面這個樣子:
其中,上面的輸出內容里主要包含了以下4種信息:
Commit 信息,每次提交的一個hash值;
Author 相關信息,提交的作者和及郵箱信息;
Commit Message, 提交時填寫的信息,可能會包含多行文字。
Date 信息,這個信息中除了有日期時間,還包含時區(qū)信息。例如,從上圖中可以看到有一條記錄的日期為 Mon Mar 2 22:06:13 2020 -0800,其中最后的 -0800 就是所在的時區(qū),即西八區(qū),根據時區(qū)地圖,可以看到 -0800是在美國西部灣區(qū)。中國處于東八區(qū),所以如果是在中國提交的話,時區(qū)部分將會是 +0800 。
除了以上的4個基礎信息,PM還想要拿到每次提交時變動的代碼行數,阿捷通過查詢Git Log 的命令行文檔,了解到可以通過追加配置項?git log --shortstat?來輸出變更的行數,如下圖所示。
另外,git log 也考慮到輸出格式化的問題,可以使用特殊的占位符指定輸出格式。經過反復實驗,優(yōu)化后的命令如下:
git log --all --pretty="%x40%h%x2C%an%x2C%ad%x2C%x22%s%x22%x2C" --shortstat | tr "\n" " " | tr "@" "\n"通過上面的魔幻配置,基本上能從每條提交記錄中提取出需要的列,然后用逗號方式進行拼接,最終可以生成出CSV格式的文件。
然而這種方式始終不夠優(yōu)雅,命令中額外使用了?tr?對字符串進行處理,這意味著在目標機器上也要有這個工具,否則無法運行,而 windows 上只能通過安裝第三方工具實現(xiàn)。
另外一點是擴展性問題,命令行對于csv這種簡單的格式處理還好說,如果要輸出JSON格式的話,就不好辦了,而且命令行的配置項幾乎沒人能看懂,以后維護起來免不了要996。
基于上述痛點,阿捷又在網上搜尋了一番,最終在MVP大佬的一篇博客(https://edi.wang/post/2019/3/26/operate-git-with-net-core)中找到了蛛絲馬跡。根據博客中的內容來看,可以通過一款名為libgit2sharp(https://github.com/libgit2/libgit2sharp)的類庫,實現(xiàn)我們的需求。
libgit2sharp內部嵌套了一個基于C語言實現(xiàn)的Git內核,它自身對外提供一系列和Git操作相關的接口,并且它的上游核心倉庫libgit2(https://github.com/libgit2/),提供了對包括Python,PHP,C#在內的多種語言的支持。而且項目是開源的,由社區(qū)進行維護。
阿捷經過簡單上手,覺得提供的API可以滿足需要,然后快速制作出了一個簡易的命令行程序。核心代碼如下:
using (var repo = new Repository(workdir)) {Console.WriteLine("all commit count:" + repo.Commits.Count());foreach (Commit commit in repo.Commits){var commitDto = new GitCommitLogDto{CommitHash = commit.Sha,AuthorName = commit.Author.Name,AuthorEmail = commit.Author.Email,MessageShort = commit.MessageShort,AuthorDate = commit.Author.When.DateTime,};var patch = GetPatchInfo(repo, commit);if (patch != null){commitDto.LinesAdded = patch.LinesAdded;commitDto.LinesDeleted = patch.LinesDeleted;};Console.WriteLine(commitDto.ToString());list.Add(commitDto);} }由于有了良好封裝和結構化數據的支持,理論上可以將結果轉化成任何格式,包括CSV,JSON,XML等,并且可以很方便地對數據格式進行任意加工。
考慮到工具在實際使用時,面臨著跨平臺和環(huán)境依賴的問題,于是阿捷使用了DoNetCore3.0提供的新特性,將程序打包成了不依賴安裝環(huán)境的可執(zhí)行文件,不需要安裝外部依賴,開箱即用,最終打包的命令如下:
# publish win-x64 dotnet publish -c Release -o publish/win-x64 -r win-x64 /p:PublishSingleFile=true /p:IncludeSymbolsInSingleFile=true /p:PublishTrimmed=true#publish linux-x64 dotnet publish -c Release -o publish/linux-x64 -r linux-x64 /p:PublishSingleFile=true /p:IncludeSymbolsInSingleFile=true /p:PublishTrimmed=true然后因為是開源項目,可以用GitHub的高性能構建機器,阿捷使用了yml文件為項目制作了自動構建的流水線,每次提交代碼后自動觸發(fā)編譯生成出新的二進制文件。
除了CSV文件的部分,PM那還需要制作出相關報表,對CSV中的數據進行統(tǒng)計。阿捷考察了目前市面上流行的BI工具,最終選擇了免費的PowerBI桌面版(https://powerbi.microsoft.com/zh-cn/)。
PowerBI是由微軟出品的一款專業(yè)的用于商業(yè)智能方向的報表工具,桌面版內嵌了一套高性能的計算引擎,不需要安裝任何依賴,開箱即用。而且支持的數據源種類非常多,CSV文件完全不在話下。
阿捷首先用吃狗糧的態(tài)度,用自己制作的命令行工具,從AspNetCore(https://github.com/dotnet/aspnetcore)的官方Github倉庫中提取出了共計4萬多提交信息,數據如下:
然后,阿捷經過對PowerBI簡單的上手,制作出了下面幾張報表。
上圖中可以看到AspNetCore中倉庫提交記錄是最早從2013年開始的。
上圖中,可以看到2017和2018年是提交次數和增加行數最多的一年,參考aspnetcore的發(fā)布時間,可以知道這期間經歷了從1.1到2.0和2.2之間的迭代。
上面兩張圖展示了根據提交者的郵箱后綴,對提交次數和增加行數的統(tǒng)計。可以看出,來自微軟員工的提交占了相當的分量,并且來自外部的貢獻者也很廣泛,說明AspNetCore有著廣泛的社區(qū)貢獻者。
上述兩種圖展示 的提交的日期主要分布在周一到周五之間的工作日,在提交的時間分布上,主要集中在上午10點到下午5點之間。
后記
有了DotNetCore和PowerBI的助力,阿捷很輕松地搞定了PM的需求,為了發(fā)揚回饋社區(qū)的精神,阿捷將項目托管在了GitHub上,倉庫鏈接:https://github.com/leansoftX/dotnet-gitstats。有需要的小伙伴可以直接拿來食用。目前項目還在早期階段,歡迎動手能力強的小伙伴增加新功能,提交ISSUE或PR。
參考資源
Git Log 命令行文檔(https://git-scm.com/docs/git-log)
libgit2sharp上手博客(https://edi.wang/post/2019/3/26/operate-git-with-net-core)
libgit2sharp 上手wiki(https://github.com/libgit2/libgit2sharp/wiki/git-log)
PowerBI下載地址(https://www.microsoft.com/en-us/download/details.aspx?id=58494)
本周二(今天)晚8點,Boat House共創(chuàng)迭代會議直播????
總結
以上是生活随笔為你收集整理的阿捷外传之Git代码统计:DotNetCore + PowerBI 实现Git仓库日志分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core开发实战(第19课:日
- 下一篇: 一个全栈式的应用集成平台,打破“信息孤岛