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"]}

查看指定镜像tags版本

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

脚本deploy.sh

# 版本号
version: ''
# 服务管理
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

dockercompose脚本

# 指定镜像
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

Dockerfile 内 Nginx脚本

# 指定镜像
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

Dockerfile 内 PHP脚本

#!/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目录下。

push_images.sh脚本

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

deploy.sh脚本

version: ''
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

docker-compose.yml脚本

#!/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

roll-back.sh脚本

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",""]}

11、Jenkins创建项目3

11.1、创建Jenkins项目

11.2、加入命令指定执行相关脚本

11.3、测试构建查看终端输出

11.4、浏览器测试

12、Jenkins创建项目4

条件流程:svn提交新文件-->发布到测试环境-->提交测试环境到镜像-->发布到正式环境

12.1、创建jenkins项目

12.2、添加构建执行相应脚本

12.3、测试构建查看控制台输出

注:按照流程顺序依次使用

Docker+Jenkins+Maven+SVN搭建持续集成环境的更多相关文章

  1. Jenkins+Maven+Svn搭建持续集成环境持续集成和自动部署

    Jenkins和Hudson有很深的渊源,Jenkins目前更新频繁,目前选用Jenkins为持续集成工具和自动部署 Jenkins的使用有很多的介绍,主要记录如下要点: 192.168.1.240: ...

  2. Docker+Teamcity+Maven+SVN搭建持续集成环境

    这是使用Jenkins作为CI/CD工具,Teamcity的作用是相同的.

  3. Hudson+Maven+Svn搭建持续集成环境

    Hudson+Maven+Svn搭建持续集成环境 博客分类: 配置管理 mavenSVNTomcat项目管理配置管理 一.所用开发工具 1.    Hudson: Hudson 是一种革命性的开放源码 ...

  4. selenium+jenkins+maven+testNG搭建持续集成环境

    为了简明起见,分几大部分,很基础的细节就不详述了 一·安装jenkins 二·创建一个maven项目的job 2.1   填上SVN的Repository URL 2.2  由于是在本地执行maven ...

  5. Jenkins+Maven+Gitlab+Nexus持续集成环境搭建

      1.软件及服务介绍 Jenkins:jenkins是实现代码自动化流程上线的工具,Jenkins是一个独立的开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个 ...

  6. Jenkins+Maven+Sonar系统持续集成环境部署以及配置

    一.Jenkins介绍以及安装 什么是持续集成?   随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Ag ...

  7. Jenkins+Maven+Git搭建持续集成和自动化部署的配置手记

    前言    持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示.自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误.之前一直没有把这个做起来,最近的新 ...

  8. Jenkins学习总结(3)——Jenkins+Maven+Git搭建持续集成和自动化部署的

    前言 持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示.自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误.之前一直没有把这个做起来,最近的新项目正 ...

  9. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)

    前言     上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...

随机推荐

  1. Java | 原来 serialVersionUID 的用处在这里

    本文首发于 http://youngzy.com/ 一直不太明白Java对象里 serialVersionUID 字段是做什么用的.有或者没有,它们之间有差别吗?除了Eclipse里提示的那个黄色的警 ...

  2. 机器人学 —— 机器人感知(Mapping)

    对于移动机器人来说,最吸引人的莫过于SLAM,堪称Moving Robot 皇冠上的明珠.Perception 服务于 SLAM,Motion Plan基于SLAM.SLAM在移动机器人整个问题框架中 ...

  3. JDBC driver for MySQL连接提示"The connection property 'zeroDateTimeBehavior' acceptable values are: 'CONVERT_TO_NULL', 'EXCEPTION' or 'ROUND'. The value 'convertToNull' is not acceptable."解决方案

    1.使用了8.0以上版本的JDBC driver for MySQL,降回5.x版本. 2.不对JDBC driver for MySQL降级.修改数据库连接字符串,添加serverTimezone属 ...

  4. HTTPS 通讯流程

    原文地址 https://blog.csdn.net/wangweilica6/article/details/50171457 一.简介 前一篇文章,我总结了下,如何部署https服务,开通ssl通 ...

  5. 如何判断java对象是否为String数组

    if (entry.getValue() instanceof String[]) {// ko .................... }

  6. openshift 配置 bitbucket 的webhook

    参考 https://docs.openshift.org/latest/dev_guide/builds/triggering_builds.html oc set triggers bc < ...

  7. 20175303 2018-2019-2 《Java程序设计》第2周学习总结

    •总体的说,第2周主要学习了课本第二章第三章的内容,这周的学习简直比上一周的简单而且容易理解得多.上周的各种安装,注册,眼花缭乱,很早就开始弄,但各种出错,到最后都想放弃了,好在有同学的帮助,帮我正确 ...

  8. SQL[Err] ORA-00979: not a GROUP BY expression

    Oracle中group by用法 not a GROUP BY expression异常产生是因为group by用法的问题. 在使用group by 时,有一个规则需要遵守,即出现在select列 ...

  9. 多对多关联模型,MANY_TOMANY

    先分别创建三张表:think_user   think_group   think_user_group user 表里有id.name字段 group 表里有id.groupName字段 user_ ...

  10. 代码中特殊的注释技术——TODO、FIXME和XXX的用处(转)

    1.声明 本篇转自博客:http://blog.csdn.net/reille/ 2.转载内容 2.1.前言 今天在阅读 Qt Creator 的源代码时,发现一些注释中有 FIXME 英文单词,用英 ...