Jenkins与Docker的自动化CI/CD实战
Jenkins与Docker的自动化CI/CD实战
一、发布流程设计
工作流程:
开发人员提交代码到Git版本仓库;
Jenkins人工/定时触发项目构建;
Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;
Jenkins在Docker主机创建容器并发布。
二、环境规划:
角色IPGit/Registry192.168.56.11Docker192.168.56.12Jenkins/Docker192.168.56.13
三、 部署过程
1,部署git
如果公司内部有直接克隆就可以
git clone git@192.168.0.31:/home/git/solo.git
2,部署Jenkins环境
部署传送门:http://blog.51cto.com/qiuyt/2089882
3,部署私有镜像仓库
注意:docker 仓库 由于https 认证,所有需要pull的客户端,需要修改配置文件
[root@linux-node1 ~]# vim /etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled --insecure-registry 192.168.56.11:5000'
4,所有主机安装docker
1)安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2`
2)添加Docker软件包源:
yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
3)安装Docker CE
yum install docker-ce -y`
4)配置加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://bc437cce.m.daocloud.io`
#因为默认源会去国外获取数据,所以会慢可以超时,这是我们就需要配置加速器指向国内源https://www.daocloud.io/
5)启动并开机启动
# systemctl start docker
# systemctl enable docker
四、构建基础镜像【Apache、Nginx、Tomcat、LNMP、LAMP、LNTP】
JAVA程序必须有JDK环境才可以运行,为了减少镜像大小及提高性能,这里直接把JDK放到宿主机上,容器以挂载形式使用。
1,安装jdk
#rz 把tar包上传,解压后放到指定目录
rz.......
tar -zxvf jdk-8u60-linux-x64.tar.gz
mv jdk1.8.0_60 /usr/local/jdk1.8
2,拟写Dockerfile
# cat Dockerfile
FROM centos:7
#他的妈妈是谁
MAINTAINER www.aliangedu.com
#他的爸爸是谁
ENV VERSION=8.5.33
#tomcat版本
ENV JAVA_HOME /usr/local/jdk
#jdk 绝对路径
RUN yum install wget -y
#运行的命令
RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz &&
tar zxf apache-tomcat-${VERSION}.tar.gz &&
mv apache-tomcat-${VERSION} /usr/local/tomcat &&
rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* &&
mkdir /usr/local/tomcat/webapps/ROOT
EXPOSE 8080
#程序使用的端口
CMD /usr/local/tomcat/bin/catalina.sh run
#执行tomcat目录下的启动脚本,这里面遇到坑,就是-v 将宿主机jdk目录挂在到容器/usr/local/jdk 时候,因为镜像按照dockerfile去打,那么在执行命令的时候就会找不到路径,所以我临时删除了,EXPOSE与CMD 2行,然后重新打包,使用 -p 指定端口,然后进入容器,手工启动tomcat的方式,进行
3,构建镜像
docker build -t 192.168.56.11:5000/tomcat-85:latest -f dockerfile .
#最后这个点。代表当前路径,在制作镜像时,会记录上下文内容
4,上传到docker 镜像仓库
root@node02 scripts]# docker push 192.168.56.11:5000/tomcat-85:latest
5,启动镜像 测试
[root@node02 scripts]# docker run -it -d -p 8080:8080 -v /usr/local/jdk1.8:/usr/local/jdk 192.168.56.11:5000/tomcat-8:latest
[root@3addff07c464 ROOT]# echo "123" >index.jsp
五、Jenkins 配置
1.主页面 -> 系统管理 -> 全局工具配置
指定JDK、Maven路径,Git保持默认:
2.jenkins安装必要插件
主页面 -> 系统管理 ->管理插件:
安装SSH与Git Parameter插件。
插件说明:
》SSH:用于SSH远程Docker主机执行Shell命令
》Git Parameter:动态获取Git仓库Branch、Tag
3,配置SSH插件
第一步:先创建一个用于连接Docker主机的凭证 (有权限的用户)
主页面 -> 凭据 -> 系统 -> 右击全局凭据 -> 添加凭据:
输入连接Docker主机的用户名和密码:
第二步:添加SSH远程主机
主页面 -> 系统管理 -> 系统设置 -> SSH remote hosts:
问题:当以普通用户身份去使用docker images时,出现以下错误:
六、将从github上下载的JAVA项目,上传到自己的gitlab仓库
# git clone https://github.com/b3log/solo
# cd solo
移除旧的推送地址,添加新的:
# git remote remove origin
# git remote add origin git@gitlab.example.com:qqq/solo.git
提交代码到Git仓库并创建tag:
# touch src/main/webapp/a.html
# git add .
# git commit -m “a”
创建标签:
# git tag 1.0.0
推送到Git服务器:
# git push origin 1.0.0
登陆gitlab查看solo项目:
七、Jenkins创建项目并发布测试
1.主页面 -> 新建任务 -> 输入任务名称,构建一个Maven项目:
注意:如果没有显示“构建一个Maven项目”选项,需要在管理插件里安装“Maven Integration plugin”插件。
配置Git参数化构建:
2.动态获取Git仓库tag,与用户交互选择Tag发布:【也可以设置分支】
3.指定项目Git仓库地址:
修改*/master为$Tag,Tag是上面动态获取的变量名,表示根据用户选择打代码版本。
4.设置maven构建命令选项:
clean package -Dmaven.test.skip=ture
利用pom.xml文件构建项目。
在Jenkins本机镜像构建与推送到镜像仓库,并SSH远程连接到Docker主机使用推送的镜像创建容器:
上图中 命令内容如下:
REPOSITORY=192.168.56.11:5000/solo:${Tag}
# 构建镜像
cat > Dockerfile << EOF
FROM 192.168.56.11:5000/tomcat-8:latest
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
EOF
docker build -t $REPOSITORY .
# 上传镜像
docker push $REPOSITORY
上图中Command 内容如下:
REPOSITORY=192.168.56.11:5000/solo:${Tag}
# 部署
sudo docker rm -f blog-solo |true
sudo docker image rm $REPOSITORY |true
sudo docker container run -d --name blog-solo -v /usr/local/jdk1.8:/usr/local/jdk -p 8080:8080 $REPOSITORY
# -d 后台运行 ,-v 挂在目录,-p 映射端口,后面是镜像
注:容器名称blog-solo,暴露宿主机端口8080,即使用宿主机IP 192.168.56.12:8080 访问blog-solo项目。
blog-solo项目已配置完成,开始构建:
选择tag,开始构建:
点击左下角构建历史里,右击第一个查看控制台输出:
构建详细内容
构建成功
访问:192.168.56.12:8080 查看部署结果
调整项目访问地址
进入容器,切换到项目目录
vi WEB-INF/classes/latke.properties
#### Server ####
# Browser visit protocol
serverScheme=http
# Browser visit domain name
serverHost=192.168.56.12
# Browser visit port, 80 as usual, THIS IS NOT SERVER LISTEN PORT!
serverPort=8080
调整后,重启tomcat,再次验证,OK,结果如下:
至此,自动化CI环境搭建完成,你可以模拟提交代码并打tag测试自动化发布流程。
八、问题总结:
查看docker.sock权限
[root@node03 ~]# ll /var/run/docker.sock
srw-rw---- 1 root docker 0 9月 4 21:55 /var/run/docker.sock
解决方法:【免sudo 使用docker images 】
[root@node03 ~]# sudo groupadd docker
##groupadd:“docker”组已存在
[root@node03 ~]# sudo gpasswd -a jenkins docker
##正在将用户“jenkins”加入到“docker”组中
[root@node03 ~]# sudo service docker restart
##重启服务
[root@node03 ~]# newgrp - docker
##重新加载group 组信息,一定要输入这条命令,否则无法加载最新组内容,因为有缓存
Jenkins与Docker的自动化CI/CD实战的更多相关文章
- Docker: Jenkins与Docker的自动化CI/CD流水线实战
什么是CI/CD 持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈.持续部署(Continuous Deployme ...
- Jenkins 基于 Docker git JAVA CI/CD
准备两台机器 192.168.31.200 centos7 docker harbor git 192.168.31.201 centos7 docker jenkins maven git Ha ...
- 【Devops】【docker】【CI/CD】3.Jenkins+GitLab+docker+springboot 实现自动化部署
==================================================================================================== ...
- 【Devops】【docker】【CI/CD】2.docker启动jenkins环境+安装必要的插件
[注意:]jenkins的docker镜像,需要从官网进入直接获取,其他地方获取到的docker镜像,可能因为Jenkins版本过低,导致后续插件安装失败等问题!!! ================ ...
- 基于Jenkins,docker实现自动化部署(持续交互)
前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致.基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化.因此 ...
- 基于Jenkins,docker实现自动化部署(持续交互)【转】
前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致.基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化.因此 ...
- docker | jenkins 实现自动化CI/CD,后端躺着把运维的钱挣了!(下)
前言 在上一篇文章中,我们使用docker编写Dockerfile文件,将我们自己的项目构建成镜像,然后发布到Docker Hub中,并且用自己的云服务器拉取Docker Hub上我们自己上传的项目镜 ...
- Docker和CI/CD实战
一.CICD和DevOps 前面已经了解了CI/CD,其实CI/CD已经存在多年了,只是最近软件工程方面又提出了敏捷开发.DevOps,又把CI/CD炒火了. 那么什么是DevOps?DevOps和C ...
- Jenkins自动化CI CD流水线之1--介绍与安装
第1章 大纲 CI/CD, DevOps介绍 Git安装与使用 Jenkins安装与使用 权限管理 参数化构建 Master-Slave 流水线(Pipeline) 邮件通知 应用案例 自动发布PHP ...
随机推荐
- EZ 2018 04 06 NOIP2018 模拟赛(七)
我是链接 这次是真的惨,码了将近2hours的可持久化线段树炸掉了! 而且本地拍了一万年也没发现哪里炸了. T1 压位的入门题,话说这道题能拿个99分就可以了(100分要FFT) 对于暴力,就是暴力找 ...
- 重新解读DDD领域驱动设计(一)
回顾 十年前,还未踏入某校时,便听闻某学长一毕业就入职北京某公司,月薪过万.对于一个名不见经传的小学院,一毕业能拿到这个薪水还是非常厉害的.听闻他学生期间参与开发了一款股票软件,股票那时正迎来一波疯涨 ...
- Java设计模式之适配器设计模式(项目升级案例)
今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一 ...
- [算法总结] 6 道题搞定 BAT 面试——堆栈和队列
本文首发于我的个人博客:尾尾部落 0. 基础概念 栈:后进先出(LIFO) 队列:先进先出(FIFO) 1. 栈的 java 实现 import java.util.Arrays; public cl ...
- webug4.0安装
官网:https://www.webug.org/ 官方版本里安装视频教程 4.26 官网打不开,分享当初存在网盘的 链接:https://pan.baidu.com/s/13rG0TLwuA3Ro0 ...
- 微软职位内部推荐-Service Engineer for Office365
微软近期Open的职位: Key Responsibilities: The Service Engineer in this team will be responsible for plannin ...
- Individual Project Records
At the midnight of September 20, I finished my individual projcet -- a word frequency program. You c ...
- 《Linux内核分析》 第三周 构造一个简单的Linux系统MenuOS
Linux内核分析 第三周 构造一个简单的Linux系统MenuOS 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...
- 20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 第六周 进程的描述 ...
- Qrcode生成二维码的参数总结 及最小尺寸的测试
Qrcode生成二维码,做过很多实验,探索最小规格的二维码到底是多少尺寸,和最高规格的二维码到底是多大尺寸.现在我总结总结: 有两种思路: 1.生成规格高的二维码,然后压缩到自己想要的尺寸的二维码.这 ...