NET持續整合與自動化部署

來源:互聯網
上載者:User

標籤:director   jenkin   開源   積累   主機名稱   www   下載   osi   項目配置   

https://www.cnblogs.com/hunternet/p/9590287.html

相信每一位程式員都經曆過深夜加班上線的痛苦!而作為一個加班上線如家常便飯的碼農,更是深感其痛。由於我們所做的系統業務複雜,系統龐大,設計到多個系統之間的合作,而核心系統更是採用分布式系統架構,由於當時對系統劃分的不合理等等原因導致每次發版都會設計到多個系統的發布,小的版本三五個,大的版本十幾個甚至幾十個系統的同時發布!而我們也沒有相應的基礎設施的支撐,發版方式更是最傳統的,開發人員將發布包發給營運人員,由其講各個發布包一個一個覆蓋到生產環境。因此每次上線僅僅發版就需要2-3個小時。這種方式不僅僅耗時、耗力,更是由於人工操作經常導致一些丟、落的現象。而我們當時的測試也是採用純手工的測試,發版完畢後一輪迴歸測試就需要3-4個小時(當時主要是手工測試)。之前也一直提倡持續整合、自動化的測試和營運,但遲遲沒有推進落地。終於在一個加班到淩晨四點的夜晚後,我再也受不了。回家後躺在床上遲遲睡不著,心想這個自動化的發布能有多難,他們搞不了,老子自己搞,於是6點爬起來來到公司,正式開始了我的持續整合、自動化部署的研究與推進之路。

一、初識Jenkins
由於之前亦沒有相關知識的積累,因此也是對如何?也是一頭霧水。於是只能找度娘,關鍵字"自動化發布"。搜尋到很多工具和方法,但都是以Java平台居多,.net平台相關資料不多。其中以Jenkins介紹較多,微軟也提供一套自動化部署的方式,也有一些其他持續整合工具可以實現自動化的發布,但最終還是選擇了Jenkins。主要有以下幾個原因:

代碼開源、外掛程式豐富完善、系統穩定
社區活躍,成功實踐和網上資源較為豐富
安裝配置簡單
web形式的可視化的管理頁面

  1. Jenkins是什麼
    Jenkins是一個開源軟體項目,是基於Java開發的一種持續整合工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平台,使軟體的持續整合變成可能。

持續整合:
持續整合是一種軟體開發實踐,即團隊開發成員經常整合他們的工作,通過每個成員每天至少整合一次,也就意味著每天可能會發生多次整合。每次整合都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而儘早地發現整合錯誤。

2.Jenkins能幹什麼
眾所周知,工業革命解放了人類的雙手,使得人們避免了很多重複性的工作,而Jenkins能協助開發測試營運人員解決很多重複性工作,我們可以將一些重複性的工作,寫成指令碼,如:代碼提交,執行單元測試,程式的編譯、構建、發布等封裝成指令碼,由Jenkins替我們定時或按需執行。事實上Jenkins的眾多外掛程式就是如此,究其根本就是執行一個或多個windows或linux命令來完成我們的需求。

3.Jenkins的一個工作流程
通過對Jenkins的簡單瞭解後,對完成自動化發布有了大致思路,如為Jenkins的一個工作流程

image

思路已經有了,接下來就是針對此流程,一步一步簡單實現.NET Web應用程式基底於Jenkins的自動化部署。

二、Jenkins 安裝
Jenkins有windows版本也有linux版本,由於我們項目都是基於.net freamwork進行開發,而jenkins構建需要編譯.net程式,為了更方便的編譯,因此選擇安裝windows版本。

1.下載
可從Jenkins官網https://jenkins.io/download/下載windows安裝包。

2.安裝
下載完成後,可按照提示進行安裝即可。(windows下傻瓜式安裝,注意Jenkins是java開發,因此需先安裝對應jdk版本)

3.配置
安裝完成後會自動安裝並啟動一個windows服務,名為Jenkins,開啟瀏覽器localhost:8080(Jenkins預設連接埠號碼為8080,如需修改可開啟Jenkins安裝目錄找到Jenkins.xml修改其中連接埠,然後開啟服務重啟Jenkins服務即可)之後按照提示進行配置即可!配置完成後看到如下介面代表安裝成功!

image

整個安裝過程非常簡單,基本上是傻瓜式按照提示操作即可,期間並未遇到問題,基本上10分鐘左右就搞定了!接下來將介紹如何按照上述流程實現.NET下Jenkins的持續整合與自動化部署!

三、通過SVN擷取原始碼
1.安裝外掛程式
根據我們的思路,首先要做的就是擷取到我們的原始碼。由於我們公司使用的原始程式碼控制工具主要是SVN因此在這裡主要介紹SVN的方式方法。根據度娘的指引,我們需要安裝一個SVN的外掛程式:Subversion Plug-in(如果:安裝Jenkins時選擇的安裝推薦的外掛程式,則Jenkins會直接給安裝上這個外掛程式,無需自己安裝)。

2.項目配置
安裝外掛程式後,選擇建立一個自由式饒舌的軟體項目,起個名字,進入到項目配置後,找到原始程式碼控制選項:

image

主要有以下幾個選項需要配置:

Repository URL:要擷取的SVN的路徑,如:https://127.0.0.1:9666/svn/HS.Mall/SoureCode/Trunk/Test

Credentials:配置SVN使用者名稱和密碼

Ignore externals:是否忽略SVN外部參考(這個很重要,稍後會用到,關於SVN外部參考,可自行百度)

Additional Credentials:當你的SVN版本庫使用外部參考關聯其它版本庫是這個就很重要了

Realm:填寫SVN伺服器的地址

https://127.0.0.1:9666 VisualSVN Server //(注意這個格式)
Credentials:填寫SVN使用者名稱和密碼資訊

其它一些選項直接按照預設值就可以,關於每一項的詳細介紹可以點擊後面的小?號查看。

配置完成後點擊儲存後,構建該項目查看結果。若能夠將原始碼更新至Jenkins的工作空間內,則代表配置成功!

四、通過MSBuild編譯應用程式
1.安裝外掛程式與環境
編譯.NET應用程式可通過微軟提供的MSBuild工具,先安裝外掛程式:MSBuild。(注意:Jenkins伺服器需安裝MSBuild,建議在Jenkins上安裝VS開發工具,可以在構建出問題的時候開啟VS調試,省去很多不必要的麻煩)。

2.全域配置
外掛程式安裝完畢後,進入系統管理->全域工具配置(ConfigureTools)找到MSBuild配置選項:

image

Name:自己起個名字
Path to MSBuild:MSBuild.exe程式的實體路徑
注意:此處MSBuild.exe必須與程式所使用freamwork版本相對應,此處我在這就遇到了一個大坑,一開始隨便找個一個MSBuild工具,沒想到根本編譯不了C#6.0的文法。建議直接指向visual studio安裝目錄內的MSBuild.exe,可以避免很多問題。如VS2017在:Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin路徑內。

3.項目配置
開啟我們之前建立的項目,找到構建選項->增加構建步驟->Build a Visual Studio project or solution using MSBuild

image

Name:選擇全域MSBuild配置的名稱

MSBuild Build File:填寫我們的要構建的項目.csproj檔案,所相對工作的路徑。如:/Test.csproj

Command Line Arguments:MSBuild的參數如:/t:Rebuild /P:Configuration=Release /p:VisualStudioVersion=14.0 /p:DeployOnBuild=True;PublishProfile=Test.pubxml

/t:Rebuild 重建

/p:Configuration=Release Release 產生模式
/p:VisualStudioVersion=14.0 指定子工具集(VS2015為14.0,2017為15.0),不設定會報錯
/p:DeployOnBuild=True;PublishProfile=Test.pubxml 使用 Test.pubxml 發布檔案來發布項目 .pubxml檔案可在VS發布時配置,位於Properties檔案夾內。

配置完成後,點擊構建,查看控制台資訊,如能構建成功,則代表我們的配置無誤!

4.遇到的問題
原以為按照度娘的一系列解決方案能夠很順利的構建,可是在連續失敗了幾十次之後,才明白遠遠沒有那麼簡單。期間主要遇到幾個問題:

MSBuild版本不對導致構建不了C#6.0的文法
Jenkins 是講版本庫原始碼更新到自己的工作空間內,再執行後續的構建工作。我們的程式很不規範,其中引用了許多不屬於自己版本庫的第三方依賴包,和一些自己開發的公用庫,當時這些第三方包和公用庫放在我們SVN的另一個版本庫裡進行管理,因此在構建的時候導致很多程式集找不到引用。
關於問題1:上面已經提過,只需要找到對應版本即可

而問題2:一開始找了很多資料也沒有找到解決方案,後來還是從原始程式碼控制上找到了方案。

方案1:

借鑒Nuget的思想,使用Nuget伺服器管理我們自己開發的一些公用依賴庫。關於Nuget管理依賴的文章在另一篇部落格裡。

方案2:

就是上面提到的SVN 外部參考,當時也是走投無路,於是瘋狂翻譯Jenkins的這些英文解釋,在翻譯到SVN外掛程式的Ignore externals時,找到了這種方案,就是SVN可以設定外部參考,這樣在更新版本庫的時候就可以把依賴的版本庫也更新下來,然後Jenkins SVN外掛程式把這個Ignore externals選項去掉,然後在Additional Credentials選項裡填上所依賴版本庫的SVN配置,就能夠把這些依賴也更新到SVN工作空間內。以上兩個問題解決後,基本沒有遇到太難的問題。由此可見我們的原始程式碼控制的科學、規範是多麼的重要。

幾十次的構建失敗,一堆亂七八糟的引用是多麼痛的領悟!

五、通過Ftp發布至應用伺服器
構建成功後,Test.pubxml會指定發布的包的路徑(最好是放到工作空間下),按照思路,接下來就是要想辦法把發布包Copy到應用伺服器的根目錄下。由於我們的應用伺服器都是windows系統,因此不能像linux系統一樣通過ssh遠程Copy過去,當時能想到的就是使用Ftp直接上傳到應用伺服器。

1.安裝外掛程式與環境
Jenkins 安裝外掛程式Publish Over FTP,應用伺服器上需開啟Ftp。

 2.全域配置
系統管理->系統配置下找到Publish over FTP配置項

image

Name:起個名字,後面項目配置裡會用的到
HostName:Ftp主機名稱(連接埠號碼預設21,在進階裡面可以改)
Username:Ftp使用者名稱
Password:Ftp密碼
3.項目配置
開啟我們之前建的項目,找到構建後操作->增加構建後操作步驟->Send build artifacts over FTP

image

Name:選擇全域配置裡的
Source files:選擇你的發布包路徑(這裡是相對於工作空間的路徑)
Remote directory:放到遠端哪個路徑裡(這裡是相對於Ftp根目錄的路徑)
配置完成後,點擊儲存,構建即可!

六、結束語
如上,就基本實現了我們的自動化發布的需求,這期間從早晨六點開始,差不多中午就完成了,當然也並不像上面介紹的那麼簡單,期間也遇到了許多問題,構建了大概一百多次,才最終成功了第一次。本文主要介紹實現自動化部署的一種基本的思路,當然還有很多方案可以實現我們的需求,甚至不僅僅局限於Jenkins。而這種方案其中也有許多細節的地方在文章中沒有提到,如:如何?自動化的Nunit單元測試,如何定時構建......,因為當時我在完成之後也給我的團隊成員提供了一個非常詳細的配置文檔,並且培訓了很多次,但事實證明,講的越詳細越會限制他們自己的主動思考與動手的能力。這也導致了後來我去做其他工作的時候,我們將近一年的時間還是停留在我這半天的研究結果的層面上,而生產環境更是遲遲沒有使用。其實思路才是最重要的,有了思路我們就可以通過各種方式來解決我們的問題,還是建議大家注重解決問題的思路,多動手,自己實踐,才能學得更透!關於.NET 平台下Jenkins實現持續整合與自動化部署的落地與實現的問題與討論,可以在文章下留言。

NET持續整合與自動化部署

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.