Jenkins+Docker+git+Springboot 持续集成自动化部署
阅读原文时间:2021年04月20日阅读:1

1、前述

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

2、架构流程图

3、环境搭建

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

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


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

配置 git 并且测试

如果仓库是私有的,则需要认证添加 git ssh key
参考:git 安装配置
3.4 Jenkins 服务器安装 maven 或者在 Jenkins 管理页面上安装 maven 插件,用来打包代码,将 maven 的setting.xml 里的镜像仓库换成阿里云的,速度会快些

四、新建 Jenkins 任务并配置

4.1 新建一个自由风格的软件项目

4.2
4.3
4.4
4.5

  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 构建失败

    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)点击立即构建,本文采用的是手动构建,在任务配置里,可以选择定时构建等多种构建方式

2)构建成功
点击 build history 刚才的构建,点击控制台输出,就可以看到如下成功的信息

3)服务器执行命令 docker logs -f -t 100 容器 id 就可以看到项目的实时日志

注意事项:
1)出现下图所示的错误时,可能是由于容器已经在跑了,没有被删除,所以导致无法启动新的容器,

2)当在执行 dockerRun.sh 脚本这一步的时候,如果报错无法找到容器删除,可以去脚本里把删除容器的这个操作先去掉,重新 jenkins 构建一次 ,等跑起来以后,再加进去删除容器的那条命令,之后再次启动就不会报错了,这里有更好的解决办法,本文不做阐述
3) 构建的时候,可能有时候网络原因、远程主机太多等等原因导致 build 超时,可以在任务配置里,将 ssh server 的 exec timeout 设置稍微大点,如下所示,点击高级,进行设置

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

7.1 增加 ssh server
重复第三大点 3.2 的操作

7.2 填写远程主机 ip,并且将 Jenkins 服务器的 公钥复制妨到远程主机 authorized_keys 文件里,然后再远程主机创建 Remote Directory 目录,Test 成功即可

7.3 将 dockerBuild.shdockerRun.sh、Dockerfile 三个文件复制到,赋予脚本执行权限
7.4 远程主机安装 docker
7.5 在任务里增加一个 ssh server,下图的 faith_jenkins_ssh_02 就是 7.1 步骤中新增的远程主机

7.5 保存退出,重新构建就会发现在第二台远程主机的目录下有了一个 jar 包

在 data/workspace/faith-jenkins 目录下也会有这个 jar 包
7.6 docker 命令查看启动日志,可以看到启动成功

7.7 页面访问效果

当两台服务器的项目都起来以后,可以通过设置 nginx 转发请求,分流、减少单机压力等等

八、总结

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