前提條件:
1、必須有兩台服務器,一個是生產環境,另一個是測試環境。
2、兩台服務器上都必須安裝了Jenkins。
3、其中,生產環境上的Jenkins已經開通的CLI的權限(Windows參考:http://www.cnblogs.com/EasonJim/p/6086018.html)。
4、jenkins-cli.jar文件放在"Jenkins\war\WEB-INF\jenkins-cli.jar"。
5、思路參考:http://www.cnblogs.com/EasonJim/p/6086168.html
實現思路:
1、生產環境的Jenkins有兩個工程解壓和還原
2、測試環境的Jenkins有兩個工程部署和回滾
3、測試環境部署工程時先壓縮現有測試站點的包,通過FTP上傳,完成后通過CLI調用生產環境的Jenkins解壓工程進行解壓(解壓之前先備份)
4、測試環境回滾工程時,通過CLI通知生產環境的Jenkins還原工程進行解壓(得到上一次部署時的備份包,還是解壓之前先備份,最后解壓)
具體實現步驟:
1、在生產環境的Jenkins配置一個解壓操作的工程用於部署和一個還原工程用於回滾
解壓:



命令行:
echo [INFO] 備份壓縮操作 call C:\"Program Files"\WinRAR\Rar.exe a -x*\Upload* -x*\ueditor* -x*\UploadFolder* %FilePath%.bak.rar %UnzipPath% echo [INFO] 解壓操作 call c:\"Program Files"\winrar\rar.exe x -ep2 -o+- %FilePath% %UnzipPath%
說明:
先備份再解壓,也就是說每一次操作之前都要備份。
1)部署時,比如上傳的文件名為1.rar,那么備份文件為1.rar.bak.rar。
還原:



命令行:
echo [INFO] 備份壓縮操作 call C:\"Program Files"\WinRAR\Rar.exe a -k -r -s -m1 -x*\Upload* -x*\ueditor* -x*\UploadFolder* -x*\Web.config -x*\DownloadFile* -x*\ErrorLog* -x*\LogFiles* %FilePath%-%BUILD_ID%.restorebak.rar %UnzipPath% echo [INFO] 解壓操作 set "url=%UnzipPath%" call c:\"Program Files"\winrar\rar.exe x -ep2 -o+- %FilePath% %url:~0,3%
說明:
先備份再解壓,也就是說每一次操作之前都要備份。
0)壓縮時我加入了buildid作為參數,避免還原同一個時會重復的問題。
1)回滾時,比如上傳備份的文件名為1.rar.bak.rar,那么回滾操作備份文件為1.rar.bak.rar.restorebak.rar。
2)這里由於上面備份的壓縮包是全路徑的,所以我用字符串切割提取到盤符直接解壓。
2、在測試環境的Jenkins上配置兩個工程,一個是部署,另一個是回滾
部署:
1)先在測試環境上備份要上傳的包
2)使用FTP插件進行上傳到生產環境
3)用CLI調用生產環境的解壓Job進行解壓

命令行:
echo [INFO] 壓縮要上傳的文件,這里已經排除了一些文件 cd D:\wwwroot\ call C:\"Program Files"\WinRAR\Rar.exe a -k -r -s -m1 -x*\Upload* -x*\ueditor* -x*\UploadFolder* -x*\Web.config -x*\DownloadFile* -x*\ErrorLog* -x*\LogFiles* -ag{%BUILD_ID%.push} D:\wwwroot\ move %BUILD_ID%.push.rar %workspace%
說明:由於rar壓縮的時候會帶上全路徑,所以我先cd進入到要備份的文件夾,然后a進行備份,這里要使用-ag參數備份時才是相對路徑,由於ftp插件只能上傳workspade的文件,所以最后把它移動到workspace。
特別說明,我這里的備份都是有規律的,比如:buildid.push.rar
然后是通過CLI遠程命令進行遠程調用生產環境的解壓工程Unzip:

命令行:
echo [INFO] 通過CLI調用公網Jenkins進行解包 java -jar "C:\Program Files (x86)\Jenkins\war\WEB-INF\jenkins-cli.jar" -s http://192.168.1.10:8888/ build Unzip -p FilePath=d:\%BUILD_ID%.push.rar -p UnzipPath=d:\wwwroot --username test --password test
說明:這個就是上面生產環境的解壓Unzip工程,參數是工程約定的
完成!
回滾:
在測試環境上新建還原工程,並增加ProjectName的參數,這個參數指定上面的部署工程,功能為獲得BuildID


命令行:
echo [INFO] 通過CLI調用公網Jenkins進行解包 Setlocal enabledelayedexpansion set url="%ProjectName%" set "buildID=" set url=%url::=/% set url=%url:///=/% set url=%url://=/% for /f "tokens=1,2,3,4,5,6* delims=/" %%a in (%url%) do ( set "buildID=%%f" ) java -jar "C:\Program Files (x86)\Jenkins\war\WEB-INF\jenkins-cli.jar" -s http://192.168.1.10:8888/ build Restore -p FilePath=E:\%buildID%.push.rar.bak.rar -p UnzipPath=E:\wwwroot --username test --password test
說明:上面通過ProjectName的參數獲取BuildID,然后通過CLI遠程調用生產環境的Restore工程,其中%buildID%.push.rar.bak.rar就是部署工程備份的壓縮包,有規律的。
全部完成。
總結:
其實基於FTP上傳的方案也是有回滾操作的!只不過這些接口來回調用通過CLI的形式。
