Jenkins持續整合 & .NET cmd建立日期時間資料夾
最近受累於測試環境每次釋出都很麻煩,而且我們有多個測試環境,因此專門抽時間做了Jenkins的配置和研究。
折騰了兩天終於綠燈以後,先來個截圖,BlueOcean UI還是很nice的。
環境搭建
找一個乾淨點的Build伺服器,然後開始持續整合之旅吧!
- 安裝JDK
我安裝了Oracle的JDK之後貌似傳送郵件SSL方式有些問題,然而網上的方案貌似不能修復。stack上人家推薦安裝openjdk的,我還沒來及折騰,不過全新安裝的話,推薦openjdk吧。
- Jenkins安裝
Jenkins官網下載最新的安裝包,選擇對應的系統。安裝都是無腦的包括啟動,
- 安裝.NET編譯環境
這裡有點彎路!剛開始我也是滿懷期待的想盡量的讓Build伺服器乾淨一些,所以找的是獨立的MSBuild
VS
編譯的我們離不開VS
環境!
獨立的MSBuild
安裝包:下載
當然我的推薦是直接安裝Visual
Studio
,由於我們全部用.NET
4.6.1
所以直接安裝了 Visual
Studio 2015
社群版,儘量少些東西!
以上就是基礎的Build環境了。
配置持續整合Job
Jenkins的強大之處在於,所有的任務可以被拆分成粒度自由的Job。而Job之間可以通過很多方式來組織。例如正常的持續整合流程是:獲取程式碼->Build->單元測試指令碼->釋出到相應環境->自動化測試指令碼->Email報告。這裡的所有步驟可以分拆成單獨的job然後再串起來執行,不過這樣需要很瞭解Jenkins,這不是今天要記錄的。(其實我也沒研究會。。。長路漫漫了)
- 新建Job
Job選擇"自由風格的軟體專案",OK之後General選項卡中預設即可。唯一需要注意的是如果你的多個工程之間有關聯,又或者你有很多工程想放在一起,那麼我建議配置上"自定義的工作空間"。
如圖,我指定了我的工作控制元件是yqnwork,我建立的所有job都這樣設定,那樣原始碼都會被獲取到這裡,之後的工作都在一個根目錄下進行,將大大方便處理。不然坑起來都是填不完的(我爬出來的!!)
- 原始碼管理
獲取程式碼這裡,我選擇的是TFS,TFS不是原生支援的。如果選擇Git/Subversion應該會更方便一些。
安裝完外掛之後,重新編輯job,配置如下:
CollectionURL
Project
path
是相對於集合的專案資料夾路徑,必須要$
開頭,這些配置在VS原始碼管理中都可以自己看到的。
Credentials
也是一個坑!坑了我大半天!務必要新建一個TFS帳號專門用於Jenkins,不然有workspace的衝突風險。我進了一直不能獲取到最新版本的坑,google了半天,最後才發現的!Local
workfolder
&Woekspace
name
根據實際填寫。
- 構建 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伺服器上開啟了代理。
- 附加的任務執行
由於我不想把不同環境的配置檔案也在這個時候生成,被push到相應的環境(我們分QA、STA環境),所以這裡我直接刪掉了生成後的檔案。選擇新增一個windows command的步驟,執行del指令,這裡本來可以用環境變數但是作為del指令的引數出了些問題,所以改用絕對路徑!
關於這些配置檔案我的想法是根據不同環境從TFS中獲取不同的檔案,這點在將來再討論實現。
- 釋出
釋出一般都是使用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命令來測試。
然後回到Jenkins,新增FTP配置:首先安裝外掛Publish over FTP。然後到系統設定中新增FTP帳號。依然提醒注意帳號名稱。
接著回到Job配置FTP:
Source
files
這裡最好點選問號,看看詳細的正則規則,全部資料夾及檔案就配置成**/*
。
我這裡由於我每個專案都publish到指定資料夾,因為帶了字首。然後釋出到伺服器的FTP地址是不需要這些字首資料夾的,因此需要配置Remove
prefix
來移除。
'Transfer Set'我研究了下還有更復雜的功能可以配置,自行研究吧。
- 備份釋出
由於每次釋出都會直接刪掉原來的釋出檔案,因此一般釋出完成之後都會備份一份檔案,這樣做也便於回滾哦~!
備份的話我選擇執行一段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
- 郵件配置
這個功能不提了,配置很簡單,先到系統配置下郵件的傳送伺服器,然後新增一個步驟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: