Jenkins+Docker+git+Springboot 持续集成自动化部署

1、前述

1、在平时开发过程中,我们经常需要部署测试环境、生产环境、开发环境等等各种环境,作者所知的部署方法是如下方法
1)本地打包 war/jar,将包上传,放到 Tomcat 启动,或者用原始命令启动
2)本地打包,服务器跑脚本来启动项目
3)服务器安装 git,进行 git 认证,在通过脚本在服务器 git 拉代码打包部署

2、架构流程图

Jenkins+Docker+git+Springboot 持续集成自动化部署_第1张图片

3、环境搭建

相信看了上面的流程图以后,大家心里对本篇文章已经有一个基本的认识了,接下来就开始实际的环境搭建,将该呈现的每一步都呈现出来

3.1 Jenkins 必要插件: git、github、publish over ssh
3.2 Jenkins 配置 Publish over ssh:
1)系统管理 -> 系统配置->Publish over ssh
2) 如下图所示配置:
这里主要是配置 Jenkins ssh key 来登录服务器,然后通过 ssh 的方式发送的远程主机,以达到远程部署的目的,一般有密码和密钥两种方式配置,本文使用密钥的方式来配置

Jenkins+Docker+git+Springboot 持续集成自动化部署_第2张图片
Passphrase:私钥 key 的密码,如果密钥使用了密码加密,则在此处进行设置。
Path to key:Jenkins master上要使用的私有 SSH密钥 的位置,路径可以是密钥的绝对路径,也可以是相对于JENKINS_HOME目录的路径。(可忽略)
Key:将服务器上的私钥粘贴到这里,密钥应包括页眉和页脚(----)以及介于两者之间的所有内容。

3)ssh server 配置
SSH Server Name:表示这个 ssh 的名字,自定义
Hostname:需要连接ssh的主机名或ip地址,此处填写应用服务器IP,本文中,Jenkins 服务器跟应用服务器一台机,所以是 127.0.0.1
Username:服务器 ssh 登录的用户名
Remote Directory:远程部署目录,Jenkins 会将包传到这个目录下

点击 Test Configuration,出现 success 就表示成功了,如果是 auth fail ,就要注意密钥是否正确以及配对成功。
可以添加多个 ssh server,发送给多个应用服务器进行部署,jenkins 配置 ssh 服务器的时候,需要在服务器生成密钥对,私钥复制到 key 值里,然后将公钥复制到 authorized_keys 文件里面去,才可以连接远程主机成功
至此 Publish over ssh 插件的配置就配置完了
3.3 Jenkins 服务器安装配置 git
Jenkins+Docker+git+Springboot 持续集成自动化部署_第3张图片
配置 git 并且测试
Jenkins+Docker+git+Springboot 持续集成自动化部署_第4张图片
如果仓库是私有的,则需要认证添加 git ssh key
参考:git 安装配置
3.4 Jenkins 服务器安装 maven 或者在 Jenkins 管理页面上安装 maven 插件,用来打包代码,将 maven 的setting.xml 里的镜像仓库换成阿里云的,速度会快些

四、新建 Jenkins 任务并配置

4.1 新建一个自由风格的软件项目
Jenkins+Docker+git+Springboot 持续集成自动化部署_第5张图片
4.2
4.3Jenkins+Docker+git+Springboot 持续集成自动化部署_第6张图片
4.4 Jenkins+Docker+git+Springboot 持续集成自动化部署_第7张图片
4.5Jenkins+Docker+git+Springboot 持续集成自动化部署_第8张图片

  1. 构建后操作这里选择 Send build artifacts over SSH
    2)SSH Server 就是前面 Publish over ssh 配置的 SSH server,由于现在都是负载均衡或者集群方式部署生产环境,所以在这里可以配置多个远程主机部署,
    Name:Publish over ssh 自定义设置的 name
    Source files: jenkins 工作空间下当前任务文件目录的相对路径源文件,这里为 var/lib/jenkins/workspace/faith-jenkins,那么这里的 Source files 就是填 target/faith-jenkins.jar
    Remove prefix:需要移除的文件前缀,如果指定了此选项,则源文件中所选的所有文件都必须以该路径前缀开始,如果选择要传输的文件且该文件不低于Remove前缀,则发布将失败。其实也就是将工作任务目录下的源文件目录移除掉,这样传输的时候就不需要在远程主机创建目录,直接将 jar/war 传输到目录下
    Remote directory:如果指定,文件将在此目录下传输(相对于 Publish over ssh 配置中指定的远程目录)。如果目录不存在,将创建它,本文为 /faith_jenkins/tmp
    Exec command:如果这个配置框中有任何内容,那么它将在远程服务器上执行。如果配置了源文件,那么将在执行Exec命令之前传输这些文件。如果命令的退出状态不为零,则发布将失败。命令执行中的STDOUT和STDERR记录在Jenkins控制台中。
    例如下所示:这次发布中,Exec command 的 exit status not zero,说明这次 Jenkins 构建失败
    Jenkins+Docker+git+Springboot 持续集成自动化部署_第9张图片
    Exec command:
    cp /faith_jenkins/tmp/faith-jenkins.jar /data/workspace/faith-jenkins
    cd /data/workspace/faith-jenkins
    ./dockerBuild.sh
    ./dockerRun.sh
    
    参考:Publish over ssh plugin

4.6 上述提供的一些文件或者文件夹是需要提前创建好的
1)/data/workspace/faith-jenkins
2) dockerBuild.sh:远程主机用来构建 docker 镜像的脚本
3) dockerRun.sh:远程主机用来启动 docker 容器的脚本
其中 dockerBuild.sh 内容为:

docker build -t faith-jenkins .
docker image prune -f 

dockerRun.sh 内容为:

docker rm -f faith-jenkins
docker run --name="faith-jenkins" -p 8010:8010 -d faith-jenkins

4)docker build -t faith-jenkins . 的意思就是在远程主机的目录下构建一个 docker 镜像,docker build 会加载当前当前上下文的 Dockerfile 文件,根据这个 Dockerfile 来创建一个文件,具体命令参考:docker 文档
5)Dockerfile:

FROM java:8
ADD faith-jenkins.jar /usr/local/jar/
# 修正 docker 容器里面的时间
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
#声明暴漏端口,这里一般不强制,因为我们通常用 docker -p port:port 来映射端口,以达到访问容器内部的目的
EXPOSE 8010
CMD ["java","-jar","/usr/local/jar/faith-jenkins.jar"]

这里要注意的两点是:
1)当我们的项目用到了数据库(mysql、redis)的时候,我们要注意容器内部能否访问到 db,docker 与宿主机有四种网络模式,当网络没有共享的时候,docker 容器内部是无法用 localhost 这样的方式来连接数据库的,同时也要注意数据库是否 public 以及 ip 、port 是否允许
2) 一般来说,如果我们的项目有产生文件的时候,需要用 docker -v 来将内部的文件数据卷挂载到我们的宿主机目录,docker 容器关闭以后,内部数据是无法持久化的

docker -v 宿主机目录:容器目录

说明:本文演示一个大概的流程,所以这里直接采用 java -jar 的方式来启动 jar 包,一般来说,我们会将 jar 包放进 web 容器来启动项目

至此我们 jenkins 的一个任务就是配置完了,接下来就是应用服务器安装 docker
五、安装 docker
根据不通的 linux 内核版本安装 docker,这里就不多做阐述了
六、jenkins 构建项目
1)点击立即构建,本文采用的是手动构建,在任务配置里,可以选择定时构建等多种构建方式
Jenkins+Docker+git+Springboot 持续集成自动化部署_第10张图片
2)构建成功
点击 build history 刚才的构建,点击控制台输出,就可以看到如下成功的信息
Jenkins+Docker+git+Springboot 持续集成自动化部署_第11张图片
3)服务器执行命令 docker logs -f -t 100 容器 id 就可以看到项目的实时日志
Jenkins+Docker+git+Springboot 持续集成自动化部署_第12张图片

注意事项:
1)出现下图所示的错误时,可能是由于容器已经在跑了,没有被删除,所以导致无法启动新的容器,
Jenkins+Docker+git+Springboot 持续集成自动化部署_第13张图片
2)当在执行 dockerRun.sh 脚本这一步的时候,如果报错无法找到容器删除,可以去脚本里把删除容器的这个操作先去掉,重新 jenkins 构建一次 ,等跑起来以后,再加进去删除容器的那条命令,之后再次启动就不会报错了,这里有更好的解决办法,本文不做阐述
3) 构建的时候,可能有时候网络原因、远程主机太多等等原因导致 build 超时,可以在任务配置里,将 ssh server 的 exec timeout 设置稍微大点,如下所示,点击高级,进行设置
Jenkins+Docker+git+Springboot 持续集成自动化部署_第14张图片

七、配置多台应用服务器,满足负载均衡

7.1 增加 ssh server
重复第三大点 3.2 的操作
Jenkins+Docker+git+Springboot 持续集成自动化部署_第15张图片
7.2 填写远程主机 ip,并且将 Jenkins 服务器的 公钥复制妨到远程主机 authorized_keys 文件里,然后再远程主机创建 Remote Directory 目录,Test 成功即可
Jenkins+Docker+git+Springboot 持续集成自动化部署_第16张图片
7.3 将 dockerBuild.sh、dockerRun.sh、Dockerfile 三个文件复制到,赋予脚本执行权限
7.4 远程主机安装 docker
7.5 在任务里增加一个 ssh server,下图的 faith_jenkins_ssh_02 就是 7.1 步骤中新增的远程主机
Jenkins+Docker+git+Springboot 持续集成自动化部署_第17张图片
7.5 保存退出,重新构建就会发现在第二台远程主机的目录下有了一个 jar 包

在 data/workspace/faith-jenkins 目录下也会有这个 jar 包
7.6 docker 命令查看启动日志,可以看到启动成功
Jenkins+Docker+git+Springboot 持续集成自动化部署_第18张图片
7.7 页面访问效果
Jenkins+Docker+git+Springboot 持续集成自动化部署_第19张图片
当两台服务器的项目都起来以后,可以通过设置 nginx 转发请求,分流、减少单机压力等等

八、总结

通过本文,大概了解了Jenkins+docker+git 持续发布以及自动化部署的大概流程,当然还有其他很多更加优秀的方法和技术,值得作者去学习,文中若有不理解或者错误的地方,还望不吝赐教。

你可能感兴趣的:(Jenkins,docker)