文章目录
- 前言
- 一、配置SSH-KEY
-
- [1.1 操作jenkins所在服务器](#1.1 操作jenkins所在服务器)
- [1.2 操作github](#1.2 操作github)
- [1.3 验证](#1.3 验证)
- 二、服务器安装git
- 三、jenkins页面安装maven
- 四、页面配置自动化任务
-
- [4.1 新建任务](#4.1 新建任务)
- [4.2 选择](#4.2 选择)
- [4.3 配置参数](#4.3 配置参数)
- [4.4 配置脚本](#4.4 配置脚本)
- 五、执行任务
-
- [5.1 点击执行按钮](#5.1 点击执行按钮)
- [5.2 填写参数](#5.2 填写参数)
- [5.3 查看日志](#5.3 查看日志)
- 六、查看服务器文件
- 七、部署到远程服务器(附加)
-
- [7.1 配置免密](#7.1 配置免密)
- [7.2 远程部署脚本](#7.2 远程部署脚本)
- 总结
前言
jenkins从github等代码平台拉取代码到本地,然后在本地进行maven编译打包,最后启动微服务jar包。
一、配置SSH-KEY
1.1 操作jenkins所在服务器
在jenkins所在环境里执行:
bash
#我使用root用户登录的机器,但是Jenkins 以 jenkins 用户运行的
#所以要切换到 Jenkins 用户环境
sudo -u jenkins -s
#生成SSH公钥
ssh-keygen -t ed25519 -C "xxxxx@xxxxx.com"
#查看公钥
cat /var/lib/jenkins/.ssh/id_ed25519.pub
1.2 操作github
在设置里新增保存。
1.3 验证
bash
sudo -u jenkins -s
ssh -T git@github.com
#成功会打印You've successfully authenticated
二、服务器安装git
bash
dnf install git
三、jenkins页面安装maven
因为我安装好了,所以Available plugins中搜素看不到。
maven的默认settings文件路径:
/var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/maven/conf
默认仓库路径:
/var/lib/jenkins/.m2/repository
可以修改settings文件,将仓库下载地址改为阿里云等。
四、页面配置自动化任务
4.1 新建任务
4.2 选择
4.3 配置参数
4.4 配置脚本
bash
pipeline {
agent any
environment {
//配置自己的仓库地址
REPOSITORY = "git@github.com:xxxx/mySpringCloudStudy.git"
}
tools {
maven 'maven' // 引用在 Jenkins 中配置的 Maven 工具名称
}
stages {
stage('拉取代码') {
steps {
echo "开始拉取代码,仓库:${REPOSITORY},分支:${branch}"
echo "删除工作空间目录开始"
deleteDir()
echo "删除工作空间目录结束"
git branch: '${branch}', url: "${REPOSITORY}"
echo "结束拉取代码"
}
}
stage('编译依赖项目') {
steps {
echo "编译父工程mySpringCloudStudy开始 ................................"
//-P prod 选择编译环境,没有则删掉
sh "mvn -P prod -U clean install -DskipTests"
echo "编译父工程mySpringCloudStudy结束 ................................"
}
}
}
}
五、执行任务
5.1 点击执行按钮
5.2 填写参数
选择分支,默认master
点击build
5.3 查看日志
success表示成功
六、查看服务器文件
bash
cd /var/lib/jenkins/workspace/test
可以看到拉取的代码
可以看到编译好的jar包
七、部署到远程服务器(附加)
7.1 配置免密
在jenkins服务器执行
bash
sudo -u jenkins ssh-keygen -t rsa -b 2048 -f /var/lib/jenkins/.ssh/id_rsa
cat /var/lib/jenkins/.ssh/id_rsa.pub
在远程部署微服务的服务器执行
bash
vim ~/.ssh/authorized_keys
#将jenkins中/var/lib/jenkins/.ssh/id_rsa.pub的内容复制进去保存
回到jenkins服务器执行
bash
sudo -u jenkins ssh root@10.211.55.110
#如果能够免密登录到远程微服务服务器,则表示成功。
7.2 远程部署脚本
bash
pkill -f "bztc-study01-8001-1.0.1-SNAPSHOT.jar" || true
nohup /root/jdk-17.0.10+7/bin/java -jar /opt/bztc-study/bztc-study01-8001-1.0.1-SNAPSHOT.jar > /opt/bztc-study/bztc-study01.log 2>&1 &
jenkins脚本:
bash
pipeline {
agent any
environment {
REPOSITORY = "git@github.com:smdai/mySpringCloudStudy.git"
}
tools {
maven 'maven' // 引用在 Jenkins 中配置的 Maven 工具名称
}
stages {
stage('拉取代码') {
steps {
echo "开始拉取代码,仓库:${REPOSITORY},分支:${branch}"
echo "删除工作空间目录开始"
deleteDir()
echo "删除工作空间目录结束"
git branch: '${branch}', url: "${REPOSITORY}"
echo "结束拉取代码"
}
}
stage('编译依赖项目') {
steps {
echo "编译父工程mySpringCloudStudy开始 ................................"
sh "mvn -P prod -U clean install -DskipTests"
echo "编译父工程mySpringCloudStudy结束 ................................"
}
}
stage('部署到远程服务器') {
steps {
echo "开始将 bztc-study01 JAR 包传输到远程服务器,并重启服务"
// 使用 scp 将 JAR 包传输到远程服务器
sh '''
# 检查并终止已存在的 bztc-study01-8001-1.0.1-SNAPSHOT.jar 进程
#ssh -vvv root@10.211.55.110 'pkill -f "bztc-study01-8001-1.0.1-SNAPSHOT.jar" || true'
# 备份旧的 JAR 包,带时间戳
ssh root@10.211.55.110 'mv /opt/bztc-study/bztc-study01-8001-1.0.1-SNAPSHOT.jar /opt/bztc-study/back/bztc-study01-8001-1.0.1-SNAPSHOT.jar.$(date +%Y%m%d%H%M%S)'
# 传输新的 JAR 包到远程服务器
scp bztc-study01/target/bztc-study01-8001-1.0.1-SNAPSHOT.jar root@10.211.55.110:/opt/bztc-study/
# 启动新的 JAR 包并放入后台
#ssh root@10.211.55.110 'nohup /root/jdk-17.0.10+7/bin/java -jar /opt/bztc-study/bztc-study01-8001-1.0.1-SNAPSHOT.jar > /opt/bztc-study/bztc-study01.log 2>&1 &'
ssh root@10.211.55.110 'sh /opt/bztc-study/start.sh'
'''
// 检查日志文件是否包含"成功"字样
script {
def maxWaitTime = 30 // 最大等待时间(秒)
def pollInterval = 5 // 检查间隔(秒)
def elapsed = 0
while (elapsed < maxWaitTime) {
def result = sh(
script: "ssh root@10.211.55.110 'grep -q \"成功\" /opt/bztc-study/bztc-study01.log' || echo 'not_found'",
returnStdout: true
).trim()
if (result != 'not_found') {
echo "远程部署完成,服务已成功启动"
break
}
if (elapsed >= maxWaitTime - pollInterval) {
error "服务重启失败:未检测到"成功"字样"
}
sleep pollInterval
elapsed += pollInterval
}
}
}
}
}
}
总结
如果日志中出现异常,则需具体问题具体分析。