作品背景
這個.net 持續集成作品還是在2014年的時候從事.net 軟件項目開發的時候做的,當時部門還用着vs2008用vb.net做項目(現在也是),項目代碼極混亂,版本工具用的vss,而且用的不怎么順,很多時候發布項目版本還是通過郵件發送代碼vs工具手工編譯打包的,並且安排了一個所謂的中高級.net開發人員每天的事情就是坐在那通過郵件收代碼合並代碼,打包編譯,這個人請假了其他人還不會打包,主要是整個代碼太亂了,只能部門經理打包,想想當年部門經理每天加班合並郵件里的開發代碼的時候,覺得都不可思議,甚至有一次一個開發主管打包因為打包的時候代碼的時候少發了一個頁面文件並且上線到客戶生產環境了,直接導致生產故障,被客戶投訴,直接扣了20%績效,而且每次我改完代碼提交的時候經常少發文件,被管理員批。
實在忍不住了跟這個版本管理員說“你就不能寫個工具自動打包,哪怕弄個批處理也行啊”
得到的答復是“你會寫你寫啊”,這樣的產品研發部門我也是醉了。
吃飯的時候跟部門經理聊到工具對提高生產力的問題的時候,我說我實在忍受不了公司的技術現狀了,需要將部門vss工具替換到svn,引入一個持續集成工具或者做個自動打包腳本,部門經理跟我來了一句 “關鍵是管理流程,工具只是手段而已” ,當時就震驚石化了,部門的技術管理水平都爛成這樣了還跟我談管理,雖然心里一萬草泥馬奔騰,但是當時還是有勇氣擔當和闖進的,哪怕是用vss也要把持續集成工具做出來。
開發過程
領導還沒同意用svn,還得用vss,最后發現vss的第三方接口開發實在問題太多了,幾乎寸步難行,僅僅調通了代碼獲取,提交日志都獲取不到。最后終於說服部門領導采用svn來管理代碼了,並且同意我做這個持續集成工具,雖然我知道用git更好,但是我清楚公司開發的認知水平和技能,能夠成功轉到svn就不易了,話說當時三十幾人沒有一個會用git,要不也直接用git了。
當時我已經知道有jenkins這樣優秀的持續集成工具了,但是由於這個工具是基於java開發的,二次擴展方面對我們團隊還是比較困難,想想自己如果能夠持續造一個輪子把公司的開發管理平台一點點做出來,從需求bug管理、到需求評審、版本打包,版本發布一整套全做完善,也應該是很有意思的事情,如是帶着個畢業生就開始干起來了。
做的過程是沒人能理解我在干什么,剛開始做出來的東西也是不太穩定,測試人員打包的時候就吐槽“什么爛東西”,最終大概花了2周時間把部門整個從vss切換到svn,並且這個工具已經基本可以使用了,並且花了很大精力把代碼庫從900多M縮減到100M以下,這個也是純粹清理垃圾的活,很多項目上定制的代碼沒用了,都在主版本里,直接弄一各backup文件夾把工程代碼放進去,而且一個項目模塊方一個,而且是大量的重復,最后不得不寫一個批處理來清理。
最終工具還是做出來了,直接導致版本管理員這個古老的角色“失業”,安排寫代碼去了,並且領導又要求把需求管理和需求評審的登記功能做出來了,前后估計花了將近一個月時間,最終需求評審功能沒啥鳥用,實行了一段時間后廢棄。
年底進行公司創新大賽評比的時候竟然入選了,當時讓我先找個工具報告ppt的時候,內心也是排斥的,這都能算得上創新,只是重復造了個輪子罷了,到年會上竟然在那么熱鬧的場合介紹這玩意,看到其他小伙伴的創新更是天馬行空的ppt之后,還是覺得不管多少還是為公司做了點實事,並且發了2000塊錢辛苦費,心想這么簡單的東西節省一個崗位成本加時間成本一年好歹有幾十萬吧,可見創新對公司確實是件好事,但是對個人的價格(不是價值)其實還很低廉的。
產品說明
這個作品的最終的展示如下
產品首頁,這個頁面非常簡單,連分頁都沒有,就是列出所有項目,而且最新發包的項目在最上面。
項目管理首頁,列出所有的項目清單,並且項目配置頁面可以配置項目的svn地址,以及項目的基本信息。
單個項目的版本發布列表,這個界面是核心操作模塊,通過點擊版本發布可以發布測試版本和正式版本,並且2個版本是基於正式的代碼svn分支和測試的分支,代碼測試完成后再合並到正式分支發布正式版本,足夠簡單,老少皆宜。
如果打包失敗可以通過“查看日志”來查看編譯失敗的原因,通過“查看備注”可以查看提交的代碼的提交記錄和操作人,並且發布成功后才可以下載,由於這個東西還在用着,所以需要馬克一下。
發布統計功能,這個功能也是當時領導比較關注的,看到有這么好的工具,趕緊搞一個統計,可以根據這個來做考核(為啥領導的思維都是啥都想到考核呢),做了一個非常好用的報表工具,那就是直接在頁面上寫sql統計代碼(O(∩_∩)O)。
代碼打包控制台程序,沒有在web頁面實現jenkins那樣的控制台程序,偷懶的方式在控制台程序里進行svn代碼的獲取以及調用系統的winrar軟件來實現打包。
實現機制
這個持續集成工具實現的時候並沒有太多參考jenkins,而是根據現有的技術空間和時間,快速的把每天人肉發包的問題解決掉。
技術架構
技術棧
- .net framework 4.0
- .net mvc3
- sqlserver 2005
- razor 模板引擎
- dapper 輕量級orm框架
- vs2010 社區版本(現在換2017打開了)
- SharpSvn (svn接口)
- MsBuild (編譯工具)
- winrar (壓縮工具)
代碼結構
從上之下分為以下工程目錄結構:
Test
用於開發時候的單元測試Utry.CI
Web應用Utry.CIConsole
控制台應用Utry.Core
業務層代碼(采用領域架構模式)Utry.Framework
框架基礎類庫,其實都來自自己之前開發的cms程序里 jqpres.cms
數據結構如下
CICheckItem
需求記錄CICodeLog
好像沒用CICodeMenu
不知道干啥的,好像沒用CIConfig
好像沒用CILog
版本發布的代碼提交日志CIProjiect
項目表CIRelease
版本發布表CIReport
報表配置表CIReview
需求評審表CIReviewProblem
需求評審記錄表CIUser
用戶管理表CIUserOrg
組織管理表CIVersionPlan
版本發布計划
編譯配置腳本
這個腳本就是MsBuild 調用的腳本,其中{SlnName}為項目的 sln文件地址,項目會跟進配置信息進行替換。
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<VName>{BranchName}_Release</VName>
<WebAppOutput>..\WebAppPublished</WebAppOutput>
<WebSiteOutput>..\WebSitePublished</WebSiteOutput>
</PropertyGroup>
<ItemGroup>
<MySourceFiles Include="web\**\*.dll;web\**\*.aspx;web\**\*.js;web\**\*.css;web\**\*.jpg;web\**\*.config;web\**\*.gif;web\**\*.config;web\**\*.png;web\**\*.ascx;"/>
</ItemGroup>
<Target Name="build">
<MsBuild Projects="{SlnName}" Targets="$(BuildCmd)" />
</Target>
</Project>
調用winrar壓縮打包部分代碼
代碼會通過根據注冊表里是否有winrar安裝信息,然后找到路徑進行調用。
/// <summary>
/// 生成Zip
/// </summary>
/// <param name="path">文件夾路徑</param>
/// <param name="rarPath">生成壓縮文件的路徑</param>
/// <param name="rarName">生成壓縮文件的文件名</param>
/// <param name="ignore">忽略的文件</param>
public static void CompressRar(String path, String rarPath, String rarName,string ignore)
{
try
{
String winRarPath = null;
if (!ExistsRar(out winRarPath)) return;//驗證WinRar是否安裝。
//var pathInfo = String.Format("a -afzip -m0 -ep1 \"{0}\" \"{1}\"", rarName, path);
var pathInfo = String.Format("a {2} -k -r -s -ep1 \"{0}\" \"{1}\"", rarName, path,ignore);
#region WinRar 用到的命令注釋
//[a] 添加到壓縮文件
//afzip 執行zip壓縮方式,方便用戶在不同環境下使用。(取消該參數則執行rar壓縮)
//-m0 存儲 添加到壓縮文件時不壓縮文件。共6個級別【0-5】,值越大效果越好,也越慢
//ep1 依名稱排除主目錄(生成的壓縮文件不會出現不必要的層級)
//r 修復壓縮檔案
//t 測試壓縮檔案內的文件
//as 同步壓縮檔案內容
//-p 給壓縮文件加密碼方式為:-p123456
#endregion
//打包文件存放目錄
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = winRarPath,//執行的文件名
Arguments = pathInfo,//需要執行的命令
UseShellExecute = false,//使用Shell執行
WindowStyle = ProcessWindowStyle.Hidden,//隱藏窗體
WorkingDirectory = rarPath,//rar 存放位置
CreateNoWindow = true,//不顯示窗體
},
};
process.Start();//開始執行
process.WaitForExit();//等待完成並退出
process.Close();//關閉調用 cmd 的什么什么
}
catch (Exception ex)
{
throw ex;
}
}
源碼地址
https://github.com/robotbird/donetci
為了防止部分同學無法訪問Github,所以放oschina的gitee上了
https://gitee.com/robotbirdold/donetci
總結
由於這個工具是根據當時的項目管理模式非常定制的,沒有完全產品化的去做,況且現在jenkins已經非常好用了,這個輪子權大家學習(觀摩)使用,如果真的誰有興趣再想把這個輪子用起來,請微信robotbird798聯系我吧,事隔這么多年才把這些東西發出來,初心還是對技術的不舍,在這個公司這么多年被安排着和妥協着從.net開發主管->項目經理->java開發->產品經理->部門經理->? 的曲折之路,忽然發現人生走了很多的彎路,以前把大把的時間和熱情奉獻給公司,如今到了中年危機之時,才發現不過是炮灰,沒有贏得一場戰爭,如今只能收拾殘破的靈魂,重整旗鼓,為自己而戰,為心中那份不滅的理想而戰,前途不知道會怎樣,但又如何呢,只要勤奮不至於不能養家糊口,至少為理想戰斗過。