Jenkins实现自动化部署
一、简介
java语言开发,用于监控持续重复的工作,包括:持续的软件版本发布/测试项目,监控外部调用执行的工作。
Jenkins中文网:http://www.jenkins.org.cn/
Jenkins官网:https://www.jenkins.io/zh/
二、自动化部署原理
如图,Jenkins把一系列步骤串到一起实现自动化。
三、依赖工具
1.git
拉取代码需要git,***注意安装完要生成公钥添加到代码服务器***,不了解的可以参考 查看公钥
2.maven
编译打包需要
3.jdk
Jenkins是Java语言开发,需要Java环境
四、安装
安装方法和步骤网上很多,官网也有,针对自己的服务器系统(win、mac、Linux)选择即可。这里不再赘述,只说几个注意点
1.安装后的初始密码位置:/var/lib/jenkins/secrets/initialAdminPassword
cat /var/lib/jenkins/secrets/initialAdminPassword
2.默认构建目录:/var/lib/jenkins/workspace
每个任务都可以具体设置
3.修改Jenkins配置文件:/etc/sysconfig/jenkins ,使用 root账户运行,否则会出现权限问题 JENKINS_USER="root"
4.安装推荐的插件时,会卡在那里很久,解决办法网上很多。可以参考 Jenkins安装插件很慢
五、配置和使用
1.全局工具
maven、git
2.插件管理
git plugin、publish over ssh 原则是需要什么安装什么
3.系统配置
系统管理->系统配置->Publish over SSH
publish over ssh :远程部署,即Jenkins所在服务器通过ssh连接到应用服务器,上传jar包,执行脚本。这一步要提前配置后面要用
4.新建任务
配置如下:
a、构建一个maven项目
b、源码管理:
选择git、设置 repositories URL、Credentials(证书)选择无,因为我是通过Jenkins服务器生成公钥添加到代码管理平台、指定分支
c、pre steps:
构建前的动作,比如 切换到构建目录,清理旧构建
#!/bin/bash cd /opt/workspase/minapp mvn clean
d、build:
设置自定义工作目录,因Jenkins服务需要执行多个项目的构建 ,最好分别建立目录以区分
e、post steps:
执行shell,拷贝jar部署
注:本步骤是可选,如果应用服务器和Jenkins在一个服务器上,即本地部署
shell脚本demo:
#!/bin/bash #export BUILD_ID=dontKillMe避免被Jenkins杀掉。 export BUILD_ID=dontKillMe #找到jar包 cd /opt/workspase/minapp/guanyu-server/guanyu-server-minapp/target pwd jarName=$(find guanyu-server-minapp*.jar) echo "本次更新的包名----${jarName}----" #拷贝 cp -f ${jarName} /root/servers/ #切换目录 cd /root/servers/ PID=`ps -aux | grep guanyu-server-minapp | grep -v grep | grep -v deploy | awk '{print $2}'` echo " ---旧进程PID:${PID}--" if [ -n "$PID" ]; then echo "杀死旧的进程……" sleep 2 kill -9 $PID else echo "无旧服务……" fi echo "开始启动……" chmod +x ${jarName} nohup java -jar ${jarName} --spring.profiles.active=test &
f、构建后操作:
增加构建后操作步骤:Send build artifacts over SSH
source files :需要上传的jar包位置(相对于自定义的工作空间)
remove prefix: source files里jar包名以外的部分
remote directory:jar包上传到远程服务器的目录(继承ssh servers的remote directory,即真实上传目录为:ssh servers的remote directory+此处的remote directory)
exec command:远程服务器执行的shell脚本
高级里 exec in pty 选项要勾选,否则可能会报错
shell脚本:
#!/bin/bash #加载环境变量,否则有些服务器无法执行java source /etc/profile BASEDIR=/home/microservice/middleplatform_8980 newJar="corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar`date +"%Y-%m-%d-%H:%M:%S"`" #备份 cd $BASEDIR mv corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar ${newJar} #移动 mv /home/microservice/temp/corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar #启动 if [ -f "$BASEDIR/pid" ];then pid=$(cat $BASEDIR/pid) echo "进程号为:$pid" kill -9 $pid && rm -rf $BASEDIR/pid echo "服务关闭成功!" fi sleep 2 nohup java -jar corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar --meritdata.cloud.log.path=./logs --meritdata.cloud.log.level=debug --meritdata.cloud.log.consoleLevel=info --spring.cloud.zookeeper.connect-string=47.93.8.23:2181 --server.port=8980 --spring.profiles.active=test --spring.redis.host=119.3.254.222 --spring.redis.port=6379 --spring.redis.password=gy88623277 > middleplatform.log 2>&1 & echo $! > $BASEDIR/pid #tail -f $BASEDIR/middleplatform.log sleep 5
5.立即构建
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构