【Jenkins】离线部署实战:SVN+Maven项目构建与自动化发布
1. Jenkins离线部署环境准备
在企业内网环境中部署Jenkins,首先要解决的是基础环境依赖问题。我去年在某金融机构做私有云改造时就遇到过类似场景,他们的生产环境完全隔离外网,所有软件都需要通过离线方式安装。
JDK安装是第一步。推荐使用Oracle JDK 1.8或OpenJDK 11这些长期支持版本。下载对应版本的.tar.gz包后,解压到/usr/local目录,然后配置环境变量:
export JAVA_HOME=/usr/local/jdk1.8.0_301
export PATH=$JAVA_HOME/bin:$PATH
验证安装是否成功:
java -version
Tomcat容器虽然不是必须的,但建议在生产环境使用。下载apache-tomcat-9.x.tar.gz,同样解压到/usr/local。启动时需要注意内存配置,在bin/catalina.sh中添加:
export CATALINA_OPTS="-Xms512m -Xmx1024m -XX:MaxPermSize=512m"
对于防火墙配置,需要开放Jenkins的端口(默认8080):
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
2. Jenkins核心安装与初始化
直接从官网下载jenkins.war包,建议选择长期支持版(LTS)。我习惯用2.346.x版本,稳定性经过多个项目验证。
启动Jenkins有两种方式:
- 独立运行:
nohup java -jar jenkins.war --httpPort=8080 > jenkins.log 2>&1 &
- 部署到Tomcat: 将war包放到webapps目录,Tomcat会自动解压。这种方式更适合生产环境,可以利用Tomcat的线程池和管理功能。
首次访问时需要解锁Jenkins,密码存放在:
cat ~/.jenkins/secrets/initialAdminPassword
重要提示:在离线环境下一定要选择"跳过插件安装",否则会卡在初始化界面。我曾经在一个政府项目上因为这个等了半小时才发现问题。
3. 插件离线安装实战
插件管理是离线环境最大的挑战。推荐先在能联网的机器访问plugins.jenkins.io下载所需插件,包括:
- 核心插件:credentials、ssh、workspace-cleanup
- SVN相关:subversion
- Maven相关:maven-plugin
- 部署相关:publish-over-ssh
下载时要注意插件依赖关系。比如publish-over-ssh依赖jsch和apache-httpcomponents,必须一起下载。我的经验是:
- 先安装低层依赖插件
- 再安装功能插件
- 最后安装界面增强插件
安装方式:
- 进入"管理Jenkins" > "插件管理" > "高级"
- 上传.hpi文件
- 重启Jenkins(访问http://your-jenkins/restart)
常见问题排查:
- 版本冲突:查看jenkins.log中的ClassNotFoundException
- 循环依赖:按错误提示顺序安装
- 启动失败:删除有问题的插件目录后重试
4. 全局工具配置
在"全局工具配置"中设置关键工具路径:
JDK配置:
- 别名:jdk1.8
- JAVA_HOME:/usr/local/jdk1.8.0_301
- 取消勾选"自动安装"
Maven配置:
- 下载apache-maven-3.8.6-bin.tar.gz
- 解压到/usr/local
- 配置settings.xml:
<localRepository>/data/maven_repo</localRepository>
<mirrors>
<mirror>
<id>local-repo</id>
<url>file:///data/maven_repo</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
重要技巧:将开发环境的~/.m2/repository目录打包,上传到服务器作为初始仓库。这样可以避免大量依赖缺失问题。
5. SVN仓库配置
对于SVN项目,需要配置版本库访问权限:
- 在"凭据"中添加SVN账号密码
- 测试连接时使用svn://协议比http://更稳定
- 对于大型仓库,建议配置稀疏检出:
modules/A
modules/B
!modules/C
常见问题:
- 证书错误:在服务器上先手动svn checkout一次接受证书
- 权限不足:检查svnserve.conf中的anon-access设置
- 中文路径:设置LANG=zh_CN.UTF-8环境变量
6. Maven项目构建配置
新建Maven项目时的关键配置项:
源码管理:
- 选择Subversion
- 填写仓库URL
- 选择之前添加的凭据
- 指定检出目录(默认workspace)
构建触发器:
- 轮询SCM:H/5 * * * * (每5分钟检查一次)
- 手动构建:保留默认配置
Pre Steps:
# 清理旧构建
rm -rf target/*
Build:
- 根POM:pom.xml
- 目标和选项:clean package -DskipTests
Post Steps:
# 归档制品
mkdir -p archive/$BUILD_NUMBER
cp target/*.jar archive/$BUILD_NUMBER/
7. 自动化部署实现
通过SSH插件实现部署是最可靠的方式。先在"系统配置"中添加SSH Server:
- Name:Production
- Hostname:192.168.1.100
- Username:deployer
- Remote Directory:/data/app
Transfers配置:
- Source files:target/*.jar
- Remove prefix:target
- Remote directory:/data/app
- Exec command:
#!/bin/bash
APP_HOME=/data/app
PID=$(ps -ef | grep app.jar | grep -v grep | awk '{print $2}')
[ -n "$PID" ] && kill -9 $PID
nohup java -jar $APP_HOME/app.jar > $APP_HOME/nohup.out 2>&1 &
权限问题解决方案:
- 在目标服务器创建deployer用户
- 配置sudo权限:
deployer ALL=(ALL) NOPASSWD: /bin/systemctl restart app
- 在Jenkins中使用sudo执行命令
8. 典型问题排查指南
构建失败:
- 检查控制台输出最后的ERROR
- 查看workspace目录下的文件状态
- 对比本地构建结果
SSH连接超时:
- 测试网络连通性
- 检查sshd_config配置
- 验证密钥认证
文件权限问题:
- 确保Jenkins用户有读写权限
- 检查SELinux状态
- 验证umask设置
内存不足:
- 调整JVM参数:
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=256m"
- 增加swap空间
- 限制并发构建数
在实际项目中,我还遇到过Windows换行符导致脚本执行失败的问题。解决方案是在Jenkins的"构建环境"中勾选"Delete workspace before build starts"和"Clean local Maven repository"。这些细节往往决定了部署的成败。
更多推荐


所有评论(0)