Ubuntu安装Jenkins完整教程(2025最新版)

 更新时间:2026年02月02日 11:26:39   作者:极客硬核风  
Jenkins是一个非常流行的免费自动化工具,每个人都应该了解它,下面这篇文章主要介绍了Ubuntu安装Jenkins的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

本文详细介绍在 Ubuntu 22.04.4 系统上安装 Jenkins 和 Java 17,并配置自动部署 jar 包的完整流程。包含详细的安装步骤、问题排查和实用配置。

一、环境准备

1.1 系统要求

  • 操作系统:Ubuntu 22.04.4 LTS
  • Java 版本:Java 17 或更高(Jenkins 2.528.1 要求)
  • 内存:至少 256MB,推荐 512MB 以上
  • 磁盘空间:至少 1GB 可用空间

1.2 检查系统版本

# 查看系统版本
lsb_release -a

# 输出示例:
# No LSB modules are available.
# Distributor ID: Ubuntu
# Description:    Ubuntu 22.04.4 LTS
# Release:        22.04
# Codename:       jammy

1.3 更新系统包

# 更新软件包列表
sudo apt-get update

# 升级系统包(可选)
sudo apt-get upgrade -y

二、安装 Java 17

2.1 方法一:使用 OpenJDK(推荐)

# 安装 OpenJDK 17
sudo apt-get install openjdk-17-jdk -y

# 验证安装
java -version

# 输出示例:
# openjdk version "17.0.x" 2024-xx-xx
# OpenJDK Runtime Environment (build 17.0.x+xx-Ubuntu-xx)
# OpenJDK 64-Bit Server VM (build 17.0.x+xx-Ubuntu-xx, mixed mode, sharing)

2.2 方法二:使用 Oracle JDK 17

如果您已经下载了 Oracle JDK 17,可以按以下方式配置:

# 假设 JDK 安装在 /www/server/java/jdk-17.0.8
# 验证 Java
/www/server/java/jdk-17.0.8/bin/java -version

# 输出示例:
# java version "17.0.8" 2023-07-18 LTS
# Java(TM) SE Runtime Environment (build 17.0.8+9-LTS-211)
# Java HotSpot(TM) 64-Bit Server VM (build 17.0.8+9-LTS-211, mixed mode, sharing)

2.3 设置 JAVA_HOME(可选)

# 编辑环境变量文件
sudo nano /etc/environment

# 添加以下内容(根据实际路径修改)
JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
# 或者使用 Oracle JDK
# JAVA_HOME="/www/server/java/jdk-17.0.8"

# 使环境变量生效
source /etc/environment

# 验证
echo $JAVA_HOME

三、安装 Jenkins

3.1 添加 Jenkins 仓库密钥

# 添加 Jenkins 官方仓库密钥
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
  /usr/share/keyrings/jenkins-keyring.asc > /dev/null

3.2 添加 Jenkins 仓库

# 添加 Jenkins 仓库到系统源列表
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null

3.3 更新软件包列表

# 更新软件包列表
sudo apt-get update

注意:如果遇到 PHP PPA 的警告,可以忽略或执行:

sudo apt-get update --allow-releaseinfo-change

3.4 安装 Jenkins

# 安装 Jenkins
sudo apt-get install jenkins -y

安装完成后,Jenkins 会自动:

  • 创建 jenkins 用户
  • 创建必要的目录结构
  • 配置 systemd 服务

四、配置 Jenkins 使用 Java 17

4.1 方法一:修改配置文件(推荐)

# 备份配置文件
sudo cp /etc/default/jenkins /etc/default/jenkins.bak

# 编辑配置文件
sudo nano /etc/default/jenkins

在文件开头添加或修改 JAVA_HOME

# 如果使用 OpenJDK 17
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

# 如果使用 Oracle JDK 17(根据实际路径修改)
JAVA_HOME=/www/server/java/jdk-17.0.8

或者使用命令行直接修改:

# 删除旧的 JAVA_HOME 配置
sudo sed -i '/^JAVA_HOME=/d' /etc/default/jenkins

# 在文件开头添加新的 JAVA_HOME
sudo sed -i "1i JAVA_HOME=/www/server/java/jdk-17.0.8" /etc/default/jenkins

# 验证配置
grep "^JAVA_HOME" /etc/default/jenkins

4.2 方法二:修改 systemd 服务文件(如果方法一不生效)

# 备份服务文件
sudo cp /lib/systemd/system/jenkins.service /lib/systemd/system/jenkins.service.bak

# 编辑服务文件
sudo nano /lib/systemd/system/jenkins.service

[Service] 部分添加环境变量:

[Service]
Environment="JAVA_HOME=/www/server/java/jdk-17.0.8"
Environment="PATH=/www/server/java/jdk-17.0.8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Type=notify
# ... 其他配置

或者使用命令行:

# 在 [Service] 部分添加环境变量
sudo sed -i '/\[Service\]/a Environment="JAVA_HOME=/www/server/java/jdk-17.0.8"' /lib/systemd/system/jenkins.service
sudo sed -i '/\[Service\]/a Environment="PATH=/www/server/java/jdk-17.0.8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"' /lib/systemd/system/jenkins.service

# 验证修改
sudo grep -A 5 "\[Service\]" /lib/systemd/system/jenkins.service

五、启动和验证 Jenkins

5.1 创建部署目录

# 创建应用部署目录
sudo mkdir -p /opt/apps /opt/apps/backup

# 设置权限(让 Jenkins 用户可以操作)
sudo chown -R jenkins:jenkins /opt/apps

5.2 启动 Jenkins 服务

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启动 Jenkins
sudo systemctl start jenkins

# 设置开机自启
sudo systemctl enable jenkins

# 检查服务状态
sudo systemctl status jenkins

5.3 查看初始管理员密码

# 查看初始管理员密码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

# 输出示例:
# 8b605dd1a1354ca3450c291f3e6e0b23

重要:请保存这个密码,后续初始化需要使用!

5.4 验证 Jenkins 运行

# 检查 Jenkins 进程
ps aux | grep jenkins

# 检查端口占用(默认 8080)
sudo ss -tlnp | grep 8080

# 输出示例:
# LISTEN 0 50 *:8080 *:* users:(("java",pid=507324,fd=66))

5.5 访问 Jenkins Web 界面

在浏览器中打开:

http://您的服务器IP:8080

如果服务器在本地,访问:

http://localhost:8080

注意:如果无法访问,请检查防火墙设置:

# Ubuntu 使用 ufw 防火墙
sudo ufw allow 8080/tcp
sudo ufw reload

# 或者使用 iptables
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

六、Jenkins 初始化配置

6.1 解锁 Jenkins

  1. 首次访问 Jenkins,会看到"解锁 Jenkins"页面
  2. 在输入框中粘贴之前获取的初始管理员密码
  3. 点击"继续"

6.2 安装插件

Jenkins 会提示选择插件安装方式:

选项一:安装推荐的插件(推荐)

  • 适合大多数用户
  • 自动安装常用插件

选项二:选择插件来安装

  • 手动选择需要的插件
  • 适合有特定需求的用户

建议选择"安装推荐的插件",等待安装完成。

6.3 创建管理员用户

插件安装完成后,会提示创建第一个管理员用户:

  • 用户名:设置管理员用户名
  • 密码:设置管理员密码
  • 全名:设置显示名称(可选)
  • 电子邮件地址:设置邮箱(可选)

填写完成后,点击"保存并完成"。

6.4 配置 Jenkins URL

确认 Jenkins 的访问地址,一般保持默认即可:

http://您的服务器IP:8080/

点击"保存并完成"。

6.5 Jenkins 已就绪

看到"Jenkins 已就绪!"页面,点击"开始使用 Jenkins"即可进入 Jenkins 主界面。

七、配置自动部署 Jar 包

7.1 创建 Jenkins 项目

  1. 点击"新建任务"(New Item)
  2. 输入项目名称,例如:deploy-jar-app
  3. 选择项目类型:选择"自由风格的软件项目"(Freestyle project)
  4. 点击"确定"

7.2 配置项目

7.2.1 基本配置

  • 描述:填写项目描述,例如"自动部署 Jar 包应用"

7.2.2 构建步骤

  1. 点击"增加构建步骤"
  2. 选择"执行 shell"
  3. 在命令框中输入以下脚本:
#!/bin/bash

# ============================================
# Jenkins 自动部署 Jar 包脚本
# ============================================

# ========== 配置区域(根据实际情况修改)==========
APP_NAME="your-app"                    # 应用名称(修改为您的应用名)
APP_DIR="/opt/apps"                     # 应用部署目录
JAR_FILE="${APP_NAME}.jar"              # Jar 文件名
FULL_JAR_PATH="${APP_DIR}/${JAR_FILE}"  # 完整路径
BACKUP_DIR="${APP_DIR}/backup"           # 备份目录
JAVA_HOME="/www/server/java/jdk-17.0.8" # Java 路径(根据实际情况修改)
JAVA_CMD="${JAVA_HOME}/bin/java"
LOG_FILE="${APP_DIR}/app.log"           # 日志文件
# ============================================

# 创建必要的目录
mkdir -p ${BACKUP_DIR}
mkdir -p ${APP_DIR}

# 查找并停止旧进程
echo "=========================================="
echo "停止旧服务..."
echo "=========================================="
OLD_PID=$(ps aux | grep "[j]ava.*${JAR_FILE}" | awk '{print $2}')
if [ ! -z "$OLD_PID" ]; then
    echo "找到运行中的进程 PID: $OLD_PID"
    kill $OLD_PID
    sleep 3
    # 如果还在运行,强制杀死
    if ps -p $OLD_PID > /dev/null 2>&1; then
        echo "强制停止进程..."
        kill -9 $OLD_PID
        sleep 2
    fi
    echo "旧服务已停止"
else
    echo "没有运行中的服务"
fi

# 备份旧版本
if [ -f "${FULL_JAR_PATH}" ]; then
    echo ""
    echo "=========================================="
    echo "备份旧版本..."
    echo "=========================================="
    BACKUP_FILE="${BACKUP_DIR}/${JAR_FILE}.$(date +%Y%m%d_%H%M%S)"
    cp ${FULL_JAR_PATH} ${BACKUP_FILE}
    echo "已备份到: ${BACKUP_FILE}"
    
    # 只保留最近 10 个备份
    echo "清理旧备份(只保留最近10个)..."
    cd ${BACKUP_DIR}
    ls -t ${JAR_FILE}.* 2>/dev/null | tail -n +11 | xargs rm -f 2>/dev/null
fi

# 查找并复制新 jar 包
echo ""
echo "=========================================="
echo "查找上传的 jar 包..."
echo "=========================================="

# 从 Jenkins workspace 中查找 jar 文件
UPLOADED_JAR=$(find ${WORKSPACE} -name "*.jar" -type f | head -1)

if [ -z "$UPLOADED_JAR" ] || [ ! -f "$UPLOADED_JAR" ]; then
    echo "❌ 错误:未找到上传的 jar 文件!"
    echo "请确保在构建前上传 jar 文件到 workspace"
    echo "Workspace 路径: ${WORKSPACE}"
    exit 1
fi

echo "找到上传的 jar: ${UPLOADED_JAR}"
echo "文件大小: $(du -h ${UPLOADED_JAR} | cut -f1)"

# 复制到部署目录
echo ""
echo "=========================================="
echo "复制到部署目录..."
echo "=========================================="
cp ${UPLOADED_JAR} ${FULL_JAR_PATH}
echo "✅ Jar 包已复制到: ${FULL_JAR_PATH}"

# 启动新服务
echo ""
echo "=========================================="
echo "启动新服务..."
echo "=========================================="
cd ${APP_DIR}

# 启动命令(根据实际需求修改 JVM 参数)
nohup ${JAVA_CMD} \
    -Xms512m \
    -Xmx1024m \
    -jar ${FULL_JAR_PATH} \
    > ${LOG_FILE} 2>&1 &

# 等待启动
sleep 5

# 检查是否启动成功
NEW_PID=$(ps aux | grep "[j]ava.*${JAR_FILE}" | awk '{print $2}')
if [ ! -z "$NEW_PID" ]; then
    echo ""
    echo "=========================================="
    echo "✅ 服务启动成功!"
    echo "=========================================="
    echo "进程 PID: $NEW_PID"
    echo "日志文件: ${LOG_FILE}"
    echo "部署目录: ${APP_DIR}"
    echo ""
    echo "查看日志: tail -f ${LOG_FILE}"
    echo "=========================================="
    exit 0
else
    echo ""
    echo "=========================================="
    echo "❌ 错误:服务启动失败!"
    echo "=========================================="
    echo "查看日志:"
    tail -50 ${LOG_FILE}
    echo ""
    echo "尝试回滚到旧版本..."
    if [ -f "${BACKUP_FILE}" ]; then
        cp ${BACKUP_FILE} ${FULL_JAR_PATH}
        nohup ${JAVA_CMD} -jar ${FULL_JAR_PATH} > ${LOG_FILE} 2>&1 &
        echo "已回滚到旧版本"
    fi
    exit 1
fi

重要提示

  • 修改脚本中的 APP_NAME 为您的实际应用名称
  • 根据实际情况修改 JAVA_HOME 路径
  • 根据应用需求调整 JVM 参数(-Xms-Xmx

7.2.3 保存配置

点击"保存"完成项目配置。

7.3 使用方式

方式一:通过 SSH 上传后构建

# 在本地执行(上传 jar 包到 Jenkins workspace)
scp your-app.jar root@服务器IP:/var/lib/jenkins/workspace/deploy-jar-app/

# 然后在 Jenkins Web 界面点击"立即构建"

方式二:使用文件参数插件(推荐)

  1. 安装插件

    • 管理 Jenkins → 插件管理
    • 搜索 “File Parameter Plugin”
    • 安装并重启 Jenkins
  2. 配置项目参数

    • 项目配置 → 勾选"This project is parameterized"
    • 添加参数 → 选择"File parameter"
    • 参数名:JAR_FILE
    • 文件位置:${WORKSPACE}/uploaded.jar
  3. 修改构建脚本

    • 将脚本中的 UPLOADED_JAR 查找部分改为:
    UPLOADED_JAR="${WORKSPACE}/uploaded.jar"
    
  4. 使用方式

    • 点击"Build with Parameters"
    • 选择要上传的 jar 文件
    • 点击"构建"

方式三:本地脚本自动上传并触发(推荐)

创建本地部署脚本 deploy.sh

#!/bin/bash

# 配置
SERVER_IP="your-server-ip"
SERVER_USER="root"
JAR_FILE="target/your-app.jar"
JENKINS_JOB_NAME="deploy-jar-app"
JENKINS_WORKSPACE="/var/lib/jenkins/workspace/${JENKINS_JOB_NAME}"

echo "=========================================="
echo "开始部署..."
echo "=========================================="

# 1. 上传 jar 包到服务器
echo "1. 上传 jar 包..."
scp ${JAR_FILE} ${SERVER_USER}@${SERVER_IP}:${JENKINS_WORKSPACE}/

if [ $? -ne 0 ]; then
    echo "❌ 上传失败"
    exit 1
fi

echo "✅ 上传成功"

# 2. 触发 Jenkins 构建
echo ""
echo "2. 触发 Jenkins 构建..."
ssh ${SERVER_USER}@${SERVER_IP} "curl -X POST http://localhost:8080/job/${JENKINS_JOB_NAME}/build"

if [ $? -eq 0 ]; then
    echo "✅ 构建已触发"
    echo ""
    echo "查看构建状态: http://${SERVER_IP}:8080/job/${JENKINS_JOB_NAME}/"
else
    echo "❌ 触发构建失败"
    exit 1
fi

使用方式:

chmod +x deploy.sh
./deploy.sh

八、常见问题排查

8.1 Jenkins 启动失败

问题:Java 版本不兼容

错误信息

Running with Java 11 from /www/server/java/jdk-11.0.19, which is older than the minimum required version (Java 17).
Supported Java versions are: [17, 21]

解决方法

  • 安装 Java 17 或更高版本
  • 配置 Jenkins 使用正确的 Java 路径

问题:端口被占用

错误信息

java.net.BindException: Address already in use
Failed to bind to 0.0.0.0/0.0.0.0:8080

解决方法

# 查找占用 8080 端口的进程
sudo lsof -i :8080
# 或
sudo ss -tlnp | grep 8080

# 停止相关进程
sudo pkill -f jenkins

# 或者修改 Jenkins 端口
sudo nano /etc/default/jenkins
# 修改 HTTP_PORT=8080 为其他端口,如 8081

问题:权限不足

解决方法

# 确保 Jenkins 用户有权限访问相关目录
sudo chown -R jenkins:jenkins /var/lib/jenkins
sudo chown -R jenkins:jenkins /var/log/jenkins
sudo chown -R jenkins:jenkins /opt/apps

8.2 构建失败

问题:找不到 jar 文件

错误信息

❌ 错误:未找到上传的 jar 文件!

解决方法

  • 确保 jar 文件已上传到 Jenkins workspace
  • 检查文件路径是否正确
  • 如果使用文件参数,确保插件已安装

问题:服务启动失败

解决方法

# 查看应用日志
tail -50 /opt/apps/app.log

# 检查 Java 版本是否兼容
/www/server/java/jdk-17.0.8/bin/java -version

# 检查端口是否被占用
sudo netstat -tlnp | grep 应用端口

# 检查 JVM 参数是否合理
# 根据服务器内存调整 -Xms 和 -Xmx

8.3 其他问题

问题:无法访问 Jenkins Web 界面

解决方法

# 检查防火墙
sudo ufw status
sudo ufw allow 8080/tcp

# 检查 Jenkins 服务状态
sudo systemctl status jenkins

# 查看 Jenkins 日志
sudo journalctl -u jenkins -n 50

问题:忘记初始管理员密码

解决方法

# 查看初始密码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

# 如果已创建管理员用户,可以重置密码
# 编辑配置文件
sudo nano /var/lib/jenkins/config.xml
# 找到 <useSecurity>true</useSecurity> 改为 false
# 重启 Jenkins
sudo systemctl restart jenkins
# 访问 Web 界面,重新配置安全设置

九、常用命令

9.1 Jenkins 服务管理

# 启动 Jenkins
sudo systemctl start jenkins

# 停止 Jenkins
sudo systemctl stop jenkins

# 重启 Jenkins
sudo systemctl restart jenkins

# 查看状态
sudo systemctl status jenkins

# 查看日志
sudo journalctl -u jenkins -f

9.2 应用管理

# 查看应用日志
tail -f /opt/apps/app.log

# 查看应用进程
ps aux | grep java | grep your-app.jar

# 停止应用
pkill -f "your-app.jar"

# 查看备份
ls -lh /opt/apps/backup/

9.3 查看 Jenkins 信息

# 查看 Jenkins 版本
jenkins --version

# 查看 Jenkins 配置
cat /etc/default/jenkins

# 查看 Jenkins 工作目录
ls -la /var/lib/jenkins/

十、总结

本文详细介绍了在 Ubuntu 22.04.4 上安装 Jenkins 和 Java 17 的完整流程,包括:

安装步骤

  • Java 17 安装(OpenJDK 和 Oracle JDK)
  • Jenkins 安装和配置
  • 服务启动和验证

配置说明

  • Jenkins 使用 Java 17 的配置方法
  • 自动部署 jar 包的完整脚本
  • 多种使用方式

问题排查

  • 常见错误及解决方法
  • 服务管理命令
  • 日志查看方法

关键要点

  1. Java 版本要求:Jenkins 2.528.1 需要 Java 17 或更高版本
  2. 配置方法:可以通过 /etc/default/jenkins 或 systemd 服务文件配置 Java
  3. 部署脚本:提供了完整的自动部署脚本,支持备份和回滚
  4. 使用方式:支持多种部署方式,可根据需求选择

后续优化建议

  1. 配置 HTTPS:提高安全性
  2. 配置反向代理:使用 Nginx 作为反向代理
  3. 配置备份策略:定期备份 Jenkins 配置和数据
  4. 监控告警:配置 Jenkins 监控和告警
  5. 权限管理:配置用户权限和角色

参考资料

总结

到此这篇关于Ubuntu安装Jenkins完整教程的文章就介绍到这了,更多相关Ubuntu安装Jenkins内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • maven导入本地仓库jar包,报:Could not find artifact的解决

    maven导入本地仓库jar包,报:Could not find artifact的解决

    这篇文章主要介绍了maven导入本地仓库jar包,报:Could not find artifact的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • SpringBoot使用RESTful接口详解

    SpringBoot使用RESTful接口详解

    RESTful是一种web软件风格,它不是标准也不是协议,它不一定要采用,只是一种风格,它倡导的是一个资源定位(url)及资源操作的风格,这篇文章主要介绍了SpringBoot使用RESTful接口
    2022-10-10
  • java多线程详细总结

    java多线程详细总结

    以下小编就对java中的多线程进行了详细的总结分析,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • 快速排序的深入详解以及java实现

    快速排序的深入详解以及java实现

    本篇文章是对java中的快速排序进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • redis深入浅出分布式锁实现上篇

    redis深入浅出分布式锁实现上篇

    在单体应用中,如果我们对共享数据不进行加锁操作,会出现数据一致性问题,我们的解决办法通常是加锁。下面我们一起聊聊使用redis来实现分布式锁
    2022-08-08
  • Java对数器验证算法详解

    Java对数器验证算法详解

    这篇文章主要介绍了Java对数器验证算法,Java对数函数的计算方法非常有问题,然而在API中却有惊人的误差。但是假如运用了以下的方法,用Java处理数字所碰到的小麻烦就可以轻而易举的解决了
    2023-04-04
  • SpringBoot实现图片防盗链的五种方式详解

    SpringBoot实现图片防盗链的五种方式详解

    出于安全考虑,我们需要后端返回的图片只允许在某个网站内展示,不想被爬虫拿到图片地址后被下载,或者,不想浏览器直接访问图片链接,出于性能考虑,不想要别人的网站,拿着我们的图片链接去展示,所以本文给大家介绍了SpringBoot实现图片防盗链的五种方式
    2025-08-08
  • Java RSA加密工具类的设计与实现详解

    Java RSA加密工具类的设计与实现详解

    RSA算法是一种常用的非对称加密算法,这篇文章主要为大家详细介绍了如何通过Java编写一个RSA加密工具类,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-02-02
  • Python__双划线参数代码实例解析

    Python__双划线参数代码实例解析

    这篇文章主要介绍了python__双划线参数代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java 轻松实现二维数组与稀疏数组互转

    Java 轻松实现二维数组与稀疏数组互转

    在某些应用场景中需要大量的二维数组来进行数据存储,但是二维数组中却有着大量的无用的位置占据着内存空间,稀疏数组就是为了优化二维数组,节省内存空间
    2022-04-04

最新评论