环境准备与安装基础
在已完成 Java 环境及 Tomcat 服务器部署的前提下(Tomcat 需支持 Servlet 4.0+ 规范),本节将部署 Jenkins WAR 包至 Tomcat 容器。Jenkins 作为 Java 编写的开源持续集成工具,其 WAR(Web Application Archive) 文件可通过官方镜像获取:
bash
安装 wget 工具(如缺失)
yum install wget -y
下载最新稳定版 Jenkins WAR
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
注:若虚拟机网络异常,可通过 SCP 从主机传输:
scp jenkins.war root@192.168.0.106:/root/
Tomcat 容器部署流程
1 ) 定位 Web 应用目录
Tomcat 标准部署路径为 /var/lib/tomcat/webapps(符号链接指向 /usr/share/tomcat/webapps):
bash
mv /root/jenkins.war /var/lib/tomcat/webapps/
关键验证:执行 ls /var/lib/tomcat/webapps 确认文件存在
2 ) 服务重启与异常处理
重启 Tomcat 后应自动解压 WAR 文件:
bash
systemctl restart tomcat
若未生成 jenkins 目录,根源在于 SELinux 安全策略:
bash
getenforce # 返回 Enforcing 表示策略生效
SELinux 权限解决方案
1 ) 临时方案(不推荐)
bash
setenforce 0 # 切换为 Permissive 模式
systemctl restart tomcat
2 ) 永久修正方案
核心步骤:修正 WAR 文件安全上下文:
bash
# 查看目标目录安全上下文
ls -Zd /var/lib/tomcat/webapps/ # 输出示例:system_u:object_r:tomcat_var_lib_t:s0
# 应用正确上下文类型
semanage fcontext -a -t tomcat_var_lib_t "/var/lib/tomcat/webapps/jenkins.war"
restorecon -v /var/lib/tomcat/webapps/jenkins.war
systemctl restart tomcat # 重启服务
- 正确上下文应为:
tomcat_var_lib_t - 再次重启Tomcat服务生效
- 根本原因:从
/root目录移动文件导致安全上下文不匹配,最佳实践是直接下载至目标目录
3 ) 最佳实践
直接下载至目标目录避免权限问题:
bash
cd /var/lib/tomcat/webapps/
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
自定义 Jenkins 主目录配置
默认目录 /usr/share/tomcat/.jenkins 可调整:
bash
创建新数据目录
mkdir /var/lib/jenkins
chown tomcat:tomcat /var/lib/jenkins
修改 Tomcat 上下文配置:
xml
<!-- 编辑 /etc/tomcat/context.xml -->
<Context>
<Environment
name="JENKINS_HOME"
value="/var/lib/jenkins"
type="java.lang.String" />
</Context>
重启生效:systemctl restart tomcat
初始化流程问题排查
1 ) 管理员解锁
访问 http://<IP>:8080/jenkins,输入初始密码:
bash
cat /var/lib/jenkins/secrets/initialAdminPassword
2 ) 离线错误修复
若出现 This Jenkins instance appears to be offline:
bash
sed -i 's/https:\/\//http:\/\//g' /var/lib/jenkins/hudson.model.UpdateCenter.xml
systemctl restart tomcat
3 ) 插件安装异常处理
初始化时可能出现No such plugin错误,解决方案:
-
暂时选择
Install suggested plugins或None跳过插件安装 -
手动检查网络连接与防火墙策略
-
验证插件目录权限:
bashchown -R tomcat:tomcat /var/lib/jenkins/plugins -
永久解决:
修改更新中心协议(将HTTPS改为HTTP):bashecho '<?xml version="1.1" encoding="UTF-8"?> <sites> <site> <id>default</id> <url>http://updates.jenkins.io/update-center.json</url> </site> </sites>' > /var/lib/jenkins/hudson.model.UpdateCenter.xml
4 ) HTTPS访问故障排除
若出现This Jenkins instance appears to be offline错误,需修改更新中心协议:
-
编辑配置文件:
bashvi /var/lib/jenkins/hudson.model.UpdateCenter.xml -
替换协议为HTTP:
xml<url>http://updates.jenkins.io/update-center.json</url>
5 )管理员账户创建
通过初始化界面创建管理员账户,需输入:
- 用户名(Username)
- 密码(Password)及确认密码
- 全名(Full name)
完成创建后即可访问Jenkins主面板
NestJS 集成 Jenkins API 示例
typescript
import { Injectable } from '@nestjs/common';
import axios from 'axios';
@Injectable()
export class JenkinsService {
private readonly BASE_URL = 'http://jenkins-host:8080/jenkins';
private readonly USERNAME = 'amigo';
private readonly API_TOKEN = 'xxxxxxxxxx'; // Jenkins 后台生成
async triggerBuild(jobName: string): Promise<string> {
const url = `${this.BASE_URL}/job/${jobName}/build`;
const response = await axios.post(url, null, {
auth: { username: this.USERNAME, password: this.API_TOKEN }
});
if (response.status === 201) {
return `Build queued. Location: ${response.headers.location}`;
}
throw new Error(`Trigger failed: ${response.statusText}`);
}
async getBuildStatus(jobName: string, buildId: number): Promise<any> {
const url = `${this.BASE_URL}/job/${jobName}/${buildId}/api/json`;
return axios.get(url, {
auth: { username: this.USERNAME, password: this.API_TOKEN }
});
}
}
关键配置:需在 Jenkins 的 Manage Credentials 生成 API Token
Tomcat 生产环境优化建议
原生局限性:
- 静态资源处理性能低下
- 缺乏 HTTPS 原生支持
- 高并发连接管理能力弱
推荐架构:
HTTPS HTTP/1.1 Static Files Client Nginx Jenkins on Tomcat CDN
实施要点:
- Nginx 处理 SSL 卸载与静态缓存
- 动态请求通过
proxy_pass转发至 Tomcat - 使用
upstream模块实现负载均衡(后续详解)
架构优化方案: 使用Nginx/Apache作为反向代理服务器:
-
HTTP反向代理模式(推荐):
nginxserver { listen 443 ssl; server_name jenkins.example.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } -
专用连接器模式(仅Apache):
-
Apache mod_jk插件,使用专用协议(AJP)在Apache与Tomcat间通信,需安装模块:
bashyum install mod_jk # 安装mod_jk配置
apacheLoadModule jk_module modules/mod_jk.so JkWorkersFile conf/workers.properties JkMount /jenkins worker1
关键技术总结
- 部署流程:下载WAR → 放置Tomcat目录 → 修正SELinux上下文 → 重启服务
- 性能优化:务必通过Nginx/Apache代理Tomcat,分离静态资源与动态请求
- SELinux策略是文件部署失败的核心原因,需通过
semanage和restorecon修复上下文 - JENKINS_HOME环境变量决定配置/日志/构建数据的存储位置
- WAR文件部署本质是Servlet容器的自动解压机制
- 生产环境必须通过反向代理解决Tomcat的HTTPS与性能瓶颈
- 插件安装依赖网络策略和目录权限的正确配置
通过上述步骤,可确保Jenkins在Tomcat中稳定运行,同时解决SELinux、插件安装等典型问题
代理服务器的引入显著提升系统安全性与性能