又到一年國慶,終於有了難得的幾天空閒,計劃陪陪媳婦娃子,再把最近閱讀的幾本相關書總結梳理下。當然,計劃總是美好的,於時接到了一個老朋友電話。大意是他搞了一個.net小網站,部署了4個節點,每次更新程式都是手動複製到4個機器,時不時忘記部署,忘記備份之類的問題,不勝其煩,希望我幫忙想個辦法。回想2年前,在做無人貨架專案時,也有部分是.net專案,當時自己也沒能處理這個問題,當時用了webdeploy,效果並不理想,雖然後來幾乎沒碰過.net了,這個問題依然縈繞心頭。既然有時間,有報酬,何不接此機會彌補兩前年的遺憾呢,於時滿口應承了下來。想想現在都在談CI/CD, DevOps.. 過程應該會是相當愉悅的,又是小網站,要求也不是那麼高。網站結構如下,非常簡單。
01
還是jenkins
百度一番,一搜一大把,幾乎都是利用jenkins,加上之前有過用jenkins做tomcat自動化部署的經驗,心中一陣竊喜,過程真的如預期一般順暢。於時動手,開始了我們愉悅之旅。jenkins是基於Java開發的一種持續整合工具,於時先安裝java環境,配置環境變數(我是直接下載 window版本的 jdk 8)。接著下載window對應的jenkins版本,下載地址點這裡,按提示操作,安裝推薦外掛(安裝後也可以外掛管理中自行安裝),沒有注意事項!一波流帶走,就來到了歡迎介面。沒有任何障礙,感覺半天就可以打卡收工。因為要編譯.net程式,需要安裝msbuild外掛:以次 “Manage Jenkins” -> "Manage Plugins" -> "可選外掛", 搜尋 MsBuild,點選直接安裝。操作如下圖。
接著 “Manage Jenkins” -> "System Configuration" -> "Global Tool Configuration" 中配置 MSBuild,因為MSBuild外掛中自帶的編譯工具可能比較老,建議在本機安裝 visual studio 相同版本,直接使用其自帶的編譯工具。配置如下
接著,安裝git服務,並在 “Manage Jenkins” -> "System Configuration" -> "Global Tool Configuration" 中配置 git 相關引數,配置如下。
再接著,安裝外掛 Publish Over SSH。然後在應用程式機器上安裝FreeSSHD,用於檔案上傳和遠端執行命名。FreeSSHD 配置過程如下:
1,新增使用者jenkins,
2,配置telnet, ssh 埠為 23,28;
3,配置 authentication 目錄, 在jenkins伺服器,生成ssh key,把公鑰檔案複製到這個目錄,重新命名為jenkins,與使用者名稱相同。(使用命令 ssh-keygen -t rsa 生成公鑰,私鑰 )
4,配置sftp 目錄,為檔案上傳目錄。
5,以管理員身份執行 FreeSSHd。這個很重要,不然一直提示 auth fail.
操作步驟如下圖:
接著,在 “Manage Jenkins” -> "System Configuration" -> "Global Tool Configuration" 中配置Publish Over SSH 相關引數,配置如下。
在jenkins和應用服務上安裝 7Z工具,用於壓縮和解壓。並在環境變數 path 中配置 7Z的安裝目錄(用於在任意目錄執行命令)。到這裡系統工具及配置就完成了,接下來開始任務配置。
02
愉悅的構建
環境搭建完成,就開始我們的表演吧。新建任務,名稱你隨意就好,選擇“Freestyle project”型別,點選確定。進入任務配置介面。
General 配置中,可以選中 Discard old builds 可以配置以天數和build記錄數保留資料。
原始碼管理中,新增好指定的git地址,及賬號密碼。以上流程沒有任何障礙。
構建中,新增步驟Execute Windows batch command,使用者nuget restore。因為前面已經在jenkins機器上安裝了visual stadio ,可以直接使用其自帶的nuget 工具。 配置如下圖,其中 nuget.bat的內容如下:
NuGet.Build.Tasks.Console.exe restore VideosGYFileS.sln。其中 NuGet.Build.Tasks.Console.exe 為VS自帶的,在path中配置了目錄這裡可以直接執行。(這個命令是在解決方案根目錄執行的。),命令最後為exit 0 表示結束。
接著新增步驟 Build a Visual Studio project or solution using MSBuild,選擇第一步中新增的 MSBuild 配置,如下圖,其中編譯引數為:
/t:Rebuild /property:Configuration=Release;DeployOnBuild=true;TargetFrameworkVersion=v4.6。
接著新增步驟Execute Windows batch command,用於打包編譯後的檔案,方便後面上傳。壓縮時需要排除一些配置檔案,配置如下圖,compress.bat檔案內容如下:
7z a deploy.zip .\PrecompiledWeb\Web\* -xr!upload -xr!logs -x!web.config。 (.\ 表示打包時去除字首, -xr! 表示排除目錄,-x! 表示排除檔案)
到這裡,構建選項就已經配置完成了,開始構建,在解決方案目錄生成了deploy.zip檔案。那說明已經成功了70%了。
03
完美的構建後操作
構建完成,接下來就是把檔案上傳到目標伺服器了。這就是要用到我們前面配置的 Publish Over SSH外掛了。 新增構建後步驟,選擇Send build artifacts over SSH。並新增第一步中建立的 應用伺服器。多個伺服器,可以新增多個server。要傳輸的檔案為構建步驟中生成的檔案 deploy.zip,上傳後要執行的命令為:cmd.exe /c "d: && cd wwwroot && backup.bat" 中 backup.bat 完成檔案備份以當前時間生成備份檔案放到 backup資料夾中。檔案內容如下;
set vardate=%date:~0,4%%date:~5,2%%date:~8,2% set h=%time:~0,2%
# 格式化小時,如果小時10,補0,不然會有空格
set h=%h: =0% set otime=%h%%time:~3,2%%time:~6,2%
# 備份檔案格式 YYYYMMddHHmmss.zip
set filename=%vardate%%otime%.zip # 備份原檔案 7z a %filename% .\gyapp\* -x!deploy.zip -xr!upload -xr!logs # 移動檔案到backup 資料夾 move %filename% .\Backup # 解壓檔案 7z x deploy.zip -aoa -o"D:\wwwroot\gyapp"
最後來一張構建成功的截圖。
到這裡所有配置就完成了,如果順利的話,自動化部署就完成了。鑑於本人能力問題,自到第79次構建,才真正愉快的左打收工了。沒錯,是79次!
04
結語
文章到這裡,我只想說,這個過程真的不怎麼愉悅。整個過程需要用到方方面面的知識,比如構建過程,環境變數配置,編寫bat檔案等 。也有很多異常問題,比如sshkey 版本問題,bat中時間格式問題等等。也要用到一些工具軟體,比如7Z,FreeSSHD,jenkins。再者也有很多細節要考慮,比如備份檔案,排除檔案等。再有前面說的,百度一下,一搜打把的文章,大部分並無太多用處,很多都只是demo。比如,大部分都有說所到用ftp,但是無法支援子目錄傳輸。以上種種問題,多次要奔潰放棄,怎奈受人之託,忠人之事,還好媳婦一直鼓勵,並帶著大寶小寶玩耍。最後斷斷續續用了幾天時間,整體來說還是痛苦並快樂著。想著過程中那麼問題,就想著整理成文,希望有需要的人看到本文,真的可以半天搞定。
I have a dream to be a good programmer。