一.为什么要使用Jenkins,到底有什么好处?
传统部署:通过maven命令:mvn clean install "-Dmanven.test.skip=true" -Pprod 将项目打一个jar,然后通过xftp上传到服务器,xshell上面启动项目(nohup java -jar xxxx.jar > xxxx.out 2>&1 & )通过上述操作,繁琐还容易出错。而 Jenkins 只需要你打开网页、选择已维护好的项目,点击构建就可以了。
二.安装Jenkins
安装JDK jdk 安装
下载 Jenkins ,我们采用下载war
官网下载:Jenkins
镜像下载:阿里云开源镜像站资源目录
在服务器opt目录下创建一个jenkins目录,并把下载好的jenkins.war上传到这个目录下面
启动jenkins
nohup java -jar jenkins.war --httpPort=9090 >jenkins.out 2>&1 &
nohup 是为了关闭窗口 jenkons程序不关闭,httpPort 为jenkins指定 端口
三.jenkins设置
浏览器打开 http:// 服务器IP :9090
需要输入管理员密码,并提示你密码的存放位置
cat /root/.jenkins/secrets/initialAdminPassword
这个看情况选择:可以选择“安装推荐的插件”,也可以“选择插件安装” 个人喜好自定义安装(选项2)
四.项目配置
jenkins 全局配置:jdk、maven信息
设置JDK linux 安装JDK
设置git (默认的就可以了)
设置maven linux 安装 maven
设置SSH Servers
找到:publish-over-ssh 进行安装
然后在 "系统管理" -> "系统配置" 中找到 SSH Servers 新增
如有多台服务器,就点击新增继续添加。
设置linux执行脚本(如果嫌麻烦,也可以在 jenksin SSH Publishers 里面设置,下面会介绍)
先创建bin目录编写一个sh脚本(如果自己创建的txt修改的后缀名,需要注意编码格式UTF-8)
脚本信息为:
#!/bin/bash
source /etc/profile
#遇到不存在的变量报错,并停止执行
set -o nounset
############# 全局变量定义 ##########
sedfun() { sed_a1=`echo $1 | awk -F '=' '{print $1}'` ; sed -i 's#^'$sed_a1'[[:space:]]*=.*#'"$1"'#g' ${File_Path} ; }
ObjectName=$1
JarName=$1.jar
#项目部署根目录
API_ROOT=/app/${ObjectName}
#项目jar临时上传目录
TMP_DIR=/app/${ObjectName}/tmp
##历史版本备份目录
SubjectBack=/app/${ObjectName}/backup
#Logs_Dir=/app/${ObjectName}/logs
echo "============[基础配置信息]==============="
java -version
echo "项目部署根目录:"${API_ROOT}
echo "项目JAR名称:"${JarName}
echo "项目JAR临时目录:"${TMP_DIR}
echo "项目历史备份目录:"${SubjectBack}
echo "======================================"
echo "============[发布项目开始]============"
if [ ! -d "${API_ROOT}" ]; then mkdir -p ${API_ROOT}; fi
if [ ! -d "${SubjectBack}" ]; then mkdir -p ${SubjectBack}; fi
#if [ ! -d "${Logs_Dir}" ]; then mkdir -p ${Logs_Dir}; fi
############### 关闭当前主机项目 ###################
echo "============[关闭服务开始]============"
PID=`ps -ef|grep java|grep "${JarName}"|grep -v grep|awk '{print $2}'`
if [ "${PID}" ];then ps -ef|grep java|grep "${JarName}"|grep -v grep|awk '{print $2}'|xargs kill -9;fi
echo "============[关闭服务完成]============"
################## 备份当前项目 ########################
echo "============[备份项目开始]============"
if [ -e "${API_ROOT}/${JarName}" ]; then mv -f ${API_ROOT}/${JarName} ${SubjectBack}/${JarName}; fi
if [ -e "${TMP_DIR}/${JarName}" ]; then mv -f ${TMP_DIR}/${JarName} ${API_ROOT}/${JarName}; fi
if [ -e "${SubjectBack}/${JarName}" ]; then cp -rf ${SubjectBack}/${JarName} ${SubjectBack}/${ObjectName}_`date +%Y-%m-%d-%H%M%S`.jar; fi
cd ${SubjectBack}&&ls -t ${SubjectBack} | awk '{if(NR>6){print $1}}'|xargs rm -f #保留最近5个版本压缩文件
echo "============[备份项目完成]============"
############### 启动当前项目 ###################
#cd ${API_ROOT}&&nohup java -jar ${JarName} & ###后台执行无反馈结果
#jenkins中使用nohup须加上这句
#BUILD_ID=dontKillMe
echo "============[项目启动开始]============"
cd ${API_ROOT}&&nohup java -jar ${API_ROOT}/${JarName} >/dev/null 2>&1 &
echo "============[项目启动完成]============"
准备工作到此结束
五.设置项目
项目我们已 hello word 一. 创建一个简单的spring-boot项目,实现hello world 为例
1.新建item
2. 构建一个maven项目
如果列表中没有 “构建一个maven项目” 选择?
找到 Maven Integration Plugin 下载 安装好,重启即可。
3.基础设置
选择丢弃旧的构建
参数化构建过程
如果选择中没有git参数(系统管理-插件管理->可选插件中找到git相关的安装)
在Branches to bulid 中使用上面配置好的git参数 指定分支填写: ${branch}
4.设置 git 地址 这里已 创建一个简单的spring-boot项目,实现hello world 项目为例子
Credentials 表示git 账号和密码,可以添加旁边的添加按钮,添加账号跟密码信息
5.设置打包命令 spring-boot-demo 表示项目名称
clean package -Dmaven.test.skip=true
6.设置路径
ssh server name: 为上面准备工作中 ssh server中设置的,在这里只能选择
(原文件)Source files : target/spring-boot-demo.jar
(删除前缀)Remove prefix : target/
(远程目录)Remote directory:/app/spring-boot-demo/tmp
注:我是提前创建好了,需要注意文件夹权限,权限过低jenkins会构建成功但项目没有启动
(执行命令)Exec command:
source /etc/profile
nohup sh /app/bin/restart.sh spring-boot-demo >/dev/null 2>&1 &
注意:如果不创建 restart.sh 就讲 restart.sh里面的内容复制粘贴到 Exec command 中
如果你的项目做了负载均衡,部署在两台服务器上面,可以点击add server 继续添加
六 .从jenkins 启动项目,测试
配置好,可以在列表中查看配置的项目
进入项目管理界面,可以构建项目、修改、删除等项目
这里选择分支有什么作用了?
一般项目会分为(master)主干分支、(develop) 开发分支、(release)预发布分布等便于管理
点击立即构建->选择控制台输出->查看一下日志
日志显示构建成功,并且成功上传一个文件到另外一台服务器
为了清楚展示,使用xftp展示目录结构
查看服务是否启动
通过postman 访问查看
服务访问成功