构建发布
jenkins
发布项目的过程可以总结为4个步骤
- 拉取代码
- 编译打包(mvn或npm)
- 部署至应用服务器(scp命令)
- 启动应用
SpringBoot项目发布
- 准备
SpringBoot
项目这里我继续以上面Maven集成模块的代码为例,添加应用访问的接口和端口,并将代码提交至Gitee
浏览器访问本地的服务是否启动成功
提交代码并推送至Gitee(此处你也可以使用Git命令的方式)
弹出登录提示,输入用户名密码
在Gitee上检查到代码推送成功
- 添加
Maven
风格的任务填写Gitee仓库地址
填写Maven构建操作项
- 配置Post Steps,选中执行shell
思考,这里我们需要执行的shell内容是什么?
是不是把当前编译好的jar包拷贝到应用服务器去启动
应用服务器规划
由于
jenkins
构建消耗内存极大,一般jenkins是一台单独的工具机器,Java项目一般在其他的机器上,这里我重新安装一台虚拟机,有条件的同学可以直接开通阿里云的ECS应用服务器信息
- IP:192.168.1.2
- JDK:1.8(安装过程省略)
- user:admin
- 部署路径:/data/app/it235-boot
- 端口:9010
配置ssh免密登录
免密登录主要是方便jenkins服务器的jenkins用户—》应用服务器的admin用户上的jar包拷贝,部署本就是jar包拷贝的过程
在jenkins机器上使用jenkins用户生成秘钥
$ su jenkins $ ssh-keygen -t rsa # 3次回车
运行后会在当前用户的根目录生成一个.ssh文件夹
.ssh文件夹中的文件描述
id_rsa
: 生成的私钥文件id_rsa.pub
: 生成的公钥文件know_hosts
: 已知的主机公钥清单
接下来需要将公钥导入到认证文件中
$ su jenkins $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
如果希望ssh公钥生效需满足至少下面两个条件:
.ssh
目录的权限必须是700.ssh/authorized_keys
文件权限必须是600
给对应文件授权
$ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
将
authorized_keys
文件拷贝到应用服务器的admin用户.ssh目录下# 在应用服务器(192.168.1.2)上用admin用户创建/home/admin/.ssh文件夹 # 在jenkins服务器(192.168.1.195)上将pub公钥文件拷贝到应用服务器的.ssh目录下,并命名为authorized_keys $ scp -p ~/.ssh/id_rsa.pub admin@192.168.1.2:/home/admin/.ssh/authorized_keys
在jenkins服务器上进行免密连接测试
# 在jenkins服务器的/home/admin目录下创建filetest文件,并拷贝到应用服务器 $ cd ~/ $ touch filetest $ scp -p filetest admin@192.168.1.2:/home/admin/filetest # 进入到应用服务器(192.168.1.2),检查/home/admin目录下是否出现filetest # 在jenkins服务器上使用ssh进行免密连接测试,成功后会出现Last Login的提示 $ ssh admin@192.168.1.2 Last login: Sun Sep 20 21:53:03 2020 $ exit
- 到此免密登录和拷贝实现成功,为接下来jar包部署提供了快捷的帮助
编写
jenkins
发布脚本#!/bin/bash echo "部署的目录和项目名称" DIR="/data/app" projectName="it235-boot" echo "待部署的应用服务器,可多台" server_ips="192.168.1.2" for server_ip in ${server_ips[@]} do echo "ssh连接进行备份操作" ssh -Tq -oStrictHostKeyChecking=no admin@${server_ip} <<EOF mkdir -p $DIR/backup/${projectName} if [ -f "$DIR/${projectName}/${projectName}.jar" ];then mv $DIR/${projectName}/${projectName}.jar $DIR/backup/${projectName}/${projectName}-`date "+%Y%m%d_%H%M%S"`.jar fi EOF echo "拷贝jar包到目标服务器的tmp目录" scp -q -oStrictHostKeyChecking=no ${WORKSPACE}/target/*.jar admin@${server_ip}:/tmp/${projectName}.jar echo "ssh远程连接进行发布操作" ssh -q -oStrictHostKeyChecking=no admin@${server_ip} <<EOF mv /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jar EOF done echo "success"
编写应用启动脚本
在
/data/app/it235-boot
目录下创建启动脚本$ touch start.sh $ vim start.sh # 将下面代码粘贴到start.sh中
#!/bin/bash set -e #任何命令出错就退出 set -o pipefail APP_ID=it235-boot APP_DIR="/data/app" nohup java -Dspring.profiles.active=dev -jar ${APP_DIR}/${APP_ID}/${APP_ID}.jar > release_out.log & start_ok=false if [[ $? = 0 ]];then sleep 3 tail -n 10 release_out.log sleep 5 tail -n 50 release_out.log fi aaa=`grep "Started" release_out.log | awk '{print $1}'` if [[ -n "${aaa}" ]];then echo "Application started ok" exit 0 else echo "Application started error" exit 1 fi
在
/data/app/it235-boot
目录下创建停止脚本$ touch stop.sh $ vim stop.sh # 将下面代码粘贴到stop.sh中
#!/bin/bash APP_ID=it235-boot ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh
- 并进行启动和停止测试,查看日志输出是否正常
将下述启动代码配置
jenkins
中sh $DIR/${projectName}/stop.sh sh $DIR/${projectName}/start.sh
访问并测试代码是否生效
如果是虚拟机则需要给防火墙添加9010端口
$ su root # 开启防火墙9010端口 $ firewall-cmd --zone=public --add-port=9010/tcp --permanent # 使配置生效 $ firewall-cmd --reload
- 如果是ECS则需要在安全组中开放9010端口(此处省略)
- 此外也可以采用Nginx映射(此处省略)
- 修改代码返回值,提交至Gitee,并再次进行构建发布,访问
http://192.168.1.2:9010
查看结果是否更新 到此一个简单的SpringBoot项目发布完成,但企业中的发布往往比这要复杂很多,在参数化构建章节再为您详细讲解,比如:
- 自动构建
- 按分支发布
- Tag发布
- 节点发布
- 流水线发布等等,