介绍
Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。

一、下载安装Jenkins
1、安装jenkins
jenkins官网地址提供了多种安装方式,我这边使用的是Ubuntu系统安装,注意最新版本的jenkins安装需要jdk21及以上的版本支持,官方提供了安装方式,如果自己本身的jdk环境较低但是又不想改变可以给jenkins指定安装的jdk版本

2、下载安装jdk21
bash
# 1. 进入你的专属 JDK 目录
cd /home/xx/jdk/
# 2. 删掉旧的、不兼容的 jdk17 文件夹
rm -rf jdk17
# 3. 创建全新的 jdk21 目录并进入
mkdir -p jdk21 && cd jdk21
# 4. 下载精准版本号的官方 Oracle JDK 21 稳定版
wget https://download.oracle.com/java/21/archive/jdk-21.0.4_linux-x64_bin.tar.gz
# 5. 解压并自动剥离外层目录,让核心文件直接平铺在 jdk21 下
tar -zxvf jdk-21.0.4_linux-x64_bin.tar.gz --strip-components=1
# 6. 删除下载的压缩包,释放空间
rm jdk-21.0.4_linux-x64_bin.tar.gz
3、修改jenkins专属环境路径
bash
# 自动修改 Jenkins 专属 Java 指令到全新的 JDK 21 路径
echo -e "[Service]\nEnvironment=\"JENKINS_JAVA_CMD=/home/xx/jdk/jdk21/bin/java\"" | sudo tee /etc/systemd/system/jenkins.service.d/override.conf
4、重启服务
bash
# 1. 刷新系统服务配置,让刚才修改的路径生效
sudo systemctl daemon-reload
# 2. 清除之前由于 Java 17 不满足引发的"启动太快"报错计数锁
sudo systemctl reset-failed jenkins.service
# 3. 重新启动 Jenkins
sudo systemctl start jenkins
# 4. 见证奇迹的时刻,查看最终运行状态
sudo systemctl status jenkins.service
5、访问测试端口为8080

6、插件安装就选择默认安装新手使用
二、创建流水线任务
1、新建item选择流水线
2、配置脚本

3、输入脚本
3.1配置远程登录ssh
因为我们测试是自动化编译,打包部署到服务器,所以需要配置一些环境,密钥等,首先我们如果是要打包到服务器需要密钥去ssh登录到远程服务器
bash
# 在 Jenkins 服务器上运行
ssh-keygen -t rsa -b 4096
ssh-copy-id root@xx.xx.xx.91
1、输入这个命令会有提示
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
2 、当你看到这个提示时,系统是在问你:"你想把生成的密钥文件保存在哪里?"
3 、括号里的 (/root/.ssh/id_rsa) 是系统默认给你的路径和文件名。
4 、绝大多数情况下,你直接按回车(Enter)键即可。
5、按回车后,系统会默认把密钥保存在相应的位置,接着会提示你设置密码(Passphrase),连续再按两次回车(不设置密码)就可以完成密钥生成了。
6 、密钥生成后,你需要把公钥发给你的目标服务器(xx.xx.xx.91),直接在当前终端运行这行命令即可(会提示输入一次目标服务器的 root 密码)
bash
sudo ssh-copy-id -i /root/.ssh/id_rsa.pub root@xx.xx.xx.91
7、首次连接确认:
The authenticity of host 'xx.xx.xx.91 (...)' can't be established.
Are you sure you want to continue connecting (yes/no/fingerprint)?
8、输入目标服务器密码回车即可
3.2配置Credentials
配置自动拉去gitee代码仓库代码添加 Gitee 凭据 (Credentials)如果你的 Gitee 仓库是公开的,可以跳过此步。如果是私有仓库:进入 Manage Jenkins -> Credentials -> System -> Global credentials -> Add Credentials。类型选择 Username with password,输入你的 Gitee 账号和密码(或 Token),别名(ID)自己取一个,但是要和脚本里面的相对应。



3.3安装git
因为要从git拉取代码,所以要先安装git,如果有git环境的话就不用重复安装了
bash
#更新系统的软件包列表:
sudo apt update
#安装 Git 客户端:
sudo apt install git -y
#验证是否安装成功:
git --version
3.4配置编译环境
因为我要自动化编译和部署spring boot环境,并且我项目用的是jdk1.8和maven3.x所以我需要给项目单独配置编译环境

jdk安装,我这是已经安装好了所以指定目录就可以了,如果没有安装也可以选择自动安装

maven安装

点击保存即可
3.5脚本编写
我这弄了一个自动化编译打包带远程服务器的脚本
bash
pipeline {
agent any
environment {
TARGET_SERVER = 'xx,xx。xx.91'
DEPLOY_USER = 'ubuntu'
GIT_URL = 'https://gitee.com/jiangyongjie/xx.git'
APP_NAME = 'targetSystem'
TARGET_DIR = '/home/targetSystem/jar'
}
stages {
stage('1. 克隆代码') {
steps {
echo '正在从 Gitee 克隆若依项目代码...'
checkout([$class: 'GitSCM', branches: [[name: '*/master']], userRemoteConfigs: [[credentialsId: '01', url: "${env.GIT_URL}"]]])
}
}
stage('2. 使用 JDK 1.8 编译打包') {
steps {
echo '正在编译若依多模块项目...'
script {
def jdkHome = tool 'JDK1.8'
def mvnHome = tool 'maven3'
withEnv(["JAVA_HOME=${jdkHome}", "PATH+MAVEN=${mvnHome}/bin", "PATH+JDK=${jdkHome}/bin"]) {
sh 'mvn clean package -DskipTests'
}
}
}
}
stage('3. 传输 ruoyi-admin.jar 到目标服务器') {
steps {
echo "正在向 ${env.TARGET_SERVER} 传输 Jar 包..."
sh "scp -o StrictHostKeyChecking=no ruoyi-admin/target/*.jar ${env.DEPLOY_USER}@${env.TARGET_SERVER}:${env.TARGET_DIR}/${env.APP_NAME}.jar"
}
}
stage('4. 远程自动化部署(安全平滑重启)') {
steps {
echo "正在安全重启若依后端服务..."
sh """
ssh -o StrictHostKeyChecking=no ${env.DEPLOY_USER}@${env.TARGET_SERVER} "
cd ${env.TARGET_DIR}
# 1. 安全查找旧进程(注意:加上了 grep -v grep 过滤,防止误杀当前 SSH 连接)
PIDS=\\\$(ps -ef | grep ${env.APP_NAME}.jar | grep -v grep | awk '{print \\\$2}')
if [ -n '\\\$PIDS' ]; then
echo '发现正在运行的旧服务进程: '\\\$PIDS
for pid in \\\$PIDS; do
echo '正在终止进程: '\\\$pid
kill -9 \\\$pid 2>/dev/null
done
sleep 2
else
echo '未发现运行中的旧服务,准备直接启动。'
fi
# 2. 后台启动若依新服务
echo '正在后台启动 [targetSystem.jar]...'
# 强制清除以前可能残留的临时进程变量,防止被 Jenkins 误当作僵尸进程清理
export JENKINS_NODE_COOKIE=dontKillMe
nohup java -jar ${env.APP_NAME}.jar > server.log 2>&1 &
# 3. 稳健验证进程是否成功拉起
sleep 5
NEW_PID=\\\$(ps -ef | grep ${env.APP_NAME}.jar | grep -v grep | awk '{print \\\$2}' | head -n 1)
if [ -n '\\\$NEW_PID' ]; then
echo '==================================================='
echo ' 恭喜!若依后端服务自动化部署成功!'
echo ' 当前服务最新进程号 (PID): '\\\$NEW_PID
echo '==================================================='
else
echo '错误:服务未能成功拉起,请登录服务器检查:'
echo 'cat ${env.TARGET_DIR}/server.log'
exit 1
fi
"
"""
}
}
}
post {
success {
echo "【构建成功】若依项目已无缝更新并成功运行在 ${env.TARGET_SERVER}!"
}
failure {
echo "【构建失败】请检查上方控制台日志。"
}
}
}
三、开始构建
1、选择项目
点击创建的流水线项目

2、开始构建

构建失败的话可以点击进去看具体的错误信息

3、日志输出

部署成功
