- 环境准备
- 硬件与系统要求
表1 硬件与系统要求
|--------|------------------------|---------------------------|
| 项目 | 最低配置 | 推荐配置 |
| CPU | 2 核 | 4 核及以上 |
| 内存 | 2 GB | 4 GB 及以上(Maven 打包吃内存) |
| 磁盘 | 20 GB | 50 GB 及以上(工作区 + 构建产物) |
| 系统 | CentOS 7+ / Ubuntu 18+ | CentOS 7.9 / Ubuntu 22.04 |
-
- 安装 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 自身运行。
-
- 开放端口
CentOS 7/8(firewalld)
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
云服务器还需在安全组放行 8080
- 安装 Jenkins
- 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
-
- 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 &
-
- 启动与初始化解锁
默认端口为 8080。如需修改端口、查看初始密码:
sudo vi /etc/sysconfig/jenkins
找到 JENKINS_PORT="8080" 改为目标端口
sudo systemctl restart jenkins
查看初始管理员密码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
浏览器访问 http://服务器IP:8080,首次进入提示输入管理员密码,粘贴上面命令输出的 32 位字符串。然后选择「安装推荐的插件」,等待完成,创建第一个管理员账号。
-
- 插件下载慢换国内镜像
进入 Manage Jenkins → Plugins → Advanced settings,底部 Update Site 改为:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
提交后点「立即获取」。
- 安装所需插件
进入 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。
- 安装与配置 Maven
- 服务器安装 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
-
- 配置阿里云镜像与本地仓库
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>
-
- 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。
保存。
- 配置 SVN 凭证
进入 Manage Jenkins → Credentials → System → Global credentials → Add credentials:
- Kind:Username with password
- Username:SVN 账号
- Password:SVN 密码
- ID:svn-cred(自定义,后面 Pipeline 会引用)
- Description:SVN 凭证
保存。
- 创建构建任务(自由风格项目)
- 新建任务
首页点「新建任务」→ 输入名称(如 qlcrm-build)→ 选择「构建一个自由风格的软件项目」→ 确定。
-
- 源码管理(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(全量拉取)
- 构建触发器
- 轮询 SCM:勾选,日程表填 H/5 * * * *(每 5 分钟检查 SVN 是否有更新,有就构建)
- 定时构建:H 2 * * *(每天凌晨 2 点构建)
- 也可以不勾,手动点「立即构建」
- 构建环境
勾选 Delete workspace before build starts(每次构建前清理工作区,避免旧文件干扰)。
-
- 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。
-
- 构建后部署------同机部署
适用于 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 启动后会被立刻杀掉。
-
- 构建后部署------远程部署
适用于 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。
- 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。这样构建脚本随代码版本管理。
- 完整部署脚本(应用服务器端)
在 /usr/local/java/qlcrm/ 下创建三个脚本,分别负责启动、停止、重启。
#!/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=$!"
#!/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 "已停止"
#!/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
- 常见问题排查
表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 主动触发 |
- 验证流程
完成配置后,按以下步骤验证整条 CI/CD 链路:
- 提交代码到 SVN(或直接在 Jenkins 任务点「立即构建」)
- 查看「控制台输出」,确认:SVN 拉取成功 → Maven BUILD SUCCESS → jar 上传 → restart.sh 输出「进程存活」
- 浏览器访问应用接口,验证服务正常响应
- 服务器执行 tail -f /usr/local/java/qlcrm/nohup.out 查看启动日志,确认无异常
- 确认 ps -ef | grep qlcrm 进程存在,且端口正常监听