最近受累於測試環境每次發布都很麻煩,而且我們有多個測試環境,因此專門抽時間做了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應該會更方便一些。
TFS需要插件支持,Team Foundation Server Plug-in,插件安裝失敗的先看Jenkins插件手動更新章節
安裝完插件之后,重新編輯job,配置如下:
CollectionURL
是TFS URL + 集合名稱!
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:
- 郵件配置
這個功能不提了,配置很簡單,先到系統配置下郵件的發送服務器,然后添加一個步驟Email Notification
就可以了。
workspace目錄
這里貼一下我的workspace目錄:
bak:我用來存放備份文件,一會再說。
CodeV2:是對應的TFS上的代碼路徑
publish:對應各個項目的發布文件地址。上邊提到的publishProfile
中的目標路徑就是這個。
各個文件夾下,我也是按照項目划分 Demo1/Demo2/Demo3...
Jenkins插件手動更新
Jenkins可能受牆的影響更新起來出錯概率非常高,所以建議出錯了直接手動下載。
下載地址是:http://updates.jenkins-ci.org/download/plugins/
這個列表里有所有插件的安裝包,先找到wiki看下插件的依賴,下載的時候把依賴也都下載一遍。這里有個坑是permalink to the latest
這個鏈接下載來的有時候不是最新的,所以最好是手動點最新的!
下載了文件之后,保存到Jekins
目錄下的plugins
,然后重啟Jenkins
即可。
重啟指令是: http://你的Jekins地址/restart
另外文章開頭和結尾的截圖都是Jenkins的BlueOcean插件,這是它的新UI,老的真的有點丑啊。
這個插件不成功就直接手動吧,安裝了好多回,累!
總結
以上就是整個Jenkins自動化構建的研究,建議每個步驟單獨分解成job配置run成功之后再整合,否則每次跑一遍狠費時。這也是反復強調的一個workspace,合理文件夾存放的好處之一,否則都沒法單獨拆分成job來測試。文章中有任何問題,歡迎探討指正。
最后來一張success: