Linux小课堂: Tomcat容器中部署Jenkins的完整流程与关键技术要点

环境准备与安装基础

在已完成 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错误,解决方案:

  1. 暂时选择Install suggested pluginsNone跳过插件安装

  2. 手动检查网络连接与防火墙策略

  3. 验证插件目录权限:

    bash 复制代码
    chown -R tomcat:tomcat /var/lib/jenkins/plugins 
  4. 永久解决:
    修改更新中心协议(将HTTPS改为HTTP):

    bash 复制代码
    echo '<?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错误,需修改更新中心协议:

  • 编辑配置文件:

    bash 复制代码
    vi /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 生产环境优化建议

原生局限性:

  1. 静态资源处理性能低下
  2. 缺乏 HTTPS 原生支持
  3. 高并发连接管理能力弱

推荐架构:
HTTPS HTTP/1.1 Static Files Client Nginx Jenkins on Tomcat CDN

实施要点:

  • Nginx 处理 SSL 卸载与静态缓存
  • 动态请求通过 proxy_pass 转发至 Tomcat
  • 使用 upstream 模块实现负载均衡(后续详解)

架构优化方案: 使用Nginx/Apache作为反向代理服务器:

  1. HTTP反向代理模式(推荐):

    nginx 复制代码
    server {
        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;
        }
    }
  2. 专用连接器模式(仅Apache):

  • Apache mod_jk插件,使用专用协议(AJP)在Apache与Tomcat间通信,需安装模块:

    bash 复制代码
    yum install mod_jk  # 安装mod_jk 

    配置

    apache 复制代码
    LoadModule jk_module modules/mod_jk.so
    JkWorkersFile conf/workers.properties
    JkMount /jenkins worker1

关键技术总结

  1. 部署流程:下载WAR → 放置Tomcat目录 → 修正SELinux上下文 → 重启服务
  2. 性能优化:务必通过Nginx/Apache代理Tomcat,分离静态资源与动态请求
  3. SELinux策略是文件部署失败的核心原因,需通过semanagerestorecon修复上下文
  4. JENKINS_HOME环境变量决定配置/日志/构建数据的存储位置
  5. WAR文件部署本质是Servlet容器的自动解压机制
  6. 生产环境必须通过反向代理解决Tomcat的HTTPS与性能瓶颈
  7. 插件安装依赖网络策略和目录权限的正确配置

通过上述步骤,可确保Jenkins在Tomcat中稳定运行,同时解决SELinux、插件安装等典型问题

代理服务器的引入显著提升系统安全性与性能

相关推荐
芙蓉王真的好14 小时前
优化 Jenkins 构建脚本:避免 pnpm lockfile 相关报错的关键配置
spring·servlet·jenkins
要站在顶端4 小时前
Jenkins Pipeline 多job依赖、触发多Job、并行执行及制品下载
运维·servlet·jenkins
Ghost Face...4 小时前
深入解析U-Boot命令系统
linux·运维·服务器
NiKo_W4 小时前
Linux 网络初识
linux·网络·网络协议
ajax_beijing4 小时前
当同一个弹性云服务器所在子网同时设置了snat和弹性公网IP时,会优先使用哪个
linux·运维·服务器
聆风吟º4 小时前
Linux远程控制Windows桌面的cpolar实战指南
linux·运维·windows
RealPluto4 小时前
SSH连接本地VMware内的虚拟机
linux·全栈
gfdgd xi4 小时前
deepin 终端,但是版本是 deepin 15 的
linux·python·架构·ssh·bash·shell·deepin
赖small强5 小时前
[Linux 内核]翻译kernel-4.4.94/Documentation/sysctl/vm.txt
linux·min_free_kbytes·nr_trim_pages·overcommit