zoukankan      html  css  js  c++  java
  • Jenkins与Docker的自动化CI/CD实战

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

    互联网Java架构 2018-09-19 15:46:13

    一、发布流程设计

    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

    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.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 . 
    #最后这个点。代表当前路径,在制作镜像时,会记录上下文内容
    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是上面动态获取的变量名,表示根据用户选择打代码版本。

    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 组信息,一定要输入这条命令,否则无法加载最新组内容,因为有缓存
  • 相关阅读:
    flask中程序和请求上下文
    flask的初始化
    git 强制覆盖本地代码
    python编写一个带参数的装饰器
    Android 11 unexpected LOCAL_MODULE_CLASS for prebuilts: FAKE
    systemctl自定义service执行shell脚本时报错:code=exited, status=203/EXEC
    shell应用记录
    ssm在maven项目中的需要的依赖
    swiper 5张卡片轮播图实现效果
    Codeforces 1534 题解
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/9773190.html
Copyright © 2011-2022 走看看