Docker+Jenkins+Maven+SVN搭建持續集成環境
環境拓撲圖(實驗項目使用PHP環境)
發布流程圖
環境說明
- 系統:Centos 7.4 x64
- Docker版本:18.09.0
- Maven版本:3.6
- Tomcat版本:8
- JDK版本:1.8
- Jenkins版本:2.7
- SVN版本:1.7.14
- 管理節點Jenkins/SVN:192.168.1.79
- 測試節點:192.168.1.78
- 生產節點:192.168.1.77
應用環境部署
1、管理節點:SVN安裝配置及簡單使用
1.1、安裝SVN服務
yum -y install subversion
1.2、創建SVN目錄
mkdir /home/svn
1.3、創建SVN倉庫名為repos
svnadmin create /home/svn/repos
1.4、修改repos庫內主配置文件
vi /home/svn/repos/conf/svnserve.conf
# none設置不允許匿名訪問 anon-access = none # 認證為可寫 auth-access = write # 密碼數據庫文件為passwd password-db = passw # 認證數據庫文件為authz authz-db = authz
1.5、修改passwd文件 添加用戶
vi /home/svn/repos/conf/passwd
# 用戶管理 [users] # 用戶名為test。密碼123456。 test = 123456
1.6、修改authz文件 賦值創建用戶權限
vi /home/svn/repos/conf/authz
# 創建倉庫目錄“/”權限 [repos:/] # 賦值test 讀寫權限 test = rw
1.7、啟動SVN服務
svnserve -d -r /home/svn
注:倉庫地址 svn://192.168.1.79/repos
2、客戶端:連接SVN創建文件
2.1、 windos 連接SVN 輸入密碼
2.2 repos 文件夾下創建index.html
2.3、文件已html后綴的網頁文件
index.html文件內容:<h1>repos</h2>
2.3、提交代碼
3、部署Docker鏡像倉庫
注:保證所有節點都提前安裝好Docker應用
3.1、管理節點:下載安裝鏡像倉庫
docker run -d \ -v /opt/registry:/var/lib/registry \ -p 5000:5000 \ --restart=always \ --name registry \ registry

命令:docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dba32d8c784d registry "/entrypoint.sh /etc…" 4 minutes ago Up 4 minutes 0.0.0.0:5000->5000/tcp registry
3.2、管理節點:在部署節點配置Docker可信任私有倉庫:
vi /etc/docker/daemon.json
{"registry-mirrors": ["http://04be47cf.m.daocloud.io"],"insecure-registries":["192.168.1.79:5000"]}

命令:curl http://192.168.1.79:5000/v2/_catalog {"repositories":[]}

命令:curl http://192.168.1.79:5000/v2/lnmp-nginx/tags/list {"name":"lnmp-nginx","tags":["base"]}
3.3、測試節點:整理Dockerfile(提前整理好的LNMP環境包)
Dockerfile-lnmp/ ├── nginx │ ├── Dockerfile │ ├── nginx-1.12.1.tar.gz │ └── nginx.conf └── php ├── Dockerfile ├── php-5.6.31.tar.gz └── php.ini
- LNMP包下載地址:https://pan.baidu.com/s/1SHR6WDMXKvPlXOB1J0y5tg
- 密碼:ze4f
3.4、測試節點:構建LNMP環境
# 解壓包,進入nginx目錄 unzip Dockerfile-lnmp.zip;cd Dockerfile-lnmp/nginx/ # 構建nginx鏡像容器 docker build -t 192.168.1.79:5000/lnmp-nginx:base . # 進入php目錄 cd ../php/ # 構建php鏡像如期 docker build -t 192.168.1.79:5000/lnmp-php:base .
注:地址IP需要根據環境修改,確認執行完畢,無誤。
3.5 測試節點:上傳到鏡像倉庫
docker push 192.168.1.79:5000/lnmp-nginx:base
docker push 192.168.1.79:5000/lnmp-php:base
報錯處理:https://www.cnblogs.com/lkun/p/7990466.html
注:感謝無影無蹤大佬的解決方案。
4、測試正式節點:安裝docker-compose
5、測試節點:部署測試環境包
5.1、下載測試部署壓縮包
目錄結構 ├── config # 生產環境配置文件 │ ├── prod.html │ ├── prod.tar.gz # 測試環境配置文件 │ ├── test.html │ └── test.tar.gz # 部署LNMP項目 ├── deploy.sh # 編排描述內容 ├── docker-compose.yml # 構建鏡像 ├── Dockerfile │ ├── nginx │ └── php # 將容器目錄數據庫持久化到該目錄下 ├── mysql_data # 推送鏡像到線上使用 ├── push_images.sh # 記錄部署時的代碼版本號 ├── revision.svn # 存放項目目錄 └── wwwroot
- 下載地址:https://pan.baidu.com/s/1sKxJBDd1wkUhOTxhskP_Ug
- 密碼:feb5
5.2、解壓文件,腳本加入執行權限,並查看相關文件信息
# 上傳test.zip腳本,解壓縮 unzip lnmp.zip;cd lnmp # 將腳本添加執行權限 chmod +x push_images.sh

#!/bin/bash # 修訂版本號 REVISION=$1 # 工作環境變量環境,test傳入構建dockerfile內 WORK_ENV=test # 將當前版本寫入revison文件中 echo $REVISION >./revision.svn # 進入Dockerfile cd Dockerfile # 構建鏡像build傳入test環境 sudo docker build --build-arg work_env=$WORK_ENV -t lnmp-nginx:latest -f nginx ../ sudo docker build --build-arg work_env=$WORK_ENV -t lnmp-php:latest -f php ../ # 刪除當前容器所有內容 sudo docker-compose down # 重啟初始化容器 sudo docker-compose up -d

# 版本號 version: '3' # 服務管理 services: # nginx服務 nginx: # 鏡像使用倉庫內鏡像 image: lnmp-nginx:latest # 暴露端口為80 ports: - 80:80 # 映射服務別名 links: - php:php-cgi depends_on: - php - mysql # php服務 php: # 鏡像使用倉庫內鏡像 image: lnmp-php:latest # 映射服務別名 links: - mysql:mysql-db # mysql服務 mysql: # 鏡像版本 image: mysql:5.6 # 暴露端口 ports: - 3306:3306 # 映射服務數據卷 volumes: - ./mysql_data:/var/lib/mysql command: --character-set-server=utf8 # 指定數據庫變量 environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: wordpress MYSQL_USER: user MYSQL_PASSWORD: user123

# 指定鏡像 FROM 192.168.1.97:5000/lnmp-nginx:base # 指定管理員 MAINTAINER xiangsikai # 接收構建參數 ARG work_env # 更新網站目錄 ADD wwwroot /usr/local/nginx/html # 解壓 接收參數傳入變量的壓縮包 ADD config/${work_env}.tar.gz /usr/local/nginx/html # 聲明暴露端口 expose 80

# 指定鏡像 FROM 192.168.1.79:5000/lnmp-php:base # 指定管理員 MAINTAINER xiangsikai # 接收構建參數 ARG work_env # 更新網站目錄 ADD wwwroot /usr/local/nginx/html # 解壓 接收參數傳入變量的壓縮包 ADD config/${work_env}.tar.gz /usr/local/nginx/html # 聲明暴露端口 expose 9000

#!/bin/bash # 指定鏡像倉庫地址 IMAGE_REPOS=192.168.01.79:5000 # 記錄部署時修訂版本號 REVISION=$(cat revision.svn) # 聲明生產環境 WORK_ENV=prod # 進入Dockerfile cd Dockerfile # 構建鏡像build傳入prod環境 sudo docker build --build-arg work_env=$WORK_ENV -t $IMAGE_REPOS/lnmp-nginx:$REVISION -f nginx ../ sudo docker build --build-arg work_env=$WORK_ENV -t $IMAGE_REPOS/lnmp-php:$REVISION -f php ../ # 將鏡像上傳到鏡像倉庫 sudo docker push $IMAGE_REPOS/lnmp-nginx:$REVISION sudo docker push $IMAGE_REPOS/lnmp-php:$REVISION # 注:通過jenkins在svn中自動拉取傳入wwwroot目錄下。
6、生產節點:部署生產環境包
6.1、下載生產部署壓縮包
目錄結構 ├── deploy.sh ├── docker-compose.yml ├── revision.svn └── roll-back.sh
- 下載地址:https://pan.baidu.com/s/1SaZUubsnKJHe19ALHUfd8w
- 密碼:opml
6.2、解壓文件,腳本加入執行權限,並查看想關文件信息
# 解壓文件,進入路徑下 unzip lnmp2.zip # 加入文件執行權限 chmod +x deploy.sh roll-back.sh

#!/bin/bash # 文件賦值變量 REVISION=revision.svn # 鏡像倉庫位置 IMAGE_REPOS=http://192.168.1.79:5000/v2 # 獲取最新鏡像tag,取最大最新版本號 LATEST_REVISION=$(curl $IMAGE_REPOS/lnmp-nginx/tags/list |\ grep -Po '(?<=")\d+(?=")' |\ awk 'BEGIN{max=0}{for(i=1;i<=NF;i++)if($i>max)max=$i}END{print max}') # 修改版本號到docker-compose內指定構建版本 sed -i -r '/:5000/s/[0-9]+$/'$LATEST_REVISION'/' docker-compose.yml # 標記上一個版本和當前版本 if ! grep "^$LATEST_REVISION " $REVISION &>/dev/null; then sed -i -r '$s/([0-9]+).*/\1 Previous/' $REVISION echo "$LATEST_REVISION Current" >> $REVISION fi # 重新部署docker-compose文件 sudo docker-compose down sudo docker-compose up -d

version: '3' services: nginx: image: 192.168.1.79:5000/lnmp-nginx:12 ports: - 80:80 links: - php:php-cgi depends_on: - php php: image: 192.168.1.79:5000/lnmp-php:12 links: - mysql:mysql-db mysql: image: mysql:5.6 ports: - 3306:3306 volumes: - ./mysql_data:/var/lib/mysql command: --character-set-server=utf8 environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: wordpress MYSQL_USER: user MYSQL_PASSWORD: user123

#!/bin/bash # 修改為上一個鏡像版本 PRE_REVISION=$(awk '/Previous/{revision=$1}END{print revision}' revision.svn) sed -i -r '/:5000/s/[0-9]+$/'$PRE_REVISION'/' docker-compose.yml # 當前有問題的版本記錄 sed -i '$d' revision.svn sudo docker-compose down sudo docker-compose up -d
7、管理節點:Jenkins安裝
注:Jenkins安裝需要依賴JDK環境,為了也可以部署JAVA項目同樣也安裝了maven。
注:Jenkins同樣也需要通過Tomcat來運行 通過平台化方式管理。
7.1、安裝JDK和Maven並配置環境變量
- JDK下載地址:https://pan.baidu.com/s/1TzyUAo3MPU0l6cUpUnzJIg
- 密碼:gyxr
- Maven下載地址:https://pan.baidu.com/s/1rM_NkeclLNeAY61hA0HRAw
- 密碼:k3a3
# 解壓jdk tar zxvf jdk-8u181-linux-x64.tar.gz # 移動jdk目錄 mv jdk1.8.0_181 /usr/local/jdk1.8 # 解壓maven tar zxvf apache-maven-3.6.0-bin.tar.gz # 移動jdk目錄 mv apache-maven-3.6.0 /usr/local/maven3.6
7.2、配置JDK與Maven環境變量,並設置立即生效
vi /etc/profile
JAVA_HOME=/usr/local/jdk1.8 CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar MAVEN_HOME=/usr/local/maven3.6 PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH export JAVA_HOME CLASSPATH MAVEN_HOME PATH
# 立即生效 source /etc/profile
7.3、部署tomcat應用服務
- tomcat下載地址:https://pan.baidu.com/s/1IjaKDtUX7e_zjW5kb64Akw
- 密碼:m1cz
# 解壓tomcat tar zxvf apache-tomcat-8.0.53.tar.gz # 運行tomcat /root/apache-tomcat-8.0.53/bin/startup.sh # 刪除目錄下默認網站數據 cd apache-tomcat-8.0.53/webapps;rm -rf ./*
7.4、添加Jenkins資源
- Jenkins下載地址:https://pan.baidu.com/s/1sxQ8DnYl4ZS7JG0BgVWIWw
- 密碼:8o8p
# 進入網站目錄 cd /root/apache-tomcat-8.0.53/webapps # 解壓jenkins到指定ROOT目錄 unzip /root/jenkins.zip -d ROOT
# 查看生成隨機秘鑰文件路徑 /root/.jenkins/secrets/initialAdminPassword
7.5、Jenkins安裝
瀏覽器訪問:http://192.168.1.79:8080
選擇相關軟件確認后install
安裝ssh插件
安裝Git插件
安裝svn插件
初始化install 安裝
創建用戶
確認執行jenkins
8、Jenkins系統配置
8.1、進入主頁面
8.2、進入系統管理查看多個功能模塊
8.3、添加秘鑰 秘鑰用戶自定義
8.4、進入系統設置 添加設置。添加ssh。SSH 連接部署節點 傳輸相應命令
8.5、添加Publish over SSH。項目代碼傳到部署節點。(保存)
8.6、進入全局工具配置
8.7、添加JDK
8.8、添加Maven(保存)
9、Jenkins創建項目1
9.1、創建項目
9.2、設置最大構建數
9.3、添加SVN訪問
9.4、新建SVN用戶
9.5、設置構建,指定網站目錄,執行相關腳本並傳入變量
9.6、測試構建
9.7、查看執行過程
9.7、瀏覽器測試
10、Jenkins創建項目2
10.1、創建項目
10.2、執行命令:進入指定目錄執行上傳鏡像腳本。(保存)
10.3、測試:執行構建
10.4、查看終端輸出
10.5、查看版本倉庫鏡像
命令:curl http://192.168.1.79:5000/v2/lnmp-nginx/tags/list {"name":"lnmp-nginx","tags":["base","4"]}
11、Jenkins創建項目3
11.1、創建Jenkins項目
11.2、加入命令指定執行相關腳本
11.3、測試構建查看終端輸出
11.4、瀏覽器測試
12、Jenkins創建項目4
條件流程:svn提交新文件-->發布到測試環境-->提交測試環境到鏡像-->發布到正式環境
12.1、創建jenkins項目
12.2、添加構建執行相應腳本
12.3、測試構建查看控制台輸出
注:按照流程順序依次使用