Docker+Jenkins+GIT+Tomcat实战持续化集成_docker+jinkens+git-程序员宅基地

技术标签: Jenkins  CD  Docker  devops  CI  

Docker基础教程可参考:容器Docker详解
Jenkins基础知识可参考:jenkins笔记(1)
Git基础知识可参考:GIT笔记
文件脚本内容参考:junsansi,可以根据实际项目具体修改脚本。

一、概要

开发将源码上传到github仓库,通过jenkins持续集成引擎结合git工具,将源码拉取到jenkins服务器,通过工具maven在本地讲源码编译打包成war包,在ssh到Docker宿主机,通过执行脚本生成制作自定义的Dockerfile,最终执行生成images,并启动container,即启动了包含war包的tomcat,即可实现对外提供web服务。

二、环境部署

主机名 IP地址 作用
Docker-server 172.20.6.20 Docker宿主机
Jenkins-server 172.20.6.22 Jenkins服务器

2.1 Jenkins服务器配置

Jenkins的安装及配置Jenkins服务器的相关工具(maven、git、ssh)配置,详细步骤可参考jenkins笔记(1)的相关工具的安装及配置。

2.2 Docker宿主机配置

Docker的基础命令可参考容器Docker详解,需要在Docker宿主机pull下tomcat的基础环境以及jenkins服务器通过docker用户登录Docker宿主机,讲war包发布到制定目录,执行特定脚本来生成Dockerfile,最终根据Dockerfile生成images,并启动基于包含war包的container,从而实现对外提供WEB服务。

创建ssh发布用户及目录

useradd docker
echo "docker:docker" |chpasswd      #为docker用户设置密码
mkdir -pv /data/dockerfiles/scripts

上传脚本

将脚本上传到 /data/dockerfiles/scripts,命名为devops,此名称可自定义,但是之后在配置jenkins执行ssh命令时候的脚本名称需要一致。由于脚本内部的分发路径是写的绝对路径,所以需要讲目录为固定,也可以根据实际修改。此脚本author:junsansi,可以参考其进行修改。

cat >/data/dockerfiles/scripts/devops.sh<<EOF
#!/bin/bash
# this script function is :                
# deploy new docker container             
#                                          
# USER        YYYY-MM-DD - ACTION          
# junsansi    2016-01-25 - CREATED        
parasnum=5
# function
help_msg()
{
cat << help
+ Error Cause:
+ you enter $# parameters
+ the total paramenter number must be $parasnum
+ 1st :DOCKER_NAME
+ 2nd :PROJECT_NAME
+ 3rd :PROJECT_VERSION
+ 4th :SOURCE_PORT
+ 5th :DESTINATION_PORT
help
}
# Check parameter number
if [ $# -ne ${parasnum} ]
then
        help_msg 
        exit
fi
# Initialize the parameter.
DOCKER_NAME=$1
PROJECT_NAME=$2
PROJ_VERSION=$3
SPORT=$4
DPORT=$5
PROJ_VERSION=${PROJ_VERSION/"origin/"/""}
DOCKER_FILE="/data/dockerfiles/${DOCKER_NAME}/Dockerfile"
DOCKER_FILE_DIR=/data/dockerfiles/${DOCKER_NAME}
if [ ! -d ${DOCKER_FILE_DIR} ]; then
        mkdir -p ${DOCKER_FILE_DIR}
fi
# check docker images
DOCKER_IMAGE=`/usr/bin/docker images | grep ${DOCKER_NAME} | awk -F ' ' '{print $3}'`
if [ -n "${DOCKER_IMAGE}" ]; then
        # check docker container
        for dc in `/usr/bin/docker ps -a | grep ${DOCKER_NAME} | awk -F " " '{print $1}'`
        do
                echo "Stop container: ${dc}"
                /usr/bin/docker stop ${dc}
                # delete while docker container was exists
                echo "##Delete exists Container_Id: "${dc}
                /usr/bin/docker rm ${dc}
        done

        # delete while docker image was exists
        echo "#Delete exists Image: "${DOCKER_IMAGE}
        /usr/bin/docker rmi ${DOCKER_IMAGE} 
fi
# Init dockerfile
echo "**Init dockerfile start: "${DOCKER_FILE}
echo "FROM tomcat" > ${DOCKER_FILE}
echo 'MAINTAINER junsansi "[email protected]"' >> ${DOCKER_FILE}
echo "ADD *.war /usr/local/tomcat/webapps/${PROJECT_NAME}.war" >> ${DOCKER_FILE}
echo "EXPOSE 8080" >> ${DOCKER_FILE}
echo "CMD /usr/local/tomcat/bin/startup.sh && tail -f /usr/local/tomcat/logs/catalina.out" >> ${DOCKER_FILE}
cat ${DOCKER_FILE}
echo "**Init dockerfile end."
# Build dockerfile
cd ${DOCKER_FILE_DIR}
rm *.war -rf
mv /data/dockerfiles/war/${DOCKER_NAME}/*.war ./
echo ""
echo "##Build dockerfile for "${DOCKER_NAME}
/usr/bin/docker build -t ${DOCKER_NAME}:${PROJ_VERSION} . 
# Run docker container
echo ""
echo "##Running docker container: "${DOCKER_NAME}
/usr/bin/docker run --name ${DOCKER_NAME}_d1 -d -p ${SPORT}:${DPORT} ${DOCKER_NAME}:${PROJ_VERSION}
EOF
chmod +x  /data/dockerfiles/scripts/devops.sh
chown docker.docker /data/dockerfiles -R

Docker宿主机获取tomcat镜像

docker pull docker.io/tomcat
使用docker images查看tomcat镜像

此时Docker宿主机就已经配置完毕。

三、Jenkins配置

登录Jenkins的WEB界面

3.1 配置Docker宿主机的ssh信息

系统管理—系统设置—Publish over SSH—增加SSH Server
添加SSH Server可以使用密钥形式添加,也可以直接使用用户名密码, 此处使用用户名密码,选择
Use password authentication, or use a different key,即docker用户的密码,进行登录发布,之前已经讲/data/dockerfiles目录的属主属组更改为docker,确认Jenkins服务器使用docker用户可以正常在此目录下进行后续操作。

3.2 构建一个maven项目

一般设置


为保证Jenkins服务器的磁盘有充足的空间,在选中丢弃旧的构建->保持构建的最大个数为10个

在真实开发环境中,成员直接相互协助,GIT是多分支的,考虑到分支管理,需在此选中参数化构建->选择Git Parameter->定义名称为release_branch,因此选择参数类型为Branch:如果自己发现devops脚本可以看到里面是调用了此参数进行选择构建的分支。
同时创建考虑到创建Docker的名称,此时需要给后续创建的docker images以项目的名称命名。

源码管理

源码管理选择git,填入仓库url:[email protected]:redhatxl/zrlog.git

此时发现会出现报错信息,因为此仓库为我的私有仓库,需要配置Credentials,点开add, Add Credentials的 Kind选择SSH Username with private key,Username选择之前在github上传的公钥用户的用户名,此次为root,Private Key为jenkins服务器登录github的本地私钥,查看私钥cat /root/.ssh/id_rsa 复制粘贴到Key区域,完成添加。此时可以发现报错已经消失。

在Branches to build模块需要填写之前我们参数话的变量,在此引用$release_branch

环境构建

在build的Goals and options添加maven构建参考及命令:clean install -D maven.test.skip=true

增加构建后操作

增加构建后步骤—选择Send build artifacts over SSH
SSH-Server name选择Docker宿主机
Transfers中填写Source files:target/*.war

Remove prefix:target/
Remote directory:/war/ projectname/data/dockerfileswar/data/dockerfiles/war/docker01tomcatzrlogExeccommand:/data/dockerfiles/scripts/devop.sh p r o j e c t n a m e , 即 在 远 端 / d a t a / d o c k e r f i l e s 下 的 w a r 目 录 ( / d a t a / d o c k e r f i l e s / w a r / d o c k e r 01 − t o m c a t − z r l o g ) E x e c c o m m a n d : / d a t a / d o c k e r f i l e s / s c r i p t s / d e v o p . s h project_name zrlog $release_branch 8888 8080
即jenkins服务器ssh到docker宿主机之后执行的脚本命令,执行/data/dockerfiles/scripts/devop.sh脚本,此脚本需要传入5个参考,
project_name:项目名称,即docker生成images的名称
zrlog:即项目名称
release_branch:在git上提交的分支,此处我们只有master分支
两个端口,前一个端口及宿主机的监听端口,后一个端口及映射到docker容器内部的端口,在此处使用的为tomcat,默认的为8080端口。

注意:再次可以添加多个server,即实现集群,可以讲web服务器为无状态,将日志文件挂载到本地物理磁盘以实现日志监控即数据持久化存储。

添加增加构建后操作,选择Editable Email Notification,利用插件邮件来发送通知。
可以根据需求自定义邮件主题与内容,此处添加信息接受人,由于全局配置了always,在高级设置内,填写接受人邮箱。

创建完毕后点击应用并保存。

3.3 执行构建

选择Build with Parameters,然后在右边release_branch内选择需要执行的github上的分支,此处为master,同理选择 project_name,为docker images的name可以选择自己添加自定义的名字,点击开始构建

查看Console Output


查看邮件通知

登录docker宿主机查看images与container

网页测试

至此利用jenkins简单的实现了讲github上的源码拉去到jenkins服务器本地,利用maven编译生成war包并分发到docker宿主机,执行脚本生成dockerfile,并启动容器,最终邮件通知。

四、启动多个容器

在配置jenkins的ssh后的命令我们可以添加多个server从而实现分布式,同时我们也可以对在一台主机上通过区分端口号来生成多个images并启动多个不通端口的container
在General的参数化构建过程中增加第三个参数proxy_port可以设置为docker宿主机的本地监听端口从而实现多端口多实例

在ssh命令中调用

在构建开始时可以定义不同的images对应不通的端口

查看启动后的容器

注意:如果有特殊需求,例如发布php代码或其他可以自行对脚本进行修改,可以根据需求定义多个参数灵活使用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_26848099/article/details/79400714

智能推荐

使用 ARFoundation 实现 AR 虚拟试戴_ar试帽项目-程序员宅基地

文章浏览阅读336次。在 Hierarchy 面板中右键点击 “AR Session” 对象,选择 “XR” -> “AR Session Origin”,将其添加为 “AR Session” 的子对象。首先,打开 Unity,并在 Hierarchy 面板中右键点击创建一个空对象,将其命名为 “AR Session”。在 Inspector 面板中选择 “AR Session Origin” 对象,然后在右侧的 Inspector 面板中找到 “AR Session Origin” 组件的 “AR Session” 字段。_ar试帽项目

探索T-Writer.js:一款强大的Web文本编辑器-程序员宅基地

文章浏览阅读320次,点赞3次,收藏6次。探索T-Writer.js:一款强大的Web文本编辑器项目地址:https://gitcode.com/ChrisCavs/t-writer.jsT-Writer.js 是一个基于JavaScript的开源富文本编辑器,旨在提供一种简洁、高效的在线写作体验。它具备现代Web应用所需的多种功能,并且易于集成到你的网站或应用中。技术分析T-Writer.js 使用了最新的Web技术栈,包括:...

[PHP]学生成绩管理系统_php成绩管理系统-程序员宅基地

文章浏览阅读1w次,点赞27次,收藏175次。[PHP]学生成绩管理系统其实,这是我大一的时候,数据库的课程设计,虽然现在回看也觉得代码凌乱,但也懒得改了,之前是发在了自己搭建的博客,现在发到CSDN上来。文章目录[PHP]学生成绩管理系统1 前言2 功能模块2.1学生模块2.2 教师模块2.3 主要的文件结构3 界面设计3.1 登录界面3.2 学生主页(我的成绩)3.3 各科成绩3.4 教师主页(学生管理)3.5 学生信息详情3.6 学生信息修改3.7 添加学生信息3.8 课程管理3.9 各科成绩3.10 一键管理4 数据库设计4.1 E-R图4_php成绩管理系统

基于ssm超市库存商品管理系统的设计与实现(源码+lw+部署文档+讲解等)-程序员宅基地

文章浏览阅读775次,点赞22次,收藏24次。功能对照表的目的是帮助开发团队了解软件的功能状况,及时修复功能缺陷和错误,并提高软件的质量和稳定性。功能编号功能名称功能描述功能状态备注1用户登录用户可以通过提供用户名和密码登录系统正常用户名和密码的验证机制安全性2用户注册用户可以通过提供用户名、密码和电子邮件地址注册新的账户正常无3密码修改用户可以通过提供原密码和新密码修改已有账户的密码正常用户密码的修改操作是否需要提供安全认证4用户信息查看用户可以查看自己的个人信息,如用户名、电子邮件地址、角色等正常无。

阿里云PAI大模型RAG对话系统最佳实践_rag最佳实践-程序员宅基地

文章浏览阅读745次,点赞12次,收藏21次。通过以上更具体的步骤和考虑因素,_rag最佳实践

python如何另存文件_python如何保存文本文件-程序员宅基地

文章浏览阅读3.1k次。python保存文本文件的方法:使用python内置的open()类可以打开文本文件,向文件里面写入数据可以用write()函数,写完之后,使用close()函数就可以关闭并保存文本文件了示例代码如下:执行结果如下:内容扩展:Python3将数据保存为txt文件的方法,具体内容如下所示:f = open("data/model_Weight.txt",'a') #若文件不存在,系统自动创建。'a'..._怎么保存python文件

随便推点

vue中的js文件如何使用i18n 国际化_vue中i18n.js文件中如何调用解决,并将结果赋值给i1 8n的message-程序员宅基地

文章浏览阅读5.8k次,点赞2次,收藏6次。1.在main.js文件中引入:方式1://main.jsimport VueI18n from 'vue-i18n'Vue.use(VueI18n) // 通过插件的形式挂载,通过全局方法 Vue.use() 使用插件const i18n = new VueI18n({ locale: 'zh', // 语言标识 //this.$i18n.locale // 通过切换loca..._vue中i18n.js文件中如何调用解决,并将结果赋值给i1 8n的message

linux驱动开发:ft5x06的touch screen的IIC驱动程序编写_触摸屏a类协议和b类协议-程序员宅基地

文章浏览阅读2.8k次。触摸屏属于一个标注的input dev.所以我们按照输入子系统的流程来实现驱动开发。 实际板子与CTPM的通讯连接基于IIC总线,所以我们需要把驱动挂载到IIC总线下面去,也就是注册IIC驱动到iic_core.c中去。 实例化一个IIC设备有多种方式,仿照上一次的24cxx IIC设备的创建,我们来实现ft5x06IIC设备的创建。 因实际板子上TS IC使用的是ft5x02,所以先实例化设_触摸屏a类协议和b类协议

关于html中下拉菜单select的样式的改变_html设置select选择显示和下来显示怎么能不一致-程序员宅基地

文章浏览阅读5.2k次。关于html中下拉菜单select的样式的改变作者:菩提树下的杨过 日期:2006-06-12字体大小: 小 中 大 首先要告诉大家,如果你是用css的方法,除了箭头部分,其他都可以改变,这是很令人别扭的事,因为其他的样式改了,箭头部分改不了等于无用。下面举个css改select的例子 HTML代码 .box{border:1px solid#C0C0_html设置select选择显示和下来显示怎么能不一致

ZedBoard-自定义IP核实现+PS成功调用【详细步骤+流程介绍+源码】_zedboard教程-程序员宅基地

文章浏览阅读3.4k次。软件环境:WIN7_64 + ISE 14.4 (system_edition)硬件:Zedboard、USB-Cable线搭建图: 经过前几天的学习,查看数据手册、官方例程,笔者已经对Zedboard有了基本的了解,但是怎样才能充分发挥ZYNQ的优势呢?这个就不得不说下ZYNQ的基本架构了,它分为PS(Processing System)和PL(Progr_zedboard教程

使用H2O机器学习"十分钟"提交天池练习赛--工业蒸汽量预测,超过86%的队伍_练习赛-蒸汽数据集-程序员宅基地

文章浏览阅读430次。试用一下H2O全自动机器学习下载数据集天池练习赛"工业蒸汽量预测",下个数据集:https://tianchi.aliyun.com/competition/entrance/231693/introduction安装H2OH2O requirements:pip install requestspip install tabulatepip install ..._练习赛-蒸汽数据集

VxLAN-分布式网关_vxlan分布式网关实验-程序员宅基地

文章浏览阅读603次。vLSW1、vLSW2充当虚拟交换机,给数据添加vlan tag。由于模拟器PC不会主动发送ARP,需要用PC ping 网关地址。查看VPN实例中的路由,学习到32位主机路由。查看OSPF邻居是否建立,路由是否学习到。CE1上学习到32位主机路由(回城路由)查看BGP EVPN学习的5类路由。测试PC访问外部网络Server。查看BGP EVPN邻居关系。同子网,PC1 访问PC2。跨子网,PC1 访问PC3。查看EVPN的3类路由。查看EVPN的2类路由。查看3层VxLan隧道。查看VPN实例内路由。_vxlan分布式网关实验

推荐文章

热门文章

相关标签