Jenkins与Docker的自动化CI/CD实战

2018年9月20日14:05:05 4 16,758 views
摘要

基于Docker拟定代码发布流程,使用jenkins 协助开发人员,进行 CI/CD 持续开发、持续交付;

广告也精彩

一、发布流程设计

Jenkins与Docker的自动化CI/CD实战
Jenkins与Docker的自动化CI/CD实战

更多精彩:

Jenkins+git相关文章

docker容器相关文章

工作流程:

开发人员提交代码到Git版本仓库;
Jenkins人工/定时触发项目构建;
Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;
Jenkins在Docker主机创建容器并发布。

# 二、环境规划:

角色 IP
Git/Registry 192.168.56.11
Docker 192.168.56.12
Jenkins/Docker 192.168.56.13

三、 部署过程

1,部署git

如果公司内部有直接克隆就可以

git clone git@192.168.0.31:/home/git/solo.git

2,部署Jenkins环境

如果您是初学者,建议您先看下:Devops-持续集成之 jenkins+gitlab 快速部署

Jenkins与Docker的自动化CI/CD实战

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.dgstack.cn
#他的爸爸是谁

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  .   
    #最后这个点。代表当前路径,在制作镜像时,会记录上下文内容

Jenkins与Docker的自动化CI/CD实战

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与Docker的自动化CI/CD实战

五、Jenkins 配置

1.主页面 -> 系统管理 -> 全局工具配置

指定JDK、Maven路径,Git保持默认:
Jenkins与Docker的自动化CI/CD实战

2.jenkins安装必要插件

主页面 -> 系统管理 ->管理插件:

安装SSH与Git Parameter插件。

插件说明:
》SSH:用于SSH远程Docker主机执行Shell命令
》Git Parameter:动态获取Git仓库Branch、Tag

Jenkins与Docker的自动化CI/CD实战

3,配置SSH插件
第一步:先创建一个用于连接Docker主机的凭证 (有权限的用户)
主页面 -> 凭据 -> 系统 -> 右击全局凭据 -> 添加凭据:
Jenkins与Docker的自动化CI/CD实战
输入连接Docker主机的用户名和密码:
Jenkins与Docker的自动化CI/CD实战
第二步:添加SSH远程主机
主页面 -> 系统管理 -> 系统设置 -> SSH remote hosts:
Jenkins与Docker的自动化CI/CD实战

问题:当以普通用户身份去使用docker images时,出现以下错误:

Jenkins与Docker的自动化CI/CD实战

六、将从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与Docker的自动化CI/CD实战

七、Jenkins创建项目并发布测试

1.主页面 -> 新建任务 -> 输入任务名称,构建一个Maven项目:
Jenkins与Docker的自动化CI/CD实战
注意:如果没有显示“构建一个Maven项目”选项,需要在管理插件里安装“Maven Integration plugin”插件。
配置Git参数化构建:
Jenkins与Docker的自动化CI/CD实战

2.动态获取Git仓库tag,与用户交互选择Tag发布:【也可以设置分支】
Jenkins与Docker的自动化CI/CD实战
3.指定项目Git仓库地址:
Jenkins与Docker的自动化CI/CD实战
修改*/master为$Tag,Tag是上面动态获取的变量名,表示根据用户选择打代码版本。
clean package 创建包,不做单元的测试

4.设置maven构建命令选项:

 clean package -Dmaven.test.skip=ture

Jenkins与Docker的自动化CI/CD实战
利用pom.xml文件构建项目。
在Jenkins本机镜像构建与推送到镜像仓库,并SSH远程连接到Docker主机使用推送的镜像创建容器:

Jenkins与Docker的自动化CI/CD实战

上图中 命令内容如下:

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

Jenkins与Docker的自动化CI/CD实战

上图中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,开始构建:

Jenkins与Docker的自动化CI/CD实战

Jenkins与Docker的自动化CI/CD实战

点击左下角构建历史里,右击第一个查看控制台输出:
Jenkins与Docker的自动化CI/CD实战

构建详细内容

Jenkins与Docker的自动化CI/CD实战

构建成功


访问:192.168.56.12:8080 查看部署结果

Jenkins与Docker的自动化CI/CD实战

调整项目访问地址

进入容器,切换到项目目录

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,结果如下:
Jenkins与Docker的自动化CI/CD实战

至此,自动化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

Jenkins与Docker的自动化CI/CD实战

解决方法:【免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 组信息,一定要输入这条命令,否则无法加载最新组内容,因为有缓存

测试实例

执行过程

cd /data/dockerfile/

mkdir 项目名

cd 项目名
把 build.sh catalina.sh Dockerfile 复制过来

vim build.sh #脚本如下
#改成要解析的域名 dgstack.cn #域名做bind解析,确定可以使用域名拉取镜像

mkdir ROOT
cd ROOT
项目传进来

#cd /data/dockerfile/项目名
./build.sh  testEnv  #脚本如下
如果启动报错,请检查dockerfile文件,把注释打开或者关闭



# cd /root/fuqin  #改端口   cp复制一个新的启动文件,脚本如下
 ./app.sh redeploy

build.sh

#!/bin/bash
if [ -z "$1" ]; then
   echo "Usage error please input docker version . exit"
   echo "./build.sh [ver]"
exit 2
fi
docker build --no-cache=true -t "docker.78dk.com:5000/test.dgstack.com:$1" .
docker push docker.78dk.com:5000/test.dgstack.com:$1

app.sh

#!/bin/bash
#
#tag=v`date +%Y%m%d`
tag=devEnv
name="dev.dgstack.com"
port=708
log=/var/logs/$name
image="docker.78dk.com:5000/test.dgstack:$tag"

run(){
        docker run -it -d \
                --name $name  \
                -p $port:8080  \
                -v $log:/tomcat7/logs \
        "$image"
}
pullimage(){
        docker pull $image
        if [ $? -ne 0 ];then
                echo "Docker pull $image fail."
                exit 1
        fi
}

case $1 in
        deploy)
                pullimage
                run
                ;;
        redeploy)
                pullimage
                docker stop $name
                docker rm $name
                run
                ;;
        *)
                echo "Usage: $0 [deploy|redeploy]"
                ;;
esac


  • QQ精品交流群
  • weinxin
  • 微信公众号
  • weinxin
广告也精彩
admin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:4   其中:访客  2   博主  2

    • avatar 广告语 1

      写的真详细 :grin: :grin: :grin:

      • avatar 烤关 1

        真棒,感谢博主帮踩坑,顺利的完成公司任务