jekins 完整部署详细流程(集成 SVN 源码管理 + Maven 打包 + Jar 程序自动部署)

  1. 环境准备
    1. 硬件与系统要求

表1 硬件与系统要求

|--------|------------------------|---------------------------|
| 项目 | 最低配置 | 推荐配置 |
| CPU | 2 核 | 4 核及以上 |
| 内存 | 2 GB | 4 GB 及以上(Maven 打包吃内存) |
| 磁盘 | 20 GB | 50 GB 及以上(工作区 + 构建产物) |
| 系统 | CentOS 7+ / Ubuntu 18+ | CentOS 7.9 / Ubuntu 22.04 |

    1. 安装 JDK

Jenkins 自身运行需要 JDK 11 或 17(2024 年后的 LTS 版本要求 Java 17);而业务项目(如 qlcrm)可能使用 JDK 8。两者不冲突------Jenkins 全局工具里可以配置多个 JDK,构建任务时单独指定。先装一个 JDK 17 给 Jenkins 用:

CentOS

sudo yum install -y java-17-openjdk java-17-openjdk-devel

Ubuntu

sudo apt install -y openjdk-17-jdk

验证

java -version

应输出 openjdk version "17.x.x"

如服务器已有 JDK 8 且默认是 8,用 alternatives 切换

sudo alternatives --config java

选择 JDK 17 对应的编号

业务项目的 JDK 8 后面在 Jenkins「全局工具配置」里单独添加,不影响 Jenkins 自身运行。

    1. 开放端口

CentOS 7/8(firewalld)

sudo firewall-cmd --permanent --add-port=8080/tcp

sudo firewall-cmd --reload

云服务器还需在安全组放行 8080

  1. 安装 Jenkins
    1. yum 仓库安装(推荐)

使用 yum 仓库安装的好处是可以通过 systemctl 管理启停和开机自启,升级也方便。

1. 添加 Jenkins 官方 yum 仓库

sudo wget -O /etc/yum.repos.d/jenkins.repo \

https://pkg.jenkins.io/redhat-stable/jenkins.repo

2. 导入 GPG 密钥

sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

3. 安装

sudo yum install -y jenkins

启动并设置开机自启

sudo systemctl start jenkins

sudo systemctl enable jenkins

sudo systemctl status jenkins

Ubuntu 用户使用以下命令:

curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key \

| sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null

echo deb signed-by=/usr/share/keyrings/jenkins-keyring.asc \

https://pkg.jenkins.io/debian-stable binary/ \

| sudo tee /etc/apt/sources.list.d/jenkins.list

sudo apt update && sudo apt install -y jenkins

    1. war 包直接运行

适合无 root 权限或需要多实例的场景。

cd /usr/local

sudo wget https://get.jenkins.io/war-stable/latest/jenkins.war

后台运行(用 SSH 终端,不要在 WinSCP 执行命令框里跑)

nohup java -jar jenkins.war --httpPort=8080 > jenkins.log 2>&1 &

    1. 启动与初始化解锁

默认端口为 8080。如需修改端口、查看初始密码:

sudo vi /etc/sysconfig/jenkins

找到 JENKINS_PORT="8080" 改为目标端口

sudo systemctl restart jenkins

查看初始管理员密码

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

浏览器访问 http://服务器IP:8080,首次进入提示输入管理员密码,粘贴上面命令输出的 32 位字符串。然后选择「安装推荐的插件」,等待完成,创建第一个管理员账号。

    1. 插件下载慢换国内镜像

进入 Manage Jenkins → Plugins → Advanced settings,底部 Update Site 改为:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json

提交后点「立即获取」。

  1. 安装所需插件

进入 Manage Jenkins → Plugins → Available plugins,搜索并安装以下插件(勾选后点 Install without restart):

表2 所需插件清单

|-----------------------------------|-----------------------------------|
| 插件名称 | 用途 |
| Subversion Plug-in | SVN 源码拉取(自带 SVNKit,无需服务器装 svn 命令) |
| Maven Integration plugin | 自由风格项目中调用 Maven |
| Pipeline Maven Integration Plugin | 流水线(Pipeline)中调用 Maven |
| Publish Over SSH | 打包后通过 SSH 把 jar 传到远程服务器并执行脚本 |
| Credentials Binding | 凭证管理(SVN 账号、SSH 密钥) |
| SSH plugin | 远程执行命令(可选,Publish Over SSH 已够用) |

安装完成后点 Restart Jenkins when installation is complete。

  1. 安装与配置 Maven
    1. 服务器安装 Maven

cd /usr/local

sudo wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz

sudo tar -zxf apache-maven-3.9.9-bin.tar.gz

sudo ln -s apache-maven-3.9.9 maven

配置环境变量

sudo vi /etc/profile

末尾追加:

export MAVEN_HOME=/usr/local/maven

export PATH=MAVEN_HOME/bin:PATH

生效并验证

source /etc/profile

mvn -version

应输出 Apache Maven 3.9.9

    1. 配置阿里云镜像与本地仓库

sudo vi /usr/local/maven/conf/settings.xml

在 <mirrors> 节点内加入阿里云镜像:

<mirror>

<id>aliyunmaven</id>

<mirrorOf>central</mirrorOf>

<name>阿里云公共仓库</name>

<url>https://maven.aliyun.com/repository/public\</url>

</mirror>

指定本地仓库目录(可选):

<localRepository>/usr/local/maven/repo</localRepository>

    1. Jenkins 全局工具配置

进入 Manage Jenkins → Tools:

  • JDK 配置(点 JDK 安装):名称 JDK17,取消「自动安装」,JAVA_HOME 填 /usr/lib/jvm/java-17-openjdk;再添加一个名称 JDK8,JAVA_HOME 填业务项目用的 JDK 8 路径(如 /usr/local/java/jdk1.8.0_xxx)。
  • Maven 配置(点 Maven 安装):名称 Maven3.9,取消「自动安装」,MAVEN_HOME 填 /usr/local/maven。

保存。

  1. 配置 SVN 凭证

进入 Manage Jenkins → Credentials → System → Global credentials → Add credentials:

  • Kind:Username with password
  • Username:SVN 账号
  • Password:SVN 密码
  • ID:svn-cred(自定义,后面 Pipeline 会引用)
  • Description:SVN 凭证

保存。

  1. 创建构建任务(自由风格项目)
    1. 新建任务

首页点「新建任务」→ 输入名称(如 qlcrm-build)→ 选择「构建一个自由风格的软件项目」→ 确定。

    1. 源码管理(SVN)
  • 勾选 Subversion
  • Repository URL:填 SVN 地址,例如 svn://192.168.1.100/repo/qlcrm/trunk 或 http://svn.example.com/qlcrm/trunk
  • Credentials:下拉选刚才创建的 svn-cred
  • Local module directory:留空(默认工作区根目录)
  • Repository depth:Infinity(全量拉取)
    1. 构建触发器
  • 轮询 SCM:勾选,日程表填 H/5 * * * *(每 5 分钟检查 SVN 是否有更新,有就构建)
  • 定时构建:H 2 * * *(每天凌晨 2 点构建)
  • 也可以不勾,手动点「立即构建」
    1. 构建环境

勾选 Delete workspace before build starts(每次构建前清理工作区,避免旧文件干扰)。

    1. Maven 打包

「增加构建步骤」→ 选择 Invoke top-level Maven targets:

  • Maven Version:选 Maven3.9
  • Goals:clean package -DskipTests
  • POM:留空(默认根目录 pom.xml)
  • 高级 → JDK:选 JDK8(如果项目是 JDK 8 编译)

如果项目有多个模块,只打某个子模块:Goals 填 clean package -pl 子模块名 -am -DskipTests。

    1. 构建后部署------同机部署

适用于 Jenkins 与应用程序在同一台服务器的场景。「增加构建后操作步骤」→ 选择 Execute shell:

#!/bin/bash

变量

APP_NAME=qlcrm.jar

APP_HOME=/usr/local/java/qlcrm

WORKSPACE=/var/lib/jenkins/workspace/qlcrm-build

1. 停旧进程

PID=(pgrep -f APP_NAME)

if -n "$PID" ; then

echo "停止旧进程 PID=$PID"

kill -9 $PID

sleep 2

fi

2. 复制新 jar

cp -f WORKSPACE/target/APP_NAME $APP_HOME/

3. 启动(关键:加 BUILD_ID=dontKillMe 防止 Jenkins 任务结束时杀掉进程)

cd $APP_HOME

BUILD_ID=dontKillMe nohup java -jar $APP_NAME > nohup.out 2>&1 &

echo "启动成功,新 PID=$!"

4. 等 3 秒验证进程

sleep 3

pgrep -f $APP_NAME && echo "进程存活" || echo "进程未启动,请查看 nohup.out"

关键说明:BUILD_ID=dontKillMe 是必须加的。Jenkins 默认会在构建结束时杀掉该任务衍生的所有进程,不加这个参数,jar 启动后会被立刻杀掉。

    1. 构建后部署------远程部署

适用于 Jenkins 与应用程序不在同一台服务器的场景,使用 Publish Over SSH 插件。

先配置 SSH 服务器:Manage Jenkins → System → Publish Over SSH:

  • Passphrase:留空(用密码认证就填 SSH 密码,用密钥就留空)
  • Path to key:密钥文件路径(或直接把私钥粘到 Key 文本框)
  • 点「增加」:Name 填 prod-server;Hostname 填应用服务器 IP;Username 填登录用户(如 root);Remote Directory 填 /usr/local/java/qlcrm
  • 点 Test Configuration 验证连接成功,保存。

回到任务配置,「增加构建后操作步骤」→ 选择 Send build artifacts over SSH:

  • SSH Server Name:prod-server
  • Source files:target/*.jar
  • Remove prefix:target(去掉 target 目录层级,直接传到 Remote Directory)
  • Remote directory:留空(用全局配置的 /usr/local/java/qlcrm)
  • Exec command:bash /usr/local/java/qlcrm/restart.sh

在应用服务器上创建 /usr/local/java/qlcrm/restart.sh(内容见第 8 章),并赋权 chmod +x。

  1. Pipeline 流水线方式(推荐)

如果希望构建脚本随代码一起管理,使用 Pipeline。新建任务选「流水线」,Pipeline 脚本直接填以下内容:

pipeline {

agent any

tools {

maven 'Maven3.9'

jdk 'JDK8' // 业务项目用 JDK8

}

environment {

APP_NAME = 'qlcrm.jar'

DEPLOY_DIR = '/usr/local/java/qlcrm'

}

stages {

stage('拉取代码') {

steps {

checkout([

$class: 'SubversionSCM',

locations: [[

remote: 'svn://192.168.1.100/repo/qlcrm/trunk',

credentialsId: 'svn-cred'

]]

])

}

}

stage('Maven 打包') {

steps {

sh 'mvn clean package -DskipTests'

}

post {

success {

archiveArtifacts artifacts: 'target/*.jar', fingerprint: true

}

}

}

stage('部署到服务器') {

steps {

sshPublisher(publishers: [

sshPublisherDesc(

configName: 'prod-server',

transfers: [

sshTransfer(

sourceFiles: 'target/*.jar',

removePrefix: 'target',

remoteDirectory: '',

execCommand: 'bash /usr/local/java/qlcrm/restart.sh'

)

],

verbose: true

)

])

}

}

}

post {

success { echo '构建部署成功' }

failure { echo '构建部署失败,请查看控制台日志' }

}

}

说明:Pipeline 中防止进程被杀的环境变量是 JENKINS_NODE_COOKIE=dontKillMe;但远程 restart.sh 里用 nohup 即可,因为是远程 SSH 执行,不受 Jenkins 进程树管理。

也可以把上面的脚本保存为 Jenkinsfile 放到 SVN 项目根目录,然后任务配置里选「Pipeline script from SCM」→ SCM 选 Subversion → 填 SVN 地址和凭证 → Script Path 填 Jenkinsfile。这样构建脚本随代码版本管理。

  1. 完整部署脚本(应用服务器端)

在 /usr/local/java/qlcrm/ 下创建三个脚本,分别负责启动、停止、重启。

    1. start.sh

#!/bin/bash

APP_NAME=qlcrm.jar

APP_HOME=(cd "(dirname "$0")"; pwd)

LOG_FILE=$APP_HOME/nohup.out

cd $APP_HOME

PID=(pgrep -f APP_NAME)

if -n "$PID" ; then

echo "程序已在运行,PID=$PID"

exit 1

fi

nohup java -jar APP_NAME \> LOG_FILE 2>&1 &

echo "启动成功,PID=$!"

    1. stop.sh

#!/bin/bash

APP_NAME=qlcrm.jar

PID=(pgrep -f APP_NAME)

if -z "$PID" ; then

echo "程序未运行"

exit 0

fi

echo "停止进程 PID=$PID"

kill $PID

sleep 3

PID=(pgrep -f APP_NAME)

if -n "$PID" ; then

echo "强制 kill"

kill -9 $PID

fi

echo "已停止"

    1. restart.sh

#!/bin/bash

APP_HOME=(cd "(dirname "$0")"; pwd)

bash $APP_HOME/stop.sh

sleep 1

bash $APP_HOME/start.sh

赋权:chmod +x /usr/local/java/qlcrm/*.sh

  1. 常见问题排查

表3 常见问题与解决方案

|----------------------------|-------------------------------------------------------------------------------------------|
| 问题 | 原因与解决 |
| Jenkins 启动后访问 8080 拒绝连接 | 防火墙/安全组未放行,或 JDK 版本不对(需 11/17)。用 systemctl status jenkins 看日志 |
| 插件安装一直转圈/失败 | 换清华镜像(见第 2.4 节),或检查服务器能否访问外网 |
| SVN 连接报错 unable to connect | 检查 URL、凭证、网络连通性(telnet SVN_IP 3690);SVN 地址不要带空格 |
| SVN 认证失败 | 凭证用户名密码错误,或账号无该目录权限;在 Credentials 里重新配置 |
| Maven 打包慢/卡死 | settings.xml 未配阿里云镜像;或首次下载依赖量大,耐心等待 |
| Maven 报错无效的标记 | JDK 版本不匹配,项目用 Java 8 语法但 Jenkins 用了 17 编译,在构建步骤里指定 JDK8 |
| jar 启动后 Jenkins 任务结束进程就没了 | 同机部署必须加 BUILD_ID=dontKillMe(自由风格)或 JENKINS_NODE_COOKIE=dontKillMe(Pipeline);远程 SSH 部署不受此限 |
| Publish Over SSH 连接失败 | 目标服务器 SSH 服务未启、端口非 22(在高级里改 Port)、密码/密钥错误、目标服务器 .ssh 权限不对 |
| jar 上传了但没启动 | Exec command 路径写错,或 restart.sh 无执行权限(chmod +x),或脚本里 java 不在 PATH(用绝对路径) |
| Jenkins 用户无权限写部署目录 | sudo chown -R jenkins:jenkins /usr/local/java/qlcrm,或在 sudoers 里给 jenkins 免密权限 |
| 控制台输出中文乱码 | Manage Jenkins → System → 全局属性 → 环境变量 添加 LANG=zh_CN.UTF-8;服务器 locale 检查 |
| 构建后磁盘满 | 任务配置 → 构建后操作 → Discard old builds,设置保留最近 10 次构建 |
| WinSCP 执行命令框跑 nohup 报语法错误 | WinSCP 会在命令后自动拼接 ; echo,导致 & ; 连续。改用 SSH 终端,或命令末尾加 disown / sleep 1 |
| SVN 提交后 Jenkins 没自动构建 | 轮询 SCM 日程表写错,或 SVN 服务器时间与 Jenkins 不同步;可改用 SVN post-commit hook 主动触发 |

  1. 验证流程

完成配置后,按以下步骤验证整条 CI/CD 链路:

  • 提交代码到 SVN(或直接在 Jenkins 任务点「立即构建」)
  • 查看「控制台输出」,确认:SVN 拉取成功 → Maven BUILD SUCCESS → jar 上传 → restart.sh 输出「进程存活」
  • 浏览器访问应用接口,验证服务正常响应
  • 服务器执行 tail -f /usr/local/java/qlcrm/nohup.out 查看启动日志,确认无异常
  • 确认 ps -ef | grep qlcrm 进程存在,且端口正常监听
相关推荐
钱栈up2 天前
VSCode 调试多模块 Maven + Spring Boot 后端:从启动失败到一次跑通
java·spring boot·maven
砚底藏山河2 天前
【量化纯GET实战 #11】移动均线 MA:5 日 20 日 60 日怎么算怎么用
java·python·金融·maven
澈如冬雪^2 天前
IDEA导入已经下载的jar包
pycharm·intellij-idea·jar
云计算磊哥@3 天前
运维开发宝典064-CICD_Nexus3 搭建 maven 私服
运维·maven·运维开发
卓怡学长3 天前
w175基于springboot校园二手物品交易平台
java·spring boot·spring·maven·intellij-idea
aXin_ya4 天前
SVN使用
svn
wjjzhbb4 天前
中小团队敏捷转型:Scrum还是看板?
java·maven·scrum
XS0301065 天前
【无标题】
java·tomcat·maven·intellij-idea