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. 线程的信号量Semaphore

    线程和进程一样也有信号量,一个资源在同一时刻只有规定数量的线程能使用.

  2. 使用redis接管session

    class RedisSession { // 默认配置名称(使用load_config加载) private $_default_config_path = 'package/cache/redis ...

  3. ruby 基础知识 - Class 与 Module

    原文 1. 因為 Ruby 並沒有「屬性」(property/attribute)這樣的設計,要取用實體變數,需要另外定義的方法才行: class Cat def initialize(name, g ...

  4. 【Swing程序设计/常用面板】

    面板也是一个Swing容器,可以作为容器容纳其他组件,但是它必须要被添加到其他容器中.Swing常见的面板是JPanel面板和JScrollPanel面板. JPanel面板可以聚集一些组件来布局. ...

  5. maven学习之pom.xml或settings.xml对nexus的配置(转)

    (1)在POM中配置Nexus仓库 <project>         ...         <repositories>            <repository ...

  6. 二叉查找树,AVL树,伸展树【CH4601普通平衡树】

    最近数据结构刚好看到了伸展树,在想这个东西有什么应用,于是顺便学习一下. 二叉查找树(BST),对于树上的任意一个节点,节点的左子树上的关键字都小于这个节点的关键字,节点的右子树上的关键字都大于这个节 ...

  7. 关于vue执行打包后,如何在本地浏览问题

    最近一个人在捣鼓vue,写完项目后发现在npm run dev下可以正常访问,bulid之后却一片空白,查看console出现许多Failed to load resource: net::ERR_F ...

  8. Golang自定义包导入

    # 文件Tree project -/bin -/pkg -/src -main.go -/test -test1.go -test2.go main.go package main import ( ...

  9. docker容器的操作

    容器操作 1.查看本地容器 docker ps -a # 查看所有容器 docker ps # 查看所有正在运行的容器 2.容器的创建与启动 方法一:两步完成(强烈推荐方法)(1)创建 docker ...

  10. mssql卸载后重新安装 错误解决

    1.instance id already in use http://www.sqlservercentral.com/articles/MSSQLSERVER/161398/ 2.提示没有重启 删 ...