日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

阿捷外传之Git代码统计:DotNetCore + PowerBI 实现Git仓库日志分析

發(fā)布時(shí)間:2023/12/4 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿捷外传之Git代码统计:DotNetCore + PowerBI 实现Git仓库日志分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

2020年3月初春,雖然春節(jié)已經(jīng)過(guò)去一個(gè)多月,大街上還未恢復(fù)往年的熱鬧。由于春節(jié)前夕突然降臨的冠狀病毒,導(dǎo)致很多員工無(wú)法回到城市復(fù)工。春節(jié)之后,阿捷所在的公司考慮到復(fù)工帶來(lái)的風(fēng)險(xiǎn),通知所有員工以遠(yuǎn)程的方式在家辦公。

某一天,PM聯(lián)系到阿捷,說(shuō)目前有一個(gè)需求,想要對(duì)各個(gè)項(xiàng)目組的Git倉(cāng)庫(kù)提交信息進(jìn)行相關(guān)統(tǒng)計(jì),讓阿捷調(diào)研一下。于是阿捷查了一番資料,了解到可以直接用原生 Git 命令行的方式來(lái)實(shí)現(xiàn)。

即使用內(nèi)置的?git log?命令,提取倉(cāng)庫(kù)下的提交日志。

實(shí)踐經(jīng)過(guò)

git log?默認(rèn)的輸出格式是下面這個(gè)樣子:

其中,上面的輸出內(nèi)容里主要包含了以下4種信息:

  • Commit 信息,每次提交的一個(gè)hash值;

  • Author 相關(guān)信息,提交的作者和及郵箱信息;

  • Commit Message, 提交時(shí)填寫(xiě)的信息,可能會(huì)包含多行文字。

Date 信息,這個(gè)信息中除了有日期時(shí)間,還包含時(shí)區(qū)信息。例如,從上圖中可以看到有一條記錄的日期為 Mon Mar 2 22:06:13 2020 -0800,其中最后的 -0800 就是所在的時(shí)區(qū),即西八區(qū),根據(jù)時(shí)區(qū)地圖,可以看到 -0800是在美國(guó)西部灣區(qū)。中國(guó)處于東八區(qū),所以如果是在中國(guó)提交的話,時(shí)區(qū)部分將會(huì)是 +0800 。

除了以上的4個(gè)基礎(chǔ)信息,PM還想要拿到每次提交時(shí)變動(dòng)的代碼行數(shù),阿捷通過(guò)查詢Git Log 的命令行文檔,了解到可以通過(guò)追加配置項(xiàng)?git log --shortstat?來(lái)輸出變更的行數(shù),如下圖所示。

另外,git log 也考慮到輸出格式化的問(wèn)題,可以使用特殊的占位符指定輸出格式。經(jīng)過(guò)反復(fù)實(shí)驗(yàn),優(yōu)化后的命令如下:

git log --all --pretty="%x40%h%x2C%an%x2C%ad%x2C%x22%s%x22%x2C" --shortstat | tr "\n" " " | tr "@" "\n"

通過(guò)上面的魔幻配置,基本上能從每條提交記錄中提取出需要的列,然后用逗號(hào)方式進(jìn)行拼接,最終可以生成出CSV格式的文件。

然而這種方式始終不夠優(yōu)雅,命令中額外使用了?tr?對(duì)字符串進(jìn)行處理,這意味著在目標(biāo)機(jī)器上也要有這個(gè)工具,否則無(wú)法運(yùn)行,而 windows 上只能通過(guò)安裝第三方工具實(shí)現(xiàn)。

另外一點(diǎn)是擴(kuò)展性問(wèn)題,命令行對(duì)于csv這種簡(jiǎn)單的格式處理還好說(shuō),如果要輸出JSON格式的話,就不好辦了,而且命令行的配置項(xiàng)幾乎沒(méi)人能看懂,以后維護(hù)起來(lái)免不了要996。

基于上述痛點(diǎn),阿捷又在網(wǎng)上搜尋了一番,最終在MVP大佬的一篇博客(https://edi.wang/post/2019/3/26/operate-git-with-net-core)中找到了蛛絲馬跡。根據(jù)博客中的內(nèi)容來(lái)看,可以通過(guò)一款名為libgit2sharp(https://github.com/libgit2/libgit2sharp)的類(lèi)庫(kù),實(shí)現(xiàn)我們的需求。

libgit2sharp內(nèi)部嵌套了一個(gè)基于C語(yǔ)言實(shí)現(xiàn)的Git內(nèi)核,它自身對(duì)外提供一系列和Git操作相關(guān)的接口,并且它的上游核心倉(cāng)庫(kù)libgit2(https://github.com/libgit2/),提供了對(duì)包括Python,PHP,C#在內(nèi)的多種語(yǔ)言的支持。而且項(xiàng)目是開(kāi)源的,由社區(qū)進(jìn)行維護(hù)。

阿捷經(jīng)過(guò)簡(jiǎn)單上手,覺(jué)得提供的API可以滿足需要,然后快速制作出了一個(gè)簡(jiǎn)易的命令行程序。核心代碼如下:

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);} }

由于有了良好封裝和結(jié)構(gòu)化數(shù)據(jù)的支持,理論上可以將結(jié)果轉(zhuǎn)化成任何格式,包括CSV,JSON,XML等,并且可以很方便地對(duì)數(shù)據(jù)格式進(jìn)行任意加工。

考慮到工具在實(shí)際使用時(shí),面臨著跨平臺(tái)和環(huán)境依賴的問(wèn)題,于是阿捷使用了DoNetCore3.0提供的新特性,將程序打包成了不依賴安裝環(huán)境的可執(zhí)行文件,不需要安裝外部依賴,開(kāi)箱即用,最終打包的命令如下:

# 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

然后因?yàn)槭情_(kāi)源項(xiàng)目,可以用GitHub的高性能構(gòu)建機(jī)器,阿捷使用了yml文件為項(xiàng)目制作了自動(dòng)構(gòu)建的流水線,每次提交代碼后自動(dòng)觸發(fā)編譯生成出新的二進(jìn)制文件。

除了CSV文件的部分,PM那還需要制作出相關(guān)報(bào)表,對(duì)CSV中的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)。阿捷考察了目前市面上流行的BI工具,最終選擇了免費(fèi)的PowerBI桌面版(https://powerbi.microsoft.com/zh-cn/)。

PowerBI是由微軟出品的一款專(zhuān)業(yè)的用于商業(yè)智能方向的報(bào)表工具,桌面版內(nèi)嵌了一套高性能的計(jì)算引擎,不需要安裝任何依賴,開(kāi)箱即用。而且支持的數(shù)據(jù)源種類(lèi)非常多,CSV文件完全不在話下。

阿捷首先用吃狗糧的態(tài)度,用自己制作的命令行工具,從AspNetCore(https://github.com/dotnet/aspnetcore)的官方Github倉(cāng)庫(kù)中提取出了共計(jì)4萬(wàn)多提交信息,數(shù)據(jù)如下:

然后,阿捷經(jīng)過(guò)對(duì)PowerBI簡(jiǎn)單的上手,制作出了下面幾張報(bào)表。

上圖中可以看到AspNetCore中倉(cāng)庫(kù)提交記錄是最早從2013年開(kāi)始的。

上圖中,可以看到2017和2018年是提交次數(shù)和增加行數(shù)最多的一年,參考aspnetcore的發(fā)布時(shí)間,可以知道這期間經(jīng)歷了從1.1到2.0和2.2之間的迭代。

上面兩張圖展示了根據(jù)提交者的郵箱后綴,對(duì)提交次數(shù)和增加行數(shù)的統(tǒng)計(jì)。可以看出,來(lái)自微軟員工的提交占了相當(dāng)?shù)姆至?#xff0c;并且來(lái)自外部的貢獻(xiàn)者也很廣泛,說(shuō)明AspNetCore有著廣泛的社區(qū)貢獻(xiàn)者。

上述兩種圖展示 的提交的日期主要分布在周一到周五之間的工作日,在提交的時(shí)間分布上,主要集中在上午10點(diǎn)到下午5點(diǎn)之間。

后記

有了DotNetCore和PowerBI的助力,阿捷很輕松地搞定了PM的需求,為了發(fā)揚(yáng)回饋社區(qū)的精神,阿捷將項(xiàng)目托管在了GitHub上,倉(cāng)庫(kù)鏈接:https://github.com/leansoftX/dotnet-gitstats。有需要的小伙伴可以直接拿來(lái)食用。目前項(xiàng)目還在早期階段,歡迎動(dòng)手能力強(qiáng)的小伙伴增加新功能,提交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點(diǎn),Boat House共創(chuàng)迭代會(huì)議直播????

總結(jié)

以上是生活随笔為你收集整理的阿捷外传之Git代码统计:DotNetCore + PowerBI 实现Git仓库日志分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。