Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
以上是官方介绍,对于我们开发运维人员来讲,如果人工部署环境,需要手动从代码仓库拉代码、手动编译构建架包、停止服务器上的系统、将新架包上传到服务器替换掉旧架包,然后重新启动服务器上的系统等等工作。这些工作是很繁琐且单调的。但是借助jenkins,配置好编译步骤之后,只需要在界面点击一下就可以完成我们手工单调重复的工作。
jenkins的安装有很多种,比如docker安装,jar启动,war包利用中间件启动等等不一,方式比较简单。这里就不做多做介绍。可以自行百度。
现在主流的发布方式有war发布,jar发布等等。下面针对这几种发布方式一一介绍
一.war包发布
war包需要借助中间件来完成部署,我们针对中间件Tomcat来做介绍
思路:我们需要借助jenkins完成代码的更新,编译构建成war包,然后将包上传到我们系统服务器上特定的目录中。然后运行系统服务器上的脚本,借助脚本实现停止Tomcat中间件,用新war包替换就war包,最后再启动Tomcat中间件。
1.源码管理
上图是在jenkins上配置git地址以及拉取更新代码所需的信任凭证,通过这部操作就可以完成系统代码的更新。
2.构建触发器
上图所设置的是使用Cron表达式来实现系统的定时自动构建,上述命令是麦田晚上十点多会自动触发系统的重启。
3.构建
上图表示的构建过程,这块实现的代码拉下来到jenkins所在的服务器上之后,对代码进行构建打包。
4.构建后操作
通过前几步的操作,我们其实已经将拉去代码以及构建架包的工作已经完成。这一步操作实际上完成的就是将架包上传到系统服务器,并且更新架包重启tomcat的操作。
SSH Server:系统所在的服务器,这个需要在系统管理选项中的系统配置里面进行配置,我这里的操作就是将系统服务器的IP,用户名,密码还有相对路径都配置进prod1这个服务器中了。
Source files:配置的是jenkins上新架包所在的相对位置
Remove Prefix:配置的是所需要删除Source files的前缀
Remote directory:远程系统服务器上的相对目录,注意是我们在SSH Server里配置的相对路径
Exec command:所需要执行的命令,可以直接在此填写,也可以直接调用远程目标服务器上的sh脚本。
5.远程服务脚本
export JAVA_HOME=/usr/local/Java/jdk1.8.0_271
export JRE_HOME=/usr/local/Java/jdk1.8.0_271/jre
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
tomcat_home=/home/ectappl1/app/apache-tomcat-8.5.61
SHUTDOWN=$tomcat_home/bin/shutdown.sh
STARTTOMCAT=$tomcat_home/bin/startup.sh
echo "关闭$tomcat_home"
$SHUTDOWN
ps -ef |grep tomcat |grep $tomcat_home |grep -v 'grep'|awk '{print $2}' | xargs kill -9
sleep 5
cp /home/ectappl1/app/code/core.war /home/ectappl1/app/apache-tomcat-8.5.61/webapps/
echo "启动$tomcat_home"
$STARTTOMCAT
以上就是jenkins部署war包的部分实现。
jar包启动和war包启动的方式基本一致,无非就是远程服务脚本不一致,把tomcat启动关闭的命令改成jar启动的命令行。
二.Jenkins+Docker自动化部署
我们系统是放在一个Docker容器中部署的,比上述说的多了一层Docker,
1.后端启动
思路:还是由Jenkins更新代码,编译构建jar包。最后将jar上传到目标系统服务器上,最后使用脚本执行DockerFile文件重新构建Docker即可
源码管理,构建触发器模块配置不变,换上自己使用的地址和重启时间,下面介绍主要介绍构建部分和构建后操作部分
(1) 构建
由于我们使用的maven,所以也需要执行清理和初始化的命令。
(2) 构建后操作
我这块用了两个转换设置,因为我要上传不同文件到目标服务器上的不同位置。
这部分的是将我们后端构建的jar包放到服务器上的ods-info/target目录去,这个目录是我Dockerfile定义好的一个目录,当然这个目录可以按照自己的实际情况修改。
这部分是为了将我们Dockerfile上传的目标服务器上的manager文件中,最后在/home/ods/manager/目录下执行docker.sh脚本
docker.sh脚本如下
# 重新构建镜像
docker build -t ods-manager:latest .
# 删除正在运行的容器
docker rm -f ods-manager
#重新构建容器
docker run --name ods-manager -p 8081:80 -d ods-manager:latest
Dockerfile文件如下
FROM java:8
MAINTAINER quanbo
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
VOLUME /tmp
ADD ods-info/target/ods-info-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EXPOSE 80
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone</pre>
2.前端启动
思路:跟后端配置一样,构建方式是pnpm构建dist文件夹,将静态文件放入到配置好的nginx的index文件中,使用我们自定义的nginx.conf覆盖默认的nginx.conf文件,最后构建镜像,启动容器。
(1) 构建
这块需要自己先配置好pnpm环境,当然npm,cnpm都行,不过需要换成对应的构建命令。
(2) 构建后操作
首先,需要将nginx.conf上传到目标系统服务器的app文件夹下。
其次,将Dockerfile文件上传到目标系统服务器上的app文件夹下
最后,将前端项目打包的dist文件夹放到目标系统服务器的app文件夹下,最后进入/home/ods/app/目录,执行docker.sh脚本。
nginx.conf配置可以网上自行百度,不便透露。
docker.sh脚本如下
# 重新构建镜像
docker build -t ods-app:latest .
# 删除正在运行的容器
docker rm -f ods-app
#重新构建容器
docker run --name ods-app -p 80:80 -d ods-app:latest</pre>
Dockerfile脚本如下
FROM nginx
MAINTAINER quanbo
COPY dist/ /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/nginx.conf