内网开发环境福音:手把手搞定Jenkins离线安装与SVN+Maven项目部署(含插件依赖避坑)
内网环境下的Jenkins全离线部署实战:从零构建SVN+Maven流水线
为什么内网环境需要特殊的CI/CD解决方案
在企业级开发场景中,安全隔离网络已经成为标配。金融、军工、政府等领域的项目代码往往要求完全脱离互联网环境运行,这给持续集成与交付带来了独特挑战。传统基于在线插件库的Jenkins安装方式在这里完全失效,工程师们不得不面对依赖地狱、版本冲突和资源迁移等一系列问题。
我曾参与过三个大型银行系统的内网CI/CD搭建,最深切的体会是:离线环境的准备工作比安装过程本身更重要。一个完整的离线部署方案需要包含:
- 所有二进制文件的版本兼容性验证
- 插件依赖树的完整解析
- 构建工具本地仓库的完整迁移
- 备用方案的应急处理机制
下面我将分享一套经过多个项目验证的可靠方案,重点解决三个核心痛点:如何获取完整依赖、如何避免插件冲突、如何建立可持续维护的离线环境。
1. 离线资源准备:构建完整的依赖生态
1.1 基础组件下载策略
在内网环境中,任何遗漏的依赖都可能导致整个流程中断。我们需要分层次准备以下资源:
Jenkins核心及插件:
# 官方war包下载(需在外网环境执行) wget https://get.jenkins.io/war-stable/2.346.3/jenkins.war # 插件批量下载脚本(示例) PLUGINS="publish-over-ssh maven-plugin subversion" for PLUGIN in $PLUGINS; do wget "https://updates.jenkins.io/download/plugins/${PLUGIN}/latest/${PLUGIN}.hpi" doneMaven离线仓库准备:
- 在外网开发机执行完整构建
- 备份
~/.m2/repository目录 - 使用rsync同步到内网服务器:
rsync -avz ~/.m2/repository/ user@intranet-server:/opt/maven-repo/1.2 版本兼容性矩阵
以下是经过验证的稳定版本组合:
| 组件 | 推荐版本 | 备注 |
|---|---|---|
| Jenkins | 2.346.3 LTS | 长期支持版稳定性最佳 |
| Maven | 3.8.6 | 兼容JDK8/11 |
| Subversion插件 | 2.15.3 | 支持SVN1.14+ |
提示:插件版本冲突是离线环境最常见问题,建议统一采用最新稳定版而非混用不同时期的版本
2. 系统级配置:打造稳定基础环境
2.1 服务化部署方案
直接运行war包适合测试环境,生产级部署推荐使用systemd托管:
# /etc/systemd/system/jenkins.service [Unit] Description=Jenkins CI Server After=network.target [Service] User=jenkins Environment="JENKINS_HOME=/var/lib/jenkins" ExecStart=/usr/bin/java -jar /opt/jenkins/jenkins.war Restart=always [Install] WantedBy=multi-user.target关键配置点:
- 专用系统账户降低安全风险
- 固定JENKINS_HOME路径便于维护
- 自动重启保障服务可用性
2.2 离线仓库配置技巧
Maven的settings.xml需要特殊定制:
<settings> <localRepository>/opt/maven-repo</localRepository> <mirrors> <mirror> <id>internal-repository</id> <url>file:///opt/maven-repo</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors> </settings>这种配置方式实现了:
- 所有依赖请求重定向到本地仓库
- 完全避免对外网仓库的访问尝试
- 统一管理多项目的依赖资源
3. 插件管理:破解依赖迷宫
3.1 依赖解析实战
离线安装插件时,常见的依赖问题处理流程:
- 通过web界面尝试上传插件
- 查看报错信息中的缺失依赖
- 在外网环境使用插件管理器下载完整依赖链:
# 使用Jenkins插件CLI工具 java -jar jenkins-cli.jar -s http://localhost:8080/ install-plugin \ --deploy --name publish-over-ssh --view-security-warnings- 将生成的依赖树全部下载后批量导入
3.2 高可用插件包制作
建议创建包含以下内容的插件资源包:
/jenkins-plugins/ ├── core-dependencies/ # 基础依赖插件 │ ├── structs-1.23.hpi │ └── credentials-2.6.1.hpi ├── svn-integration/ # SVN相关插件组 │ ├── subversion-2.15.3.hpi │ └── ssh-credentials-1.19.hpi └── maven-integration/ # Maven相关插件组 ├── maven-plugin-3.19.hpi └── token-macro-2.15.hpi这种分组管理方式便于:
- 按需更新特定功能模块
- 快速定位冲突来源
- 批量验证兼容性
4. 项目流水线配置:从构建到部署
4.1 SVN仓库安全连接
内网SVN通常采用SSH协议认证,配置示例:
// Jenkinsfile片段 checkout([ $class: 'SubversionSCM', locations: [[ credentialsId: 'svn-ssh-key', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: "svn+ssh://svn.intranet/project/trunk" ]], workspaceUpdater: [ $class: 'UpdateUpdater' ] ])关键安全措施:
- 使用SSH密钥而非密码认证
- 限制代码检出深度
- 忽略外部引用避免意外依赖
4.2 可靠部署方案设计
通过Publish Over SSH插件实现部署时,推荐采用以下模式:
#!/bin/bash # deploy.sh 标准化部署脚本 DEPLOY_DIR="/opt/app/${JOB_NAME}" LOG_FILE="${DEPLOY_DIR}/deploy.log" # 确保目录存在 mkdir -p ${DEPLOY_DIR} # 停止现有服务 if [ -f "${DEPLOY_DIR}/pid" ]; then kill -9 $(cat ${DEPLOY_DIR}/pid) || true fi # 启动新服务 nohup java -jar ${DEPLOY_DIR}/*.jar > ${LOG_FILE} 2>&1 & echo $! > ${DEPLOY_DIR}/pid对应的Jenkins Post-build配置:
| 参数 | 值 | 说明 |
|---|---|---|
| Source files | target/*.jar | 构建产物路径 |
| Remove prefix | target | 去除目录层级 |
| Remote directory | /opt/app/${JOB_NAME} | 项目隔离部署 |
| Exec command | /usr/local/bin/deploy.sh | 标准化部署 |
这种方案解决了:
- 进程残留导致的端口占用
- 日志文件管理混乱
- 多项目并行部署冲突
5. 维护与升级:可持续的离线方案
5.1 离线更新策略
建立三阶段更新流程:
- 外网验证环境:测试新版本组合
- 内网预发布环境:验证与现有系统的兼容性
- 生产环境滚动更新:按节点分批部署
更新包应包含:
- 版本变更说明
- 回滚方案
- 依赖检查清单
5.2 常见故障处理指南
插件加载失败:
- 检查
$JENKINS_HOME/plugins目录权限 - 验证插件依赖关系:
# 查看插件依赖 unzip -p plugin.hpi META-INF/MANIFEST.MF | grep -i depend构建依赖缺失:
- 在开发机执行完整构建
- 对比本地与服务器仓库差异:
diff -rq ~/.m2/repository /opt/maven-repoSSH连接超时:
- 验证网络策略是否开放
- 检查SSH服务端配置:
# 服务端调试模式 /usr/sbin/sshd -d -p 22