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有两种方式:

  1. 独立运行:
nohup java -jar jenkins.war --httpPort=8080 > jenkins.log 2>&1 &
  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,必须一起下载。我的经验是:

  1. 先安装低层依赖插件
  2. 再安装功能插件
  3. 最后安装界面增强插件

安装方式:

  1. 进入"管理Jenkins" > "插件管理" > "高级"
  2. 上传.hpi文件
  3. 重启Jenkins(访问http://your-jenkins/restart)

常见问题排查

  • 版本冲突:查看jenkins.log中的ClassNotFoundException
  • 循环依赖:按错误提示顺序安装
  • 启动失败:删除有问题的插件目录后重试

4. 全局工具配置

在"全局工具配置"中设置关键工具路径:

JDK配置

  • 别名:jdk1.8
  • JAVA_HOME:/usr/local/jdk1.8.0_301
  • 取消勾选"自动安装"

Maven配置

  1. 下载apache-maven-3.8.6-bin.tar.gz
  2. 解压到/usr/local
  3. 配置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项目,需要配置版本库访问权限:

  1. 在"凭据"中添加SVN账号密码
  2. 测试连接时使用svn://协议比http://更稳定
  3. 对于大型仓库,建议配置稀疏检出:
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:

  1. Name:Production
  2. Hostname:192.168.1.100
  3. Username:deployer
  4. 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 &

权限问题解决方案

  1. 在目标服务器创建deployer用户
  2. 配置sudo权限:
deployer ALL=(ALL) NOPASSWD: /bin/systemctl restart app
  1. 在Jenkins中使用sudo执行命令

8. 典型问题排查指南

构建失败

  1. 检查控制台输出最后的ERROR
  2. 查看workspace目录下的文件状态
  3. 对比本地构建结果

SSH连接超时

  1. 测试网络连通性
  2. 检查sshd_config配置
  3. 验证密钥认证

文件权限问题

  1. 确保Jenkins用户有读写权限
  2. 检查SELinux状态
  3. 验证umask设置

内存不足

  1. 调整JVM参数:
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=256m"
  1. 增加swap空间
  2. 限制并发构建数

在实际项目中,我还遇到过Windows换行符导致脚本执行失败的问题。解决方案是在Jenkins的"构建环境"中勾选"Delete workspace before build starts"和"Clean local Maven repository"。这些细节往往决定了部署的成败。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐