前言
在互聯網時代,對於每一家公司,軟件開發和發布的重要性不言而喻,目前已經形成一套標准的流程,最重要的組成部分就是持續集成(CI)及持續部署、交付(CD)。
本文基於Jenkins+Docker+Git\Svn實現一套CI自動化發布流程,同時支持撤回。
一、發布流程設計

工作流程:
- 開發人員提交代碼到Git或Svn版本倉庫;
- Jenkins人工/定時觸發項目構建;
- Jenkins拉取代碼、代碼編碼、打包鏡像、推送到鏡像倉庫;
- Jenkins在Docker主機創建容器並發布。
二、環境設計
1、服務器部署信息
| 服務器 | 主機名 | IP | 運行服務 |
|---|---|---|---|
| jenkins服務器 | jenkins | 10.0.xxx.100 | 安裝docker、 運行jenkins容器、git客戶端、jdk、maven |
| docker服務器 | docker | 10.0.xxx.103 | 安裝docker、創建鏡像運行java項目:bsm |
| Git和私有倉庫服務器 | git_registry | 10.0.xxx.104 | 安裝docker、git服務、運行registry私有倉庫容器 |
2、版本信息
| 名稱 | 版本 | 軟件包 | 說明 |
|---|---|---|---|
| 服務器 | Centos 7.4 | 無 | linux系統 |
| docker | 17.12.0-ce | yum安裝 | docker引擎服務 |
| jdk | 1.8.0_45 | jdk-8u45-linux-x64.tar.gz | 運行jenkins需要的JDK環境 |
| maven | 3.5.0 | apache-maven-3.5.0-bin.tar.gz | 構建java項目需要的工具 |
| jenkins | 最新版本 | docker hub下載最新jenkins鏡像 | 持續集成工具 |
| registry | 最新版本 | docker hub下載最新registry鏡像 | docker私有倉庫 |
jdk官方下載地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html
maven官方下載地址:https://maven.apache.org/download.cgi
jenkins官方鏡像地址:https://hub.docker.com/_/jenkins/
registry官方鏡像地址:https://hub.docker.com/_/registry/
3、操作系統信息
CentOS7.4
三、部署Git或Svn倉庫
在【git_registry】主機安裝r。
具體方法請參考網上教程
四、部署Jenkins
在【jenkins】主機安裝Jenkins。
安裝方法請參考:https://www.cnblogs.com/caoweixiong/p/12306340.html
五、安裝Docker
在【jenkins、docker、git_registry】3台主機安裝Docker。
安裝方法請參考:https://www.cnblogs.com/caoweixiong/p/12186736.html
六、部署私有鏡像倉庫
Docker Hub作為Docker默認官方公共鏡像;這里搭建私有鏡像倉庫,官方也提供registry鏡像,使得搭建私有倉庫非常簡單。
在【git_registry】主機上搭建私有鏡像倉庫,具體方法請參考:https://www.cnblogs.com/caoweixiong/p/12197602.html
七、構建Tomcat基礎鏡像
項目需要使用tomcat,這里使用Dockerfile來制作鏡像。
具體方法請參考:https://www.cnblogs.com/caoweixiong/p/12230725.html
八、Jenkins配置全局工具配置
- 主頁面 -> 系統管理 -> 全局工具配置
指定JDK、Git、Maven路徑:


如果Jenkins主機沒有git命令,需要安裝Git:
# yum install git -y
九、Jenkins安裝必要插件
- 主頁面 -> 系統管理 ->管理插件:

安裝SSH與Git Parameter插件。
插件說明:
- SSH:用於SSH遠程Docker主機執行Shell命令
- Git Parameter:動態獲取Git倉庫Branch、Tag
- 配置SSH插件
第一步:先創建一個用於連接Docker主機的憑據。
主頁面 -> 憑據 -> 系統 -> 右擊全局憑據 -> 添加憑據:


第二步:添加SSH遠程主機
主頁面 -> 系統管理 -> 系統設置 -> SSH remote hosts:

十、Jenkins創建項目並發布測試
自己准備1個web項目,我這里的項目名字為bsm,通過svn管理代碼。
- 主頁面 -> 新建任務 -> 輸入任務名稱,構建一個Maven項目

注意:如果沒有顯示“構建一個Maven項目”選項,需要在管理插件里安裝“Maven Integration”插件。
- 設置參數化構建過程:

- 設置源碼管理

注:這里使用svn管理源碼
- 設置maven構建命令選項:

利用pom.xml文件構建項目。
- 在Jenkins本機,構建鏡像並推送到私有鏡像倉庫:

上述命令說明:
- 根據參數 type 來判斷是部署還是撤回;
- 部署項目:創建Dockerfile文件,使用當前編譯序號做為鏡像的版本號;
- 基於私有鏡像倉庫的 tomcat 鏡像;
- 先刪除webapps目錄下的war包;
- 將jenkins編譯好的war包,復制到tomcat鏡像中的webapps目錄下
- 啟動tomcat
- 部署項目:構建鏡像;
- 部署項目:上傳鏡像到私有倉庫;
- 部署項目:刪除本地鏡像;
- 撤回項目:什么也不做;
- 在Jenkins本機,通過SSH遠程連接到Docker主機,下載並使用推送的鏡像創建容器

上述命令說明:
- 根據參數 type 來判斷是部署還是撤回;
- 部署項目:獲取當前編譯版本號,從私有鏡像倉庫下載鏡像進行部署;
- 停止容器;
- 刪除容器;
- 刪除本地歷史鏡像
- 啟動容器,並暴露端口
- 撤回項目:參數【version】為空,默認返回到上一版本;
- 撤回項目:參數【version】不為空,撤回到指定版本;
- 部署項目:刪除本地鏡像;
- 撤回項目:什么也不做;
- 選擇tag,開始構建:

注:type=deploy,部署項目;type=rollback,撤回項目




十一、驗證
瀏覽器訪問bsm項目:http://10.0.xxx.103:8888

參考:
