Docker+Jenkins+Maven+SVN搭建持續集成環境php
環境拓撲圖(實驗項目使用PHP環境)html
發佈流程圖mysql
環境說明linux
應用環境部署nginx
一、管理節點:SVN安裝配置及簡單使用web
1.一、安裝SVN服務sql
yum -y install subversion
1.二、建立SVN目錄docker
mkdir /home/svn
1.三、建立SVN倉庫名爲repos數據庫
svnadmin create /home/svn/repos
1.四、修改repos庫內主配置文件apache
vi /home/svn/repos/conf/svnserve.conf
# none設置不容許匿名訪問 anon-access = none # 認證爲可寫 auth-access = write # 密碼數據庫文件爲passwd password-db = passw # 認證數據庫文件爲authz authz-db = authz
1.五、修改passwd文件 添加用戶
vi /home/svn/repos/conf/passwd
# 用戶管理 [users] # 用戶名爲test。密碼123456。 test = 123456
1.六、修改authz文件 賦值建立用戶權限
vi /home/svn/repos/conf/authz
# 建立倉庫目錄「/」權限 [repos:/] # 賦值test 讀寫權限 test = rw
1.七、啓動SVN服務
svnserve -d -r /home/svn
注:倉庫地址 svn://192.168.1.79/repos
二、客戶端:鏈接SVN建立文件
2.一、 windos 鏈接SVN 輸入密碼
2.2 repos 文件夾下建立index.html
2.三、文件已html後綴的網頁文件
index.html文件內容:<h1>repos</h2>
2.三、提交代碼
三、部署Docker鏡像倉庫
注:保證全部節點都提早安裝好Docker應用
3.一、管理節點:下載安裝鏡像倉庫
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.二、管理節點:在部署節點配置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.三、測試節點:整理Dockerfile(提早整理好的LNMP環境包)
Dockerfile-lnmp/ ├── nginx │ ├── Dockerfile │ ├── nginx-1.12.1.tar.gz │ └── nginx.conf └── php ├── Dockerfile ├── php-5.6.31.tar.gz └── php.ini
3.四、測試節點:構建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
注:感謝無影無蹤大佬的解決方案。
四、測試正式節點:安裝docker-compose
五、測試節點:部署測試環境包
5.一、下載測試部署壓縮包
目錄結構 ├── 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
5.二、解壓文件,腳本加入執行權限,並查看相關文件信息
# 上傳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.一、下載生產部署壓縮包
目錄結構 ├── deploy.sh ├── docker-compose.yml ├── revision.svn └── roll-back.sh
6.二、解壓文件,腳本加入執行權限,並查看想關文件信息
# 解壓文件,進入路徑下 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
七、管理節點:Jenkins安裝
注:Jenkins安裝須要依賴JDK環境,爲了也能夠部署JAVA項目一樣也安裝了maven。
注:Jenkins一樣也須要經過Tomcat來運行 經過平臺化方式管理。
7.一、安裝JDK和Maven並配置環境變量
# 解壓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.二、配置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.三、部署tomcat應用服務
# 解壓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.四、添加Jenkins資源
# 進入網站目錄 cd /root/apache-tomcat-8.0.53/webapps # 解壓jenkins到指定ROOT目錄 unzip /root/jenkins.zip -d ROOT
# 查看生成隨機祕鑰文件路徑 /root/.jenkins/secrets/initialAdminPassword
7.五、Jenkins安裝
瀏覽器訪問:http://192.168.1.79:8080
選擇相關軟件確認後install
安裝ssh插件
安裝Git插件
安裝svn插件
初始化install 安裝
建立用戶
確認執行jenkins
八、Jenkins系統配置
8.一、進入主頁面
8.二、進入系統管理查看多個功能模塊
8.三、添加祕鑰 祕鑰用戶自定義
8.四、進入系統設置 添加設置。添加ssh。SSH 鏈接部署節點 傳輸相應命令
8.五、添加Publish over SSH。項目代碼傳到部署節點。(保存)
8.六、進入全局工具配置
8.七、添加JDK
8.八、添加Maven(保存)
九、Jenkins建立項目1
9.一、建立項目
9.二、設置最大構建數
9.三、添加SVN訪問
9.四、新建SVN用戶
9.五、設置構建,指定網站目錄,執行相關腳本並傳入變量
9.六、測試構建
9.七、查看執行過程
9.七、瀏覽器測試
十、Jenkins建立項目2
10.一、建立項目
10.二、執行命令:進入指定目錄執行上傳鏡像腳本。(保存)
10.三、測試:執行構建
10.四、查看終端輸出
10.五、查看版本倉庫鏡像
命令:curl http://192.168.1.79:5000/v2/lnmp-nginx/tags/list {"name":"lnmp-nginx","tags":["base","4"]}
十一、Jenkins建立項目3
11.一、建立Jenkins項目
11.二、加入命令指定執行相關腳本
11.三、測試構建查看終端輸出
11.四、瀏覽器測試
十二、Jenkins建立項目4
條件流程:svn提交新文件-->發佈到測試環境-->提交測試環境到鏡像-->發佈到正式環境
12.一、建立jenkins項目
12.二、添加構建執行相應腳本
12.三、測試構建查看控制檯輸出
注:按照流程順序依次使用