内网开发福音:手把手教你用Jenkins+SVN+Maven搭建离线CI/CD流水线(含插件离线包)

内网开发福音:手把手教你用Jenkins+SVN+Maven搭建离线CI/CD流水线(含插件离线包) 企业级内网CI/CD实战JenkinsSVNMaven全离线解决方案在金融、军工等对网络安全要求极高的行业开发环境往往处于严格的物理隔离状态。传统基于互联网的CI/CD方案在这里完全失效——无法下载插件、无法访问公共仓库、甚至无法获取基础依赖。我曾为某银行数据中心搭建过一套完全离线的自动化发布系统从最初的束手无策到最终形成标准化方案深刻体会到内网环境下每个环节的独特挑战。本文将分享一套经过生产验证的全离线CI/CD体系不仅解决基础安装问题更重点构建可持续维护的技术生态。你会学到如何建立内部插件仓库、搭建企业级Maven私服、设计安全的跨网段部署策略以及最重要的——如何让这套系统在三年后依然能高效运行。1. 离线环境的基础设施规划1.1 网络拓扑与资源准备在内网环境中实施CI/CD首先要规划合理的网络架构。典型方案包含以下要素构建服务器4核8G以上配置部署Jenkins主服务版本控制区SVN服务单独部署建议与构建服务器千兆直连制品仓库Nexus Repository Manager 3.x磁盘空间≥500GB部署目标机根据项目需求配置建议通过跳板机统一管理关键提示所有机器需统一时间同步服务内网NTP避免证书验证等问题硬件资源到位后需要准备以下软件资产包组件类型获取方式存储要求Jenkins WAR包官网下载后经安全扫描导入/opt/jenkins插件HPI文件通过外网机器批量下载核心插件/data/pluginsMaven安装包Apache官网压缩包/usr/local依赖仓库从开发机导出完整.m2仓库/data/m2_repo1.2 系统级准备工作在正式安装前需完成基础环境配置# 创建专用用户 useradd -m -d /home/jenkins -s /bin/bash jenkins passwd jenkins # 目录权限设置 mkdir -p /data/{plugins,m2_repo,deploy} chown -R jenkins:jenkins /data # 防火墙规则示例 firewall-cmd --permanent --add-port8080/tcp firewall-cmd --reload常见踩坑点避免使用root用户直接运行Jenkins确保所有服务器间SSH免密互通/data分区建议使用xfs文件系统处理大量小文件性能更优2. Jenkins核心系统的离线部署2.1 WAR包部署与初始化使用Tomcat作为容器时需特别注意安全配置!-- conf/context.xml 增加 -- Context WatchedResourceWEB-INF/web.xml/WatchedResource Valve classNameorg.apache.catalina.valves.RemoteAddrValve allow192.168.1.0/24/ /Context独立运行模式推荐使用systemd管理# /etc/systemd/system/jenkins.service [Unit] DescriptionJenkins CI Server Afternetwork.target [Service] Userjenkins EnvironmentJENKINS_HOME/data/jenkins_home ExecStart/usr/bin/java -jar /opt/jenkins/jenkins.war Restartalways [Install] WantedBymulti-user.target2.2 插件依赖树的解决方案离线环境下最棘手的是插件依赖管理。推荐采用以下工作流在外网环境使用Jenkins Plugin Manager工具生成依赖树# 示例依赖分析脚本 import requests from jenkinsapi.plugin import Plugin core_plugins [git, maven-plugin, publish-over-ssh] dep_tree {} for plugin in core_plugins: p Plugin(plugin) dep_tree[plugin] p.get_dependencies()使用下载工具批量获取插件包# 使用jenkins-plugin-cli下载 java -jar jenkins-plugin-cli.jar \ --plugins git:4.7.1 maven-plugin:3.15 \ --download-dir /tmp/plugins建立内部插件仓库服务# Nginx配置示例 server { listen 8081; server_name plugins.internal; root /data/plugins; autoindex on; }经验分享实际项目中我们发现约80%的构建问题源于插件版本冲突建议固化主要插件版本3. Maven私有仓库的深度配置3.1 Nexus仓库的离线初始化使用Docker快速部署Nexus 3# docker-compose.yml version: 3 services: nexus: image: sonatype/nexus3:3.38.1 ports: - 8082:8081 volumes: - /data/nexus:/nexus-data environment: - INSTALL4J_ADD_VM_PARAMS-Xms2g -Xmx2g关键配置项创建maven-releases、maven-snapshots、maven-central三个仓库设置Cleanup策略保留最近10个版本配置Realms激活本地用户认证3.2 仓库数据的离线导入将开发环境的仓库数据迁移到内网压缩现有仓库tar czvf m2_repo.tar.gz ~/.m2/repository使用rsync同步到内网服务器rsync -avz -e ssh -p 2222 m2_repo.tar.gz jenkins192.168.1.100:/data在Nexus中配置仓库路由规则mirror idinternal-central/id nameInternal Central/name urlhttp://nexus.internal:8082/repository/maven-central//url mirrorOfcentral/mirrorOf /mirror性能优化技巧为Nexus配置SSD存储设置定时任务清理过期快照对频繁访问的依赖包设置缓存代理4. 项目构建与部署实战4.1 SVN仓库的鉴权配置在Jenkins中配置SVN认证时推荐使用Credential Binding// Jenkinsfile 示例 pipeline { environment { SVN_CREDS credentials(svn-account) } stages { stage(Checkout) { steps { checkout([ $class: SubversionSCM, locations: [[ credentialsId: svn-account, remote: svn://192.168.1.50/project/trunk ]], workspaceUpdater: [$class: UpdateUpdater] ]) } } } }4.2 Maven离线构建技巧settings.xml关键配置示例settings localRepository/data/m2_repo/localRepository offlinetrue/offline pluginGroups pluginGrouporg.sonarsource.scanner.maven/pluginGroup /pluginGroups servers server idnexus/id usernamedeploy/username password{加密密码}/password /server /servers /settings4.3 安全部署方案设计通过SSH插件实现可靠部署配置Jenkins服务器SSH Keyssh-keygen -t ed25519 -f /home/jenkins/.ssh/jenkins_deploy ssh-copy-id -i /home/jenkins/.ssh/jenkins_deploy.pub deploytarget-server在Pipeline中实现蓝绿部署stage(Deploy) { steps { sshPublisher( publishers: [ sshPublisherDesc( configName: production-server, transfers: [ sshTransfer( sourceFiles: target/*.jar, removePrefix: target, remoteDirectory: /app/versions, execCommand: /app/scripts/switch-version.sh ${BUILD_TAG} ) ] ) ] ) } }部署脚本示例#!/bin/bash # switch-version.sh NEW_VERSION$1 CURRENT_LINK/app/current # 停止旧服务 if [ -f $CURRENT_LINK/RUNNING_PID ]; then kill $(cat $CURRENT_LINK/RUNNING_PID) fi # 切换版本 ln -sfn /app/versions/$NEW_VERSION $CURRENT_LINK # 启动新服务 nohup $CURRENT_LINK/bin/start.sh /var/log/app.log 21 5. 系统维护与升级策略5.1 插件依赖管理方案建立插件版本矩阵表插件名称生产版本测试版本依赖项git4.11.34.11.5matrix-auth:2.6.6maven-plugin3.153.16workflow-api:2.46publish-over-ssh1.231.24jsch:0.1.55.2升级流程在测试环境验证新插件组合使用Jenkins CLI批量安装java -jar jenkins-cli.jar -s http://localhost:8080/ install-plugin \ /data/plugins/git.hpi /data/plugins/maven-plugin.hpi -restart观察至少两周稳定性后再同步到生产5.2 灾备与恢复方案设计每日备份任务# 备份脚本示例 #!/bin/bash BACKUP_DIR/backup/$(date %Y%m%d) mkdir -p $BACKUP_DIR # 备份Jenkins配置 rsync -a /data/jenkins_home $BACKUP_DIR # 备份Nexus数据 pg_dump -U nexus nexus $BACKUP_DIR/nexus.sql # 打包仓库数据 tar czf $BACKUP_DIR/m2_repo.tar.gz /data/m2_repo恢复测试建议每月执行一次验证备份有效性。6. 安全加固实践6.1 网络层防护使用VLAN隔离构建网络与生产网络配置防火墙白名单规则# 只允许从构建服务器访问部署目标 iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP6.2 访问控制策略Jenkins权限配置建议创建不同角色的服务账户启用Project-based Matrix Authorization定期审计用户权限// 角色权限示例 matrix { permissions { group(developers) { permissions hudson.model.Item.Read, hudson.model.Item.Build } group(architects) { permissions hudson.model.Item.Configure, hudson.model.Item.Delete } } }在金融行业客户的实际部署中这套方案成功支撑了日均300次的构建任务关键组件运行超过两年未出现重大故障。最值得分享的经验是离线环境下的CI/CD稳定比新特性更重要建立完善的变更管理流程比技术实现本身更具挑战性。