# 在云服务器上安装与使用Jenkins(基于 CentOS Stream 9)

大家好,我是汪小成。

前言

本文记录了在 CentOS Stream 9(基于 RHEL 9)云服务器 上,从零安装 Jenkins、配置运行环境、到创建流水线并构建项目的完整流程。

如果你也在云服务器上部署微服务项目,可以直接参考本教程完成一套可复用的 CI 流水线。

整体流程示意图

先用一张流程图看一下整个过程的大致步骤:

一、环境准备

1. SSH 登录云服务器并查看系统版本

如果你已经知道操作系统版本,可以跳过本小节。

使用 SSH 登录云服务器后,执行以下命令查看系统版本:

bash 复制代码
cat /etc/os-release

参考输出:

text 复制代码
NAME="CentOS Stream"
VERSION="9"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="9"
PLATFORM_ID="platform:el9"
PRETTY_NAME="CentOS Stream 9"
ANSI_COLOR="0;31"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:centos:centos:9"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux 9"
REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream"

可以确认当前系统为 CentOS Stream 9(基于 RHEL9)

2. 检查是否已安装 JDK

Jenkins 运行依赖 Java 环境,这里检查是否已经安装 JDK:

bash 复制代码
java -version

示例输出:

text 复制代码
openjdk version "17.0.16" 2025-07-15 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.16.0.8-1) (build 17.0.16+8-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.16.0.8-1) (build 17.0.16+8-LTS, mixed mode, sharing)

从上面的输出可以看到云服务器已安装 OpenJDK 17

如果没有安装,可根据系统版本自行先安装 JDK(例如 dnf install java-17-openjdk)。

3. 检查内存与磁盘空间

Jenkins 对服务器配置有一定要求,建议:

  • 内存 ≥ 2GB
  • 磁盘 ≥ 10GB

查看内存大小

bash 复制代码
free -h

示例输出:

text 复制代码
               total        used        free      shared  buff/cache   available
Mem:           7.7Gi       5.0Gi       316Mi       1.6Gi       4.3Gi       2.7Gi
Swap:             0B          0B          0B

查看磁盘空间

bash 复制代码
df -h

示例输出:

text 复制代码
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           1.6G   79M  1.5G   6% /run
/dev/vda2        40G   15G   24G  38% /
/dev/vda1       200M  7.5M  193M   4% /boot/efi
tmpfs           787M     0  787M   0% /run/user/0

确认可用空间满足 Jenkins 运行需求即可。

二、安装 Jenkins

1. 添加 Jenkins 仓库与导入密钥

在 CentOS/RHEL 系统上通过官方仓库安装 Jenkins:

bash 复制代码
sudo wget -O /etc/yum.repos.d/jenkins.repo \
  https://pkg.jenkins.io/redhat/jenkins.repo

sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io-2023.key

2. 安装 Jenkins

bash 复制代码
sudo dnf install -y jenkins

3. 启动 Jenkins 并设置为开机自启

bash 复制代码
# 设置开机自启
sudo systemctl enable jenkins

# 启动 Jenkins
sudo systemctl start jenkins

# 查看 Jenkins 状态
sudo systemctl status jenkins

如果状态为 active (running) 则说明 Jenkins 已经成功启动。

4. 首次登录与初始化配置

默认情况下,Jenkins 会监听 8080 端口。在浏览器中访问:

text 复制代码
http://你的服务器公网IP:8080

进入初始密码输入界面:

在云服务器终端中执行以下命令获取初始管理员密码:

bash 复制代码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

复制该密码,粘贴到浏览器页面中,按照向导完成:

  1. 选择 "安装推荐插件"
  2. 安装完成后,创建第一个管理员账号
  3. 保存配置并进入 Jenkins 主界面

5. 修改 Jenkins 端口号

如果服务器上 8080 端口已被占用,可以通过编辑 systemd 单元文件修改 Jenkins 端口。

Jenkins 在 RHEL/CentOS 上通常通过 systemd 配置端口,默认单元文件路径为:

text 复制代码
/usr/lib/systemd/system/jenkins.service

查看当前端口配置:

bash 复制代码
sudo cat /usr/lib/systemd/system/jenkins.service | grep -n JENKINS

输出中可以看到类似内容:

text 复制代码
Environment="JENKINS_PORT=8080"

编辑该文件,将 8080 改为希望使用的端口号(例如 9090),保存并退出,然后执行:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl restart jenkins

⚠️ 别忘了在云厂商控制台的安全组中放行新端口,否则外网无法访问 Jenkins。

三、安装 Git 与 Maven

在云服务器上安装 Git 和 Maven(供 Jenkins 使用):

bash 复制代码
sudo dnf install -y git maven

安装完成后,检查版本:

bash 复制代码
git --version
mvn --version

能正常输出版本信息即可。

四、在 Jenkins 中配置 JDK 与 Maven

在 Jenkins 页面中,点击右上角的 "系统管理" 图标,然后进入 "全局工具配置"

进入后可以看到 JDK、Git、Maven 等工具的配置项:

1. 配置 JDK

找到 JDK 区域:

  1. 取消勾选 "自动安装"
  2. 输入一个易于识别的 名称/别名 (例如 jdk17
  3. JAVA_HOME 中填入 Java 安装目录

如果不确定 JDK 安装路径,可以在终端中执行:

bash 复制代码
readlink -f $(which java)

示例输出:

text 复制代码
/usr/lib/jvm/java-17-openjdk-17.0.16.0.8-2.el9.x86_64/bin/java

JAVA_HOME 应填写为去掉 /bin/java 之后的部分:

text 复制代码
/usr/lib/jvm/java-17-openjdk-17.0.16.0.8-2.el9.x86_64

2. 配置 Maven

在同一页面找到 Maven 区域:

  1. 取消勾选 "自动安装"
  2. 填写一个 Name(例如 maven-3
  3. MAVEN_HOME 中填写本机 Maven 安装目录,例如:
text 复制代码
/usr/share/maven

配置完成后点击页面底部的 "保存" 按钮。

五、配置 Jenkins 拉取代码(SSH Key)

为了让 Jenkins 以 jenkins 用户身份从 Git 平台(GitHub/Gitee 等)拉取代码,需要为 jenkins 用户配置 SSH Key。

  1. 切换到 jenkins 用户并生成 SSH Key:
bash 复制代码
# 切换到 jenkins 用户
sudo su - jenkins

# 生成 SSH Key(请将邮箱改为你自己的)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

一路回车即可(使用默认路径和空密码)。

  1. 查看并复制公钥内容:
bash 复制代码
cat ~/.ssh/id_rsa.pub

复制输出的整行内容。

  1. 将公钥添加到你的 Git 平台:
  • GitHub:Settings → SSH and GPG keys → New SSH key
  • Gitee:设置 → SSH 公钥
  1. 在云服务器上测试 SSH 是否配置成功:
bash 复制代码
# GitHub
ssh -T git@github.com

# 或 Gitee
ssh -T git@gitee.com

如果能看到欢迎提示就说明 SSH 通了,Jenkins 也可以通过 SSH 拉取代码。


六、项目目录结构说明

假设所有微服务统一部署在服务器的 /ruoyi 根目录下,每个微服务独占一个子目录,便于统一管理和发布。

system 模块为例:

  • 模块根目录:/ruoyi/system
  • 日志目录:/ruoyi/system/logs
  • Jar 包路径:/ruoyi/system/ruoyi-system.jar
  • 管理脚本:/ruoyi/system/manage-ruoyi-system.sh

完整目录结构示例:

text 复制代码
system
├── logs
│   ├── ruoyi-system
│   │   ├── console.log
│   │   ├── error.log
│   │   └── info.log
│   └── ruoyi-system.out
├── manage-ruoyi-system.sh
├── ruoyi-system.jar
└── ruoyi-system.pid

建议所有服务都遵守类似的目录约定,这样在 Jenkins 脚本中就可以用统一的路径规则进行部署与重启。

七、为 jenkins 用户分配项目目录权限

为避免每次构建都使用 root 权限,推荐将项目目录的所有者改为 jenkins 用户。

使用 root 用户执行:

bash 复制代码
sudo chown -R jenkins:jenkins /ruoyi
sudo chmod -R u+rwX /ruoyi

这样 Jenkins 在构建、打包、覆盖 Jar 包、写日志等操作时就不会因为权限问题失败。

八、新建 Jenkins 流水线任务

1. 创建任务

  1. 在 Jenkins 首页点击 "新建任务"
  2. 输入任务名称(例如:ruoyi-system-pipeline
  3. 选择 "流水线(Pipeline)" 类型
  4. 点击 "确定",进入任务配置页面

2. 配置任务参数与流水线脚本

进入任务配置页面后,按以下步骤配置:

  1. 任务描述

    在「描述」中简单说明该流水线的用途,例如:

    负责 ruoyi-system 模块的拉取、打包与部署。

  2. 参数化构建过程

    勾选 "参数化构建过程" ,点击 "添加参数" → 选择 "选项参数"

    例如可以配置发布环境参数:

    • 名称:PROFILE

    • 选项(每行一个):

      text 复制代码
      dev
      prod
    • 描述:选择要部署的环境(默认 dev)

    注意:第一行选项为默认值。

  3. 编写流水线脚本(Pipeline Script)

    在「流水线」一栏中填入你的 Pipeline 脚本,例如从 Git 拉取代码、使用 Maven 打包、将 Jar 部署到 /ruoyi/system 并通过脚本重启服务等(这里根据你的实际脚本自行填写)。

    arduino 复制代码
    // 声明式 Pipeline
    pipeline {
        // 使用任意可用的节点(也可以写成 agent { label 'xxx' } 指定构建机)
        agent any
    
        // 声明 Jenkins 里配置好的 JDK 和 Maven 工具
        tools {
            // 在 "全局工具配置" 中配置一个名称为 jdk17 的 JDK,指向 Java 17
            jdk   'jdk17'
            // 在 "全局工具配置" 中配置一个名称为 maven-3 的 Maven
            maven 'maven-3.6.3'
        }
    
        // 一些全局选项,可选
        options {
            // 在控制台日志中显示时间戳,方便排查问题
            timestamps()
            // 保留最近 10 次构建记录(视情况可调整)
            buildDiscarder(logRotator(numToKeepStr: '10'))
        }
    
        // 全局环境变量
        environment {
            // 应用部署目录
            APP_DIR  = '/ruoyi/system'
            // 目标 Jar 名称(部署后文件名)
            JAR_NAME = 'ruoyi-system.jar'
            // 从项目根目录到构建出的 Jar 的相对路径
            JAR_REL_PATH = 'ruoyi-modules/ruoyi-system/target/ruoyi-system.jar'
        }
    
        stages {
    
            stage('Checkout 代码') {
                steps {
                    script {
                        // 说明:
                        // 1. credentialsId 请改成你在 Jenkins 中创建的 SSH 凭据 ID(例如 codeup-ssh)
                        // 2. branch 熟悉仓库后可改成实际分支(如 master、main、dev 等)
                        git branch: '2.X',
                            url: 'git@codeup.aliyun.com:xxxxxxxx/xxxxx/xxx.git',
                            credentialsId: 'codeup-ssh'
                    }
                }
            }
    
            stage('Build 编译打包(从项目根目录)') {
                steps {
                    dir("${env.WORKSPACE}") {
                        sh '''
                            echo "===== 从项目根目录执行 Maven clean install ====="
                            export MAVEN_OPTS="-Xms512m -Xmx1024m"
                            # 1. 清理并构建整个工程
                            mvn clean package -DskipTests -Pdev
    
                            echo "===== clean package 完成,所有父 POM/模块已安装到本地 ====="
    
                            # 2. 如果你只想重新打包某个模块,也可以单独再跑一遍(可选)
                            # mvn -pl ruoyi-modules/ruoyi-system -am clean package -DskipTests
                        '''
                    }
                }
            }
    
            stage('Deploy 部署 ruoyi-system') {
                steps {
                    sh '''
                        set -e  # 任意命令失败则整个脚本失败
    
                        echo "===== 部署阶段环境自检 ====="
                        echo "当前用户:$(whoami)"
                        echo "当前目录:$(pwd)"
                        echo "Jenkins 认为的 APP_DIR=${APP_DIR}"
                        echo "WORKSPACE=${WORKSPACE}"
                        
                        # 关键:让后面启动的 Java 进程"不属于这个 Build"
                        export BUILD_ID=dontKillMe
    
                        echo "===== 检查构建产物是否存在 ====="
                        JAR_SRC="${JAR_REL_PATH}"
                        APP_DIR="${APP_DIR}"
                        JAR_NAME="${JAR_NAME}"
                        JAR_DEST="${APP_DIR}/${JAR_NAME}"
    
                        echo "JAR_SRC=${JAR_SRC}"
                        echo "JAR_DEST=${JAR_DEST}"
    
                        if [ ! -f "$JAR_SRC" ]; then
                        echo "ERROR: 构建产物不存在:$JAR_SRC"
                        exit 1
                        fi
    
                        echo "构建产物存在:$JAR_SRC"
    
                        echo "===== 创建 / 确认部署目录:$APP_DIR ====="
                        mkdir -p "$APP_DIR"
    
                        echo "===== 拷贝 Jar 到部署目录 ====="
                        cp "$JAR_SRC" "$JAR_DEST"
                        ls -l "$JAR_DEST"
    
                        echo "===== 切换到 APP_DIR 并执行重启脚本 ====="
                        cd "$APP_DIR"
                        echo "现在目录:$(pwd)"
                        ls -l
    
                        echo "调用 manage-ruoyi-system.sh restart ..."
                        /ruoyi/system/manage-ruoyi-system.sh restart || {
                        echo "manage-ruoyi-system.sh restart 退出码 $?"
                        echo "最近 50 行业务日志:"
                        tail -n 50 logs/ruoyi-system.out || echo "日志文件不存在"
                        exit 1
                        }
    
                        echo "===== restart 调用结束,立即查看 status 和进程 ====="
                        /ruoyi/system/manage-ruoyi-system.sh status || true
    
                        if [ -f ruoyi-system.pid ]; then
                        echo "PID 文件内容:$(cat ruoyi-system.pid)"
                        ps -p "$(cat ruoyi-system.pid)" -o pid,user,cmd || echo "ps 查不到这个 PID"
                        else
                        echo "PID 文件不存在"
                        fi
    
                        echo "===== 部署阶段结束 ====="
                    '''
                }
            }
    
        }
    
        // 构建后的一些收尾操作(可选)
        post {
            success {
                echo '构建 & 部署成功 🎉'
            }
            failure {
                echo '构建或部署失败,请查看控制台日志排查问题。'
            }
            always {
                // 这里可以做一些通用收尾,如归档日志等
                echo 'Pipeline 结束。'
            }
        }
    }
  4. 配置完成后,点击页面底部的 "保存" 按钮。

九、构建项目(参数化构建)

完成任务配置后就可以开始构建项目了:

  1. 在 Jenkins 首页的任务列表中点击对应任务名称,进入任务详情页面。
  2. 点击左侧的 "Build with Parameters(带参数构建)"
  3. 在参数页面选择对应的参数(例如环境 dev/prod),然后点击 "Build" 按钮发起一次构建。

构建成功后,你就拥有了一条可反复使用的自动化构建流水线,可以根据参数灵活切换不同环境,非常适合多模块、多环境的微服务项目。

到这里,一套从 云服务器准备 → 安装 Jenkins → 配置工具和 SSH → 规范项目目录 → 创建流水线 → 参数化构建 的完整流程就打通了,你可以在此基础上继续扩展更多自动化步骤。

相关推荐
weixin_307779133 小时前
Jenkins Gson API插件:统一JSON处理的基础库
java·运维·开发语言·架构·jenkins
weixin_307779134 小时前
深度解析 Jenkins Git Client 6.4.0 插件:核心功能、应用场景与最佳实践
运维·git·架构·jenkins
weixin_307779136 小时前
Jenkins GitHub插件1.45.0:深度集成与实践指南
运维·云原生·云计算·jenkins
一念一花一世界1 天前
CI/CD工具选型:GitLab CI与Arbess全面对比指南
ci/cd·gitlab·jenkins·cicd·arbess
一念一花一世界1 天前
CI/CD工具选型:Jenkins与Arbess全面对比指南
运维·ci/cd·jenkins·arbess
jiayong231 天前
Elasticsearch 核心概念详解:Index、Document、Field
大数据·elasticsearch·jenkins
古城小栈1 天前
Jenkins 自动构建 搞起来
java·servlet·jenkins
axihaihai1 天前
jenkins下微服务的cicd流程
运维·微服务·jenkins
成为你的宁宁1 天前
【Jenkins+GitLab 自动化构建部署实战教程:环境介绍、服务部署、密钥配置、项目推送与自动编译打包全流程详解】
自动化·gitlab·jenkins