Jenkins測試環境到生產環境的一鍵部署策略(Windows)
一、前言
前面我們已經初步實現了開發集成環境、測試環境的持續集成(自動化構建、自動化測試、自動化部署)。但生產環境自動化部署遲遲沒有推進。其原因主要在以下幾個方面:
- 尚未實現部署之前的自動化備份
- 尚未實現部署出現問題后的自動化回滾
- 由於之前采用FTP上傳部署需要生產環境開放FTP端口存在安全性問題且FTP會因為各種的網速問題,導致站點瞬間掛掉
只要解決以上三個問題,我們就可以初步實現生產環境的自動化部署。
系列文章
二、實現思路
- 利用Jenkins分布式的特性,其中Jenkins服務器作為Master服務器,將生產環境(可以一台也可以多台服務器)作為Jenkins集群中的一台Slave服務器。
- 測試環境應該模擬和生產環境的配置和編譯版本保持是Release狀態,且功能已經滿足預期發布需求。
- 通過文件復制插件,復制測試環境上的部署文件到生產環境上的jenkins工作空間。
- 通過批處理處理不需要覆蓋的文件或者臨時要修改的配置等。
- 利用rar備份生成環境上即將要覆蓋的文件,注意命名上遵循一定規律:項目-文件夾-{BuildID}.bak.rar或日期-項目-文件夾-{BuildID}.bak.rar。
- 利用批處理進行從jenkins工作空間上把文件復制到站點上,常用命令:xcopy。
- 若生產環境程序出現問題,由項目經理和運維人員決定是緊急修復bug還是啟用回滾,回滾則采用批處理命令將備份的文件壓縮回生產環境站點下的目錄內。
通過以上策略可以實現測試環境到生產環境的一鍵部署,實現了部署前的自動化備份,出現問題的自動化回滾,利用Jenkins Master-Slave特性解決了需要開放FTP端口的的問題,並且將先在測試站點測試好的文件,復制到正式站點上的一個緩沖區,進行預熱配置,之后在本機進行文件替換,速度是相當的快,解決了FTP上傳過程中網絡問題導致站點掛掉的問題。
缺陷與問題:
- 生產環境需作為Jenkins 集群中的一台服務器並承擔一部分構建任務,但通過配置此問題可忽略不計
- 生產環境需安裝JDK並開啟一個Java服務
- 待發現
三、生產環境拓撲圖

四、所需Jenkins插件
- Copy data to workspace plugin 插件
- Copy Artifact Plugin
- Node and Label parameter plugin 插件
五、實現步驟
- 搭建slave
1.1 Jenkins系統管理-->管理節點-->新建節點
!

1.2 輸入節點名稱,next,配置如下圖

其中,有如下幾點需要注意:
-
【# of executors】根據CPU的個數來填寫數量
-
【遠程工作目錄】這個就是用來存放master到slave時,存放的臨時目錄,如slave的服務軟件也會放在此,並且會以每個job名稱來區分開
-
【用法】只需要選擇【只允許運行綁定到這台機器的Job】這種模式下,Jenkins只會構建哪些分配到這台機器的Job。這允許一個節點專門保留給某種類型的Job。例如,在Jenkins上連續的執行測試,你可以設置執行者數量為1,那么同一時間就只會有一個構建,一個實行者不會阻止其它構建,其它構建會在另外的節點運行。通過這個配置生產環境就可以僅做自己的構建。
-
【啟動方式】只需要選擇【Launch agent via Java Web Start】,以服務的方式啟動,應用最廣且最好配置,其余的都太復雜,不建議使用。注意:2.x版本的默認沒有這個選項,需要單獨開啟。其余的基本按照上面默認選擇即可。
Launch agent via Java Web Start開啟方式:
Jenkins-->系統管理-->Configure Global Security-->Agents-->修改為隨機選取



1.3 點擊保存后,master上已經配置好節點,那么接下來就是到節點的服務器上安裝slave的服務:
點擊右側列表的節點服務器,此時節點並未連通。

進入詳情頁面,會提示你如何安裝服務:

注意:由於Slave服務為Java服務,因此Slave服務器上需安裝JDK
當Slave服務器上出現以下服務時代表安裝並連接成功

此時回到Jenkins 服務器上查看狀態已經連接上

說明:這里只介紹基於現有需求的一種策略,關於Jenkins Master-Slave連接機制與原理不多做介紹,網上關於這方面的介紹也很多,大家可以自行搜索。
- 創建生產環境自動化部署任務
2.1 參數化配置選擇Slave構建
Jenkins 新建自由風格的軟件項目

參數化構建-->添加參數-->選擇node

若沒有此參數安裝Node and Label parameter plugin 插件
參數化配置可按下圖進行,也可根據需要自行配置

2.2 文本復制
文本復制可選擇兩個插件
Copy data to workspace plugin 插件
可以復制Jenkins Master服務器的文件到Slave工作空間內
缺點:不支持參數化
Copy Artifact Plugin 插件
可以實現Jenkins Slave-Slave Master-Slave之間的復制,可以將一個Job構建后的生成物復制到當前工作空間內
缺點:需再要復制的Job內內配置Archive the artifact
可以根據所需自行選擇插件,這里為了能夠參數化我們選擇Copy Artifact Plugin插件

配置說明:
- Project name:要Copy的項目名稱,這里可以使用參數化
- Which build:選擇那一次構建后的產物,一般可以選擇Latest successful build
- Stable build only:是否選擇穩定的構建
- Artifacts to copy:要Copy的文件,可以進行規則匹配,如Test/**/*,即Test文件夾下所有文件
- Artifacts not to copy:根據規則排除某些文件
- Target directory:本地工作空間的那個文件夾內
- Parameter filters:這里沒用到,用到的話,可以自己看說明
注意:這里需要前置Job配置
在要復制的Job內增加構建后操作如下圖:

2.3 自動化備份
填寫備份的批處理,這里可以使用WindowsRAR的壓縮命令,所以如果要用RAR的時候,確保機器上已經安裝WindowsRAR。注意名稱必須要有規則且每次構建不能重復,因此可以使用項目名稱+BuildID或者日期+項目名稱+BuildID

//自動備份批處理命令
start c:\"Program Files"\winrar\rar.exe a -k -r -s -m1
-ag{HS.Shop.My-%BUILD_ID%.bak} {要備份到的文件夾} {要備份的文件夾}
2.4 覆蓋站點目錄下的文件
備份完成后將Jenkins工作空間下的文件復制到站點目錄下,此時必須保證發布包已經排除掉了不需要覆蓋的文件,並且是穩定可用的版本。批處理命令可采用xcopy命令。關於xcopy命令的使用可以自行百度

xcopy {slave工作空間上的項目文件夾} {要復制到替換的文件夾} /Y/E
到了這一步就完成了生產環境的自動化部署的任務配置。點擊構建即可完成測試環境到生產環境的一鍵部署。此時若程序出現問題可以采用緊急修復或者自動化回滾。
- 創建生產環境自動化回滾任務
3.1 同樣新建一個自由風格的軟件項目
這里可以配置兩個構建參數
1.回滾哪一個項目的哪一次構建
2.回滾哪一台服務器的構建(可以多台)
參數化配置可見下圖

3.2 自動化回滾批處理

Setlocal enabledelayedexpansion
set "projectKey=ChioceBuild"
set "bakUrl=D:\HS.Shop.Bak\HS.Shop.My\" //備份文件的路徑
set url="%ChioceBuild%" //參數
set "rollbackUrl=D:\"
set "projectName="
set "buildID="
set url=%url::=/%
set url=%url:///=/%
set url=%url://=/%
for /f "tokens=1,2,3,4,5,6,7,8* delims=/" %%a in (%url%) do (
set "projectName=%%g"
set "buildID=%%h"
)
set projectName=!projectName:%projectKey%=!
set "fileName="
for %%a in (%bakUrl%%projectName%-%buildID%.bak.rar) do (
set "fileName=%%a"
)
c:\"Program Files"\winrar\rar.exe x -ep2 -o+- %fileName% %rollbackUrl%
點擊保存即可完成自動化回滾任務的建立,點擊構建選擇參數即可進行回滾。
六、結束語
Jenkins是一個持續集成工具,其功能非常強大,可以幫助我們做自動構建、自動測試、自動發布等等,它根據不同的需求實現各種各樣的功能,它可以最大幅度的減少我們日常工作中重復性的工作。以上僅僅是我根據當下所需研究的一種使用策略,可能有漏洞,也可能存在問題,但如果不願意嘗試着去改進現有流程,去接受新的東西,那么我們永遠不會進步。而我對其使用的了解也不過是九牛一毛,大家可以根據需求研究制定自己的使用策略。
最后希望大家:即使搬磚,也要搬出藝術感!做一個有追求的搬磚者!
