介绍centos系统上安装Jenkins部署Spring Boot项目流程,并通过github Webhooks通知Jenkins代码更新信息并自动重新部署项目。
yum install JAVA-1.8.0-openjdk* -y java -version
能显示版本即安装成功,无需再配置环境
个人的Maven安装目录是/usr/bin/maven:
mkdir /usr/bin/mavenwget http://mirror.bit.edu.cn/Apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gztar xzvf apache-maven-3.6.3-bin.tar.gzcd /usr/bin/maven/apache-maven-3.6.3/conf
将settings.xml仓库更改为阿里云仓库并配置服务器仓库路径,如本地已有Maven配置文件,直接把本地文件上传到服务器并更改仓库路径即可(推荐一款有理想的国产SSH工具-FinalShell,可直接拖到文件到指定文件夹)
配置Maven环境变量(vi /etc/profile):
export M2_HOME=/usr/bin/maven/apache-maven-3.6.3PATH=$M2_HOME/bin:$PATH
保存退出,source /etc/profile重载环境变量,mvn -v能正确显示maven版本即配置成功
Jenkins安装命令:
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.reporpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.keyyum install -y jenkins
修改配置文件vi /etc/sysconfig/jenkins并将端口号配置为8500:JENKINS_PORT=“8500”
jenkins启动相关指令:
service jenkins start #启动service jenkins restart #重启service jenkins stop#停止
初始密码在/var/lib/jenkins/secrets/initialAdminPassword文件中,访问http://ip:8500/安装推荐插件。
配置maven、git、email并Save,其中maven与git配置为必须,maven配置用于jenkins找到mvn指令位置,git用于jenkins从仓库拉取文件:
配置全局工具路径,主要配置JDK、Git、Maven并Save:
注:java地址可通过ls -lrt /etc/alternatives/java查找,截取jre之前的路径。
如果需要构建Jenkins的Maven项目则需安装Maven Integration插件,但使用jenkins maven插件创建的项目执行mvn install后就会显示sucess,如需再执行指令设置构建unstable的话使用Freestyle项目也可。由于Freestyle的把控性更强且更自由,配置了maven环境后也可通过maven指令构建而不需再按照Jenkins Maven Integration插件,所以该文着重介绍Freestyle且更推荐使用Freestyle构建。
1. 配置项目github地址,git Credentials可使用用户名密码或SSH key
2. 配置执行脚本
BUILD_ID=DONTKILLME# 获取正在运行的ecs-Application程序pidpid=$(ps -aux|grep ecs-application | grep -v grep| gawk '{print $2}')if [ ${#pid} != 0 ] then kill -9 $pidficd /var/lib/jenkins/workspace/ecs-applicationmvn clean packagenohup java -jar /var/lib/jenkins/workspace/ecs-application/target/ecs-application.jar -Xmx512m -Xms512m -Xss4m &pid=$(ps -aux|grep ecs-application | grep -v grep| gawk '{print $2}')# 获取正在运行的ecs-application的pid并判断其字符串长度,0为不存在(即构建失败)if [ ${#pid} == 0 ] then echo "***** BUILD FAILED ******" exit 1 else echo "***** BUILD SUCCESS *****"fi
需要注意的是Jenkins执行脚本中若不添加BUILD_ID=DONTKILLME的话则会在执行完脚本后会把脚本中的程序关闭。jenkins创建的所有项目都可以在/var/lib/jenkins/workspace中找到。为了避免程序运行失败结果却显示成功,当执行程序后pid不存在则exit 1,且需设置build unstable符号值,如下图:
如有邮箱发送需求也可在Post-build Actions设置Email Notification
3.构建
直接在项目Build Now或在jenkins主页面中点击项目最右侧符号即可。通过项目Workspace可查看/var/lib/jenkins/workspace当前项目中的所有文件,将日志文件配置为该workspace目录下文件时即可查看当前程序的运行日志,如在jenkins查看当前项目日志/var/lib/jenkins/workspace/ecs-application/logs/info.log:
附日志配置文件logback-spring.xml(为了出错更容易定位添加error.log配置):
<?xml version="1.0" encoding="UTF-8"?><configuration debug="true" scan="true"> <!-- 文件输出格式 --> <property name="PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) %-5level [%thread] %c [%L] : %msg%n"/> <!-- log文件路径 --> <property name="LOG_PATH" value="/var/lib/jenkins/workspace/ecs-application/logs"/> <!--彩色日志定义--> <property name="CONSOLE_LOG_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %([%thread]) %cyan(%logger) : %msg%n"/> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <charset>UTF-8</charset> <pattern>${CONSOLE_LOG_PATTERN}</pattern> </encoder> </appender> <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOG_PATH}/info.log</File> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>${PATTERN}</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_PATH}/info.%d{yyyy-MM-dd}.log.zip</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> </appender> <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOG_PATH}/error.log</File> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <charset>UTF-8</charset> <pattern>${PATTERN}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.log.zip</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> </appender> <springProfile name="dev"> <root level="info"> <appender-ref ref="console"/> <appender-ref ref="info"/> <appender-ref ref="error"/> </root> </springProfile></configuration>
4. 配置Webhook
每次推完代码之后都要上Jenkins重新点击启动项目,这肯定是很麻烦的,但可以通过安装Webhook插件,让github或gitlab接收到代码更新后把该信息发送到服务器jenkins上,让jenkins自动去拉代码重新部署项目。在Jenkins插件管理安装Generic Webhook Trigger Plugin插件:
当然了,只装不看就没有用了,点击插件看一下了解一下用法:
该Webhook插件的一个规则是接收所有HTTP请求,接收地址为JenkinsURL/generic-webhook-trigger/invoke 。既然有接收地址自然有发送地址,github配置Webhook入口在项目的Settings菜单下,配置如下:
虽然配置了github Webhooks,但Jenkins接收到github的消息后仍不知要更新哪个项目,因为可能jenkins下有多个同一github地址下的项目,此时就需要对Jenkins的项目进行Webhook配置了。上图中的URL地址栏添加了token参数,该参数是根据Jenkins的Webhook插件规则配置的。Jenkins安装Webhook插件后Jenkins项目Configure中的Build Triggers中会出现Generic Webhook Trigger选项,勾选该选项Jenkins即可监听到该项目对应的github仓库代码更新后自动重新部署项目。为了提高安全性可以在地址栏参数或header添加Token。
注:如果没有硬件防护建议开启防火墙只暴露有需要的端口,避免服务器被挖矿(亲身体验),相关指令如下(在本文中的服务器是进行了8500端口的开放):
重启:firewall-cmd --reload
永久开放端口:firewall-cmd --zone=public --add-port={port}/tcp --permanent
永久关闭端口:firewall-cmd --remove-port={port}/tcp --permanent
查看开放端口:firewall-cmd --list-ports
关闭防火墙命令:systemctl stop firewalld.service
开启防火墙:systemctl start firewalld.service
更多指令可通过tab键或firewall-cmd -h查看
在实际生产中如果项目只有几个人负责没有更多的要求的话按以上流程就基本可以完成项目的自动部署流程了(曾经工作过的小公司大致流程跟以上差不多,开发公众号时自己一个负责也就没有太多的Jenkins鉴权管理),当然git的分支也可能需要切换,当项目有一定规模开发人员有一定数量时则必须做好权限的管理了,把分支的整合部署集权在少数人少,避免每次的小更改都需重新部署。以上流程看看就好,因为没必要记住自己吃过多少面包片,了解一些吃法就行。