1. 程式人生 > >Jenkins持續整合 & .NET cmd建立日期時間資料夾

Jenkins持續整合 & .NET cmd建立日期時間資料夾

最近受累於測試環境每次釋出都很麻煩,而且我們有多個測試環境,因此專門抽時間做了Jenkins的配置和研究。

折騰了兩天終於綠燈以後,先來個截圖,BlueOcean UI還是很nice的。

環境搭建

找一個乾淨點的Build伺服器,然後開始持續整合之旅吧!

  1. 安裝JDK

我安裝了Oracle的JDK之後貌似傳送郵件SSL方式有些問題,然而網上的方案貌似不能修復。stack上人家推薦安裝openjdk的,我還沒來及折騰,不過全新安裝的話,推薦openjdk吧。

  1. Jenkins安裝

Jenkins官網下載最新的安裝包,選擇對應的系統。安裝都是無腦的包括啟動,

  1. 安裝.NET編譯環境

這裡有點彎路!剛開始我也是滿懷期待的想盡量的讓Build伺服器乾淨一些,所以找的是獨立的MSBuild

方式,然而後續的過程證明依賴VS編譯的我們離不開VS環境!

獨立的MSBuild安裝包:下載

當然我的推薦是直接安裝Visual Studio,由於我們全部用.NET 4.6.1 所以直接安裝了 Visual Studio 2015社群版,儘量少些東西!

以上就是基礎的Build環境了。

配置持續整合Job

Jenkins的強大之處在於,所有的任務可以被拆分成粒度自由的Job。而Job之間可以通過很多方式來組織。例如正常的持續整合流程是:獲取程式碼->Build->單元測試指令碼->釋出到相應環境->自動化測試指令碼->Email報告。這裡的所有步驟可以分拆成單獨的job然後再串起來執行,不過這樣需要很瞭解Jenkins,這不是今天要記錄的。(其實我也沒研究會。。。長路漫漫了)

  1. 新建Job

Job選擇"自由風格的軟體專案",OK之後General選項卡中預設即可。唯一需要注意的是如果你的多個工程之間有關聯,又或者你有很多工程想放在一起,那麼我建議配置上"自定義的工作空間"。

如圖,我指定了我的工作控制元件是yqnwork,我建立的所有job都這樣設定,那樣原始碼都會被獲取到這裡,之後的工作都在一個根目錄下進行,將大大方便處理。不然坑起來都是填不完的(我爬出來的!!)

  1. 原始碼管理

獲取程式碼這裡,我選擇的是TFS,TFS不是原生支援的。如果選擇Git/Subversion應該會更方便一些。

安裝完外掛之後,重新編輯job,配置如下:

CollectionURL

是TFS URL + 集合名稱!
Project path是相對於集合的專案資料夾路徑,必須要$開頭,這些配置在VS原始碼管理中都可以自己看到的。

Credentials也是一個坑!坑了我大半天!務必要新建一個TFS帳號專門用於Jenkins,不然有workspace的衝突風險。我進了一直不能獲取到最新版本的坑,google了半天,最後才發現的!
Local workfolder&Woekspace name根據實際填寫。

  1. 構建 Build

構建觸發器構建環境根據實際需要填寫,這裡預設即可。

.NET Build需要MSBuild外掛的支援,如果根據前面的環境搭建已經安裝了VS那麼萬事大吉!

安裝完MSBuild Plugin需要配置下預設的MSBuild路徑。在Global Tool Configuration中找到MSBuild節,新增一個配置如下:

注意依然有坑!!! MSBuild的路徑需要根據.NET的版本來決定,.NET 4.5以下的貌似引用的是C:\Windows\Microsoft.NET\Framework64\v4.0.30319中的,4.5以上的才是在圖中的路徑,具體的自己嘗試吧~

回到Job的配置:

選擇剛才配置的MSBuild,注意我這裡是直接釋出Asp.NET MVC專案,所以我Build File的目標是csproj。如果是要編譯整個工程,請選擇對應的sln。
編譯引數根據需要配置。

其中需要說明的是,如果是釋出那麼就按照我這裡來。
publishProfile是釋出的配置檔案,這個建議在VS中手動建立一個配置針對Jenkins的釋出配置,選擇釋出物件為檔案系統,目錄是重點!!!目錄請選擇Build伺服器上對應的目錄,建議還是釋出到workspace中。workspace的目錄可以參看我的workspace目錄

VisualStudioVersion請選擇對應的VS版本!!

這裡我遇到一個坑,由於nuget版本太低導致dll獲取錯誤編譯失敗。手動升級了工程中.nuget目錄下的nuget.exe。(打到這裡vs code死了。。。沒儲存。。。)

另外Nuget由於牆的問題很卡啊,我還手動在Build伺服器上開啟了代理。

  1. 附加的任務執行

由於我不想把不同環境的配置檔案也在這個時候生成,被push到相應的環境(我們分QA、STA環境),所以這裡我直接刪掉了生成後的檔案。選擇新增一個windows command的步驟,執行del指令,這裡本來可以用環境變數但是作為del指令的引數出了些問題,所以改用絕對路徑!

關於這些配置檔案我的想法是根據不同環境從TFS中獲取不同的檔案,這點在將來再討論實現。

  1. 釋出

釋出一般都是使用FTP或者SSH,windows的伺服器自然選擇FTP。由於IIS自帶FTP釋出功能,因此首先配置IIS FTP釋出功能。

先從MS的Microsoft Web Platform Installer中安裝 IIS:FTP釋出服務&IIS:FTP擴充套件性。 然後開啟IIS之後選擇目標網站,右鍵裡會出現新增FTP釋出,配置如下:


建議是啟用虛擬的主機名,這樣便於多個站點的FTP分開維護,當然你可以選擇預設的IP,然後修改成指定的website目錄的FTP,這樣很方便,但是不建議哦!

然後選擇"基本"的身份驗證,授權給指定的賬戶,建議單獨建立一個Jenkins賬戶用來發布!這樣IIS FTP就配置完成了,測是的話可以用command的ftp命令來測試。

如果使用虛擬主機名配置了FTP,訪問時的帳號是 www.demo.com|jenkins!!! 域名 + "|" + 賬戶名

然後回到Jenkins,新增FTP配置:首先安裝外掛Publish over FTP。然後到系統設定中新增FTP帳號。依然提醒注意帳號名稱。

接著回到Job配置FTP:

Source files這裡最好點選問號,看看詳細的正則規則,全部資料夾及檔案就配置成**/*
我這裡由於我每個專案都publish到指定資料夾,因為帶了字首。然後釋出到伺服器的FTP地址是不需要這些字首資料夾的,因此需要配置Remove prefix來移除。

'Transfer Set'我研究了下還有更復雜的功能可以配置,自行研究吧。

  1. 備份釋出

由於每次釋出都會直接刪掉原來的釋出檔案,因此一般釋出完成之後都會備份一份檔案,這樣做也便於回滾哦~!

備份的話我選擇執行一段windows command,直接貼Command:

有關cmd 下建立 資料夾大家可以參考 http://blog.csdn.net/wonder4/article/details/5575234

我這裡的 code 如此下:

E:
cd E:\publish\seven_star\back
set /a TODAY=%date:~0,4%%date:~5,2%%date:~8,2% 
set _TIME=%time:~0,8% 
set CURRENTTIME=%_time::=% 
set CURRENTTIME=%CURRENTTIME: =0% 
set MYDIR=%TODAY%_%CURRENTTIME% 
echo %MYDIR%
mkdir %MYDIR%
xcopy "E:\jenkins\workspace\xxxx\xxx\*.*" "E:\publish\xxx\back\%MYDIR%\" /s /h /d /c /y
::/只保留最近5次的備份檔案,如果不要此功能把下面的刪除
dir /o:-d /b E:\publish\x'x'x\back>temp.txt
for /F "skip=5" %%a in (temp.txt) do @if exist E:\publish\xxx\back\%%a rd /s /q E:\publish\xxx\back\%%a


  1. 郵件配置

這個功能不提了,配置很簡單,先到系統配置下郵件的傳送伺服器,然後新增一個步驟Email Notification就可以了。

workspace目錄

這裡貼一下我的workspace目錄:

bak:我用來存放備份檔案,一會再說。
CodeV2:是對應的TFS上的程式碼路徑
publish:對應各個專案的釋出檔案地址。上邊提到的publishProfile中的目標路徑就是這個。

各個資料夾下,我也是按照專案劃分 Demo1/Demo2/Demo3...

Jenkins外掛手動更新

Jenkins可能受牆的影響更新起來出錯概率非常高,所以建議出錯了直接手動下載。

這個列表裡有所有外掛的安裝包,先找到wiki看下外掛的依賴,下載的時候把依賴也都下載一遍。這裡有個坑是permalink to the latest這個連結下載來的有時候不是最新的,所以最好是手動點最新的!

下載了檔案之後,儲存到Jekins目錄下的plugins,然後重啟Jenkins即可。

另外文章開頭和結尾的截圖都是Jenkins的BlueOcean外掛,這是它的新UI,老的真的有點醜啊。
這個外掛不成功就直接手動吧,安裝了好多回,累!

總結

以上就是整個Jenkins自動化構建的研究,建議每個步驟單獨分解成job配置run成功之後再整合,否則每次跑一遍狠費時。這也是反覆強調的一個workspace,合理資料夾存放的好處之一,否則都沒法單獨拆分成job來測試。文章中有任何問題,歡迎探討指正。

最後來一張success: