Jenkins流水线发布实战:React+SpringBoot全栈部署

1016 字
5 分钟
Jenkins流水线发布实战:React+SpringBoot全栈部署

📝 本文基于作者实际部署经验,已在生产环境成功搭建 Jenkins 流水线,实现 React+SpringBoot 项目自动化发布。

这次搭建的项目比较常规,前端是react写的,后端是springboot,并且由于是全栈开发,所以是在同一个项目中。接下来我演示下怎么用jenkins进行自动化发布。

1.jenkins必装插件#

这里用到的是jenkinsFile主要是基于Groovy这个沙盒,有些前置插件。这里使用maven进行打包,所以需要Maven Integration plugin和Pipeline Maven Integration Plugin。Pip这个是由于后面的语法withMaven要用。 NodeJs打包前端要用到NodeJS Plugin和Pipeline: Nodes and Processes。 jenkins是部署在运维机,所以要对远端的服务器进行发布,要用到SSH Agent Plugin。

所以总共要用到这些插件:Maven Integration plugin、Pipeline Maven Integration Plugin、NodeJS Plugin、Pipeline: Nodes and Processes、SSH Agent Plugin。

2.配置工具#

这里有两种方式,一种是自动安装,一种就是用你本地的配置,其实两种都没差。用本地的话,就是多配置一下目录。这里要注意的是,如果你是docker部署的jenkins并且需要给jenkins做读写权限,要给目录授权下,代码如下:

Terminal window
#jenkins默认就是1000:1000
chown -R 1000:1000 /opt/apache-maven-3.6.3/

其他的就简单截图。

Jenkins配置Maven工具路径
Jenkins配置Maven工具路径
Jenkins配置NodeJS工具路径
Jenkins配置NodeJS工具路径
Jenkins全局工具配置界面
Jenkins全局工具配置界面
Jenkins配置Git工具
Jenkins配置Git工具
Jenkins配置JDK工具
Jenkins配置JDK工具

3.配置令牌#

你拉代码会涉及到git的账号密码,你发送远端服务器会涉及到服务器的密钥,这边点进去根据自己需要配置就好。

Jenkins添加GitLab访问令牌凭证
Jenkins添加GitLab访问令牌凭证
Jenkins配置SSH密钥凭证
Jenkins配置SSH密钥凭证

4.创建项目#

创建很简单,主要就是看你jenkinsFile怎么写,我这里会提供简单参考。这里有个踩坑,EOF换行之后前面一定不能有空格。

Jenkins项目配置Jenkinsfile流水线脚本
Jenkins项目配置Jenkinsfile流水线脚本

//git仓库配置
def coding = [:]
coding.GIT_REPO_URL="xxx"
coding.CREDENTIALS_ID="xxx"
coding.GIT_BUILD_REF="xxx"
//远端服务器配置
def serverConfig = [:]
serverConfig.credentialsId="xxx"
serverConfig.ip = "xx"
serverConfig.username = "root"
serverConfig.port = 22
//项目名称
ADMIN_PROJECT_NAME="xxx-admin-server-0.0.1-SNAPSHOT"
MOBILE_PROJECT_NAME="xxx-weixin-server-0.0.1-SNAPSHOT"
pipeline {
agent any
tools {
nodejs "NodeJS-20.15.0"
maven "maven-3.6.3"
}
stages {
stage('测试打包工具') {
steps {
sh 'node -v'
withMaven(maven: 'maven-3.6.3') {
sh 'mvn -v'
}
}
}
stage("检出") {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: coding.GIT_BUILD_REF]],
userRemoteConfigs: [[url: coding.GIT_REPO_URL, credentialsId: coding.CREDENTIALS_ID]]
])
}
}
stage('common打包') {
steps {
dir('xxx-common-module') {
withMaven(maven: 'maven-3.6.3') {
sh 'mvn clean install'
}
sh 'cp target/xxx-common-module-1.0.jar /opt/apache-maven-3.6.3/lib'
}
}
}
stage('管理端打包') {
steps {
//编译前端
dir('xxx-admin-server/front') {
sh 'npm install'
sh 'npm run build'
}
//移动dist
sh 'rm -rf xxx-admin-server/src/main/resources/static/assets'
sh 'mv xxx-admin-server/front/dist/assets xxx-admin-server/src/main/resources/static/assets'
sh 'rm xxx-admin-server/src/main/resources/static/index.html'
sh 'mv xxx-admin-server/front/dist/index.html xxx-admin-server/src/main/resources/static/index.html'
//打包管理端项目
dir('xxx-admin-server') {
withMaven(maven: 'maven-3.6.3') {
sh 'mvn clean package'
}
}
}
}
stage('手机端打包') {
steps {
//编译前端
dir('xxx-weixin-server/front') {
sh 'npm install'
sh 'npm run build'
}
//移动dist
sh 'rm -rf xxx-weixin-server/src/main/resources/static/assets'
sh 'mv xxx-weixin-server/front/dist/assets xxx-weixin-server/src/main/resources/static/assets'
sh 'rm xxx-weixin-server/src/main/resources/static/index.html'
sh 'mv xxx-weixin-server/front/dist/index.html xxx-weixin-server/src/main/resources/static/index.html'
//打包手机端项目
dir('xxx-weixin-server') {
withMaven(maven: 'maven-3.6.3') {
sh 'mvn clean package'
}
}
}
}
stage('部署') {
steps {
echo '发布中...'
sshagent([serverConfig.credentialsId]){
// 先使用scp命令将文件复制到远程服务器
sh """
scp -o StrictHostKeyChecking=no -P ${serverConfig.port} xxx-admin-server/target/${ADMIN_PROJECT_NAME}.jar ${serverConfig.username}@${serverConfig.ip}:/www/admin/
echo "管理端发送成功"
"""
// 然后使用ssh命令在远程服务器上执行脚本
sh """
ssh -o StrictHostKeyChecking=no ${serverConfig.username}@${serverConfig.ip} -p ${serverConfig.port} << 'EOF'
echo "测试服务器连接成功"
/www/restartAdminProject.sh
echo "管理端移动完成"
EOF
"""
}
echo '发布完成.'
}
}
}
}
#!/bin/bash
# Admin 项目名称和路径
ADMIN_PROJECT_NAME="xxx-admin-server-0.0.1-SNAPSHOT"
ADMIN_PROJECT_PATH="/www/admin"
# Java 环境路径和启动参数
JAVA_HOME="/www/server/java/jdk1.8.0_371/bin/java"
JAVA_OPTIONS="-Xmx1024M -Xms256M"
JAVA_APP_OPTIONS="--server.port=9099 --spring.config.location=/www/admin/application-test.yml"
# 停止旧版本服务
pkill -f ${ADMIN_PROJECT_NAME}.jar || true
#备份旧版本
cp /www/admin/${ADMIN_PROJECT_NAME}.jar /www/admin/old-${ADMIN_PROJECT_NAME}.jar
# 移动 JAR 文件到 /www/SmartCommunity/admin,并替换旧版本
mv /www/adminxxx/${ADMIN_PROJECT_NAME}.jar /www/admin/${ADMIN_PROJECT_NAME}.jar
# 启动新版本服务
$JAVA_HOME $JAVA_OPTIONS -jar $ADMIN_PROJECT_PATH/${ADMIN_PROJECT_NAME}.jar $JAVA_APP_OPTIONS &

相关推荐#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Jenkins流水线发布实战:React+SpringBoot全栈部署
https://blog.wmovie.site/posts/jenkins-pipeline-guide/
作者
朵朵
发布于
2024-08-20
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
朵朵
全栈开发者,5 年 Java/SpringBoot + Vue/React 开发经验,曾维护 Delphi 遗留系统。业余深耕 NAS 与软路由,专注 Homelab 家庭网络搭建及 Docker 自托管应用实战。坐标福州,正迈向独立开发之路。
公告
欢迎来到我的博客!有什么想要的邮箱告诉我,最近沉迷nas和软路由。
分类
标签
站点统计
文章
25
分类
4
标签
18
总字数
32,908
运行时长
0
最后活动
0 天前

文章目录