200字
部署jenkins并配置流水线
2025-10-11
2025-10-11

以下是参考的文章教程

RuoYi-Vue: 🎉 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统,同时提供了 Vue3 的版本

Docker 快速安装Jenkins完美教程 (亲测采坑后详细步骤) - 付宗乐 - 博客园

保姆级教程:手把手教你用jekins和流水线

安装后的配置:

(2 封私信) Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1 - 知乎

掌握Jenkins自动化部署:从代码提交到自动上线的全流程揭秘_自动化部署工具jenkins-CSDN博客

一 部署jenkins

部署jenkins前先安装相应环境

  1. Maven环境

  2. docker环境

  3. JDK环境

1.安装Maven

  1. 下载 Maven: Maven 可以从 Apache Maven 的官方网站下载。你可以使用 wget​ 命令下载 Maven 的 tar.gz 压缩包。

    Maven下载地址

    Download Apache Maven – Maven

    wget  https://dlcdn.apache.org/maven/maven-3/3.9.10/binaries/apache-maven-3.9.10-bin.tar.gz
    
  2. 解压 Maven: 使用 tar​ 命令解压下载的 Maven 压缩包。

    tar -zxvf apache-maven-3.9.10-bin.tar.gz -C /opt/
    
  3. 设置环境变量: 打开 /etc/profile​ 文件并在文件末尾添加 Maven 的环境变量。

    echo "export M2_HOME=/opt/apache-maven-3.9.10" >> /etc/profile
    echo "export M2=$M2_HOME/bin" >> /etc/profile
    echo "export PATH=$PATH:$M2" >> /etc/profile
    

  4. 执行 source /etc/profile​​ 命令使环境变量生效。

source /etc/profile
  • 验证 Maven 安装: 使用 mvn -v​ 命令来验证 Maven 是否安装成功。

    mvn -v
    

2.检查 JDK 环境

docker环境里默认是有个jdk的 也可以使用默认的 也可以自己挂载 我这里用的默认的

  1. 检查是否已安装 JDK: CentOS 7 默认没有安装 JDK,但提供了 java​ 命令。你可以通过以下命令来检查是否安装了 JDK:

    java -version
    

    如果系统提示 java​ 命令不存在,那么你需要安装 JDK。

  2. 安装 JDK: 你可以使用 yum​ 命令安装 JDK。Oracle JDK 需要从 Oracle 官网下载,但 OpenJDK 可以通过 yum​ 安装。

    sudo yum install java-1.8.0-openjdk-devel
    

    这将安装 OpenJDK 1.8。

  3. 验证 JDK 安装: 安装完成后,再次使用 java -version​ 命令来验证 JDK 是否安装成功。

    java -version
    

2.部署jenkins

这边用的是docker部署

1.1.拉取镜像文件
docker pull jenkins/jenkins
​1.2.创建Jenkins挂载目录并授权权限(我们在服务器上先创建一个jenkins工作目录 /var/jenkins_mount,赋予相应权限,稍后我们将jenkins容器目录挂载到这个目录上,这样我们就可以很方便地对容器内的配置文件进行修改。 如果我们不这样做,那么如果需要修改容器配置文件,将会有点麻烦,因为虽然我们可以使用docker exec -it --user root 容器id /bin/bash 命令进入容器目录,但是连简单的 vi命令都不能使用)​
mkdir -p /var/jenkins_mount


chmod 777 /var/jenkins_mount

1.3创建并启动jenkins容器

此条命令只挂载了maven 然后jdk用的自带的环境

docker run -d -p 10240:8080 -p 10241:50000 -v /usr/local/webserver/jenkins_mount:/var/jenkins_home -v /opt/apache-maven-3.9.10:/usr/local/maven -v  /etc/localtime:/etc/localtime  --name myjenkins jenkins/jenkins
undefined
-d 后台运行镜像

  -p 10240:8080 将镜像的8080端口映射到服务器的10240端口。

  -p 10241:50000 将镜像的50000端口映射到服务器的10241端口

   -v /opt/apache-maven-3.9.10:/usr/local/maven     ##是用来挂载maven的

  -v /var/jenkins_mount:/var/jenkins_mount /var/jenkins_home目录为容器jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。这里我们设置的就是上面我们创建的 /var/jenkins_mount目录

  -v /etc/localtime:/etc/localtime让容器使用和服务器同样的时间设置。

  --name myjenkins 给容器起一个别名

-d 后台运行镜像 -p 10240:8080 意义: 将镜像的8080端口映射到服务器的10240端口。

-p 10241:50000 意义:将镜像的50000端口映射到服务器的10241端口

-v /var/jenkins_mount:/var/jenkins_mount 意义: /var/jenkins_home目录为容器jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。这里我们设置的就是上面我们创建的 /var/jenkins_mount目录

-v /etc/localtime:/etc/localtime 意义:让容器使用和服务器同样的时间设置。

-v opt/apache-maven-3.9.9:/usr/maven 意义:挂载本地maven,前面是服务器上的,后面是挂载到容器上的目录  

–name myjenkins 意义:给容器起一个别名​​

​1.4配置镜像加速,进入 cd /var/jenkins_mount/ 目录。​

​修改 vi hudson.model.UpdateCenter.xml里的内容​

​将 url 修改为 清华大学官方镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json​

​​

3.配置jenkins 并安装相关插件

Jenkins常用插件安装及全局配置_jenkins 插件-CSDN博客

Jenkins部署若依项目-CSDN博客

jdk配置 别名无所谓 然后路径是docker默认的

​​

maven 路径就是我们创建的时候挂载的路径

​​

安装jenkins插件

Role-based Authorization Strategy #jenkins 权限控制插件

git插件: Git Parameter

安装gitlab插件:

Gitlab Merge Request Builder和gitlab

安装插件:maven integration、Deploy to container

安装插件: Publish Over SSH

如果这里选择自动下载node的话 那需要先跑一边自由项目才会触发下载

​​

使用Jenkins + git 创建流水线 (仅供参考,还是按照实际情况来)

  1. 新建maven项目 任务名称自定义
    ​​

2.添加仓库地址​

​​

配置文件是在这里新建的 可以把项目中yml文件内容复制进来


​​​

ssh 服务器配置​

pom.xml配置文件的注释

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- 模型版本,通常为4.0.0 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 项目的组织或团体标识 -->
    <groupId>com.ruoyi</groupId>
    <!-- 项目名称 -->
    <artifactId>ruoyi</artifactId>
    <!-- 项目版本号 -->
    <version>3.8.8</version>

    <!-- 项目的显示名称 -->
    <name>ruoyi</name>
    <!-- 项目的官方网址 -->
    <url>http://www.ruoyi.vip</url>
    <!-- 项目的简要描述 -->
    <description>若依管理系统</description>

    <properties>
        <!-- 若依项目版本号属性 -->
        <ruoyi.version>3.8.8</ruoyi.version>
        <!-- 项目源代码编码 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 项目报告输出编码 -->
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <!-- 使用的Java版本 -->
        <java.version>1.8</java.version>
        <!-- maven-jar-plugin的版本 -->
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
        <!-- Spring框架版本号 -->
        <spring-framework.version>5.3.33</spring-framework.version>
        <!-- Spring Security版本号 -->
        <spring-security.version>5.7.12</spring-security.version>
        <!-- 阿里数据库连接池版本号 -->
        <druid.version>1.2.23</druid.version>
        <!-- 解析客户端信息工具版本号 -->
        <bitwalker.version>1.21</bitwalker.version>
        <!-- Swagger版本号 -->
        <swagger.version>3.0.0</swagger.version>
        <!-- 验证码版本号 -->
        <kaptcha.version>2.3.3</kaptcha.version>
        <!-- pagehelper分页插件版本号 -->
        <pagehelper.boot.version>1.4.7</pagehelper.boot.version>
        <!-- 阿里JSON解析器版本号 -->
        <fastjson.version>2.0.43</fastjson.version>
        <!-- 获取系统信息工具版本号 -->
        <oshi.version>6.6.3</oshi.version>
        <!-- io常用工具类版本号 -->
        <commons.io.version>2.13.0</commons.io.version>
        <!-- poi版本号 -->
        <poi.version>4.1.2</poi.version>
        <!-- velocity版本号 -->
        <velocity.version>2.3</velocity.version>
        <!-- jwt版本号 -->
        <jwt.version>0.9.1</jwt.version>
    </properties>

    <!-- 依赖声明管理,用于集中管理项目依赖版本 -->
    <dependencyManagement>
        <dependencies>

            <!-- Spring Framework的依赖配置,通过导入pom类型的依赖来管理Spring Framework相关依赖的版本 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>${spring-framework.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring Security的依赖配置,同理管理Spring Security相关依赖的版本 -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-bom</artifactId>
                <version>${spring-security.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring Boot的依赖配置,导入Spring Boot的依赖管理pom,以便统一管理Spring Boot相关依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.5.15</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- 阿里数据库连接池依赖 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <!-- 解析客户端操作系统、浏览器等的依赖 -->
            <dependency>
                <groupId>eu.bitwalker</groupId>
                <artifactId>UserAgentUtils</artifactId>
                <version>${bitwalker.version}</version>
            </dependency>

            <!-- pagehelper分页插件依赖 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>${pagehelper.boot.version}</version>
            </dependency>

            <!-- 获取系统信息的依赖 -->
            <dependency>
                <groupId>com.github.oshi</groupId>
                <artifactId>oshi-core</artifactId>
                <____>${oshi.version}</____>
            </dependency>

            <!-- Swagger3依赖,排除了io.swagger.swagger-models模块 -->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-boot-starter</artifactId>
                <version>${swagger.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>io.swagger</groupId>
                        <artifactId>swagger-models</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

            <!-- io常用工具类依赖 -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>.commons-io</artifactId>
                <version>${commons.io.version}</version>
            </dependency>

            <!-- excel工具依赖 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version=${poi.version}${poi.version}></version>
            </dependency>

            <!-- velocity代码生成使用模板依赖 -->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version=${velocity.version}${velocity.version}></version>
            </dependency>

            <!-- 阿里JSON解析器依赖 -->
            <dependency>
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version=${fastjson.version}${fastjson.version}></version>
            </dependency>

            <!-- Token生成与解析依赖 -->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version=${jwt.version}${jwt.version}></version>
            </dependency>

            <!-- 验证码依赖 -->
            <dependency>
                <groupId>pro.fessional</groupId>
                <artifactId>kaptcha</artifactId>
                <version=${kaptcha.version}${kaptcha.version}></version>
            </dependency>

            <!-- 定时任务依赖 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-quartz</artifactId>
                <version=${ruoyi.version}${ruoyi.version}></version>
            </dependency>

            <!-- 代码生成依赖 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-generator</artifactId>
                <version=${ruoyi.version}${ruoyi.version}></version>
            </dependency>

            <!-- 核心模块依赖 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-framework</artifactId>
                <version=${ruoyi.version}${ruoyi.init()}</version>
            </dependency>

            <!-- 系统模块依赖 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-system</artifactId>
                <version=${ruoyi.version}${ruoyi.version}></version>
            </dependency>

            <!-- 通用工具依赖 -->
            <dependency>
                <groupId>com.ruoyi</兴路=>路7. {.jpeg
                <artifactId>ruoyi-common</artifactId>
                <version=${ruoyi.version}${ruoyi.version}></version>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <modules>
        <!-- 项目模块列表,包含多个模块 -->
        <module>ruoyi-admin</module>
        <module>ruoyi-framework</module>
        <module>ruoi-system-flow

    </modules>
    <packaging>pom</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </reposals></releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

</project>

前后端在一个流水线上的配置截图

​​

前端工作流

​​

# 查看版本信息
npm -v
# 将镜像源替换为淘宝的加速访问
npm config set registry https://registry.npmmirror.com
#进入 前端 所在目录
cd ruoyi-ui/
#项目打包
npm install 
npm run build:stage
nginx配置:
[root@VM-0-11-centos target]# cat /etc/nginx/vhost/ruoyi.conf 
server
{
    listen 80;
    server_name vue.happly.asia;
    index index.html index.htm default.htm default.html;
    root /usr/local/webserver/ruoyi/ruoyi-ui/dist;
    #CERT-APPLY-CHECK--START
    # 用于SSL证书申请时的文件验证相关配置 -- 请勿删除并保持这段设置在优先级高的位置
    #include /www/server/panel/vhost/nginx/well-known/vue.xiaole.icu.conf;
    #CERT-APPLY-CHECK--END

    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #SSL-END

    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END

    #这一段是为了刷新不报错
    location / {
    root   /usr/local/webserver/ruoyi/ruoyi-ui/dist;
    try_files $uri $uri/ /index.html;
  }

    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
   # include /www/server/panel/vhost/rewrite/html_vue.xiaole.icu.conf;
    #REWRITE-END

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }


    location /stage-api/ {
        proxy_pass http://localhost:8080/;  #后端地址
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    #禁止在证书验证目录放入敏感文件
    if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
        return 403;
    }

    location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log /dev/null;
        access_log /dev/null;
    }

    location ~ .*\\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log /dev/null;
    }
    access_log  /usr/local/webserver/ruoyi/ruoyi-ui/logs/vue.happly.asia.log;
    error_log  /usr/local/webserver/ruoyi/ruoyi-ui/logs/vue.happly.asia.error.log;
}
后端运行命令:
java -jar ruoyi-admin.jar    

git变更推送命令

git clone 项目地址  是获取项目


git status 是查看变更文件


git add <变更文件名>     是添加到暂缓区应该是

git commit -m '这个是变更描述'

git push origin main  就是推送到仓库  main是主分支

最后流水线截图

前端ui流水线 node打包的

​​

​​

​​

​​

后端admin打包的 用的是java

​​

​​​

​​

记得勾选这个 不然不会替换

​​

deploy.sh 脚本文件是启动

jps -v 可以直接看java进程 号

#!/bin/bash

# 定义应用名称和路径
APP_NAME="ruoyi-admin.jar"
APP_PATH="/usr/local/webserver/ruoyi/ruoyi-admin/target/${APP_NAME}"

# 定义脚本日志文件路径(脚本执行日志)
SCRIPT_LOG_FILE="/usr/local/webserver/ruoyi/ruoyi-deploy-script.log"

# 定义应用日志文件路径(Java 应用日志)
APP_LOG_FILE="/usr/local/webserver/ruoyi/ruoyi-admin-app.log"

# 检查 JAR 文件是否存在
if [ ! -f "${APP_PATH}" ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:JAR 文件不存在 - ${APP_PATH}" | tee -a "${SCRIPT_LOG_FILE}"
    exit 1
fi

# 查找应用进程 ID(避免匹配自身脚本)
get_pid() {
    # 过滤掉 grep 命令本身和脚本进程,确保只匹配 JAR 进程
    ps -ef | grep "${APP_PATH}" | grep -v grep | grep -v "$0" | awk '{print $2}'
}

# 终止进程函数
stop_process() {
    PID=$(get_pid)
    if [ -n "${PID}" ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 发现正在运行的进程,PID: ${PID},正在终止..." | tee -a "${SCRIPT_LOG_FILE}"
        kill -15 "${PID}"  # 优雅终止(SIGTERM)
        # 等待 3 秒,若仍未终止则强制杀死
        sleep 3
        if ps -p "${PID}" > /dev/null; then
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] 进程未正常终止,强制杀死..." | tee -a "${SCRIPT_LOG_FILE}"
            kill -9 "${PID}"
        fi
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 进程已终止" | tee -a "${SCRIPT_LOG_FILE}"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 未发现运行中的进程" | tee -a "${SCRIPT_LOG_FILE}"
    fi
}

# 启动进程函数
start_process() {
    # 检查是否已启动(双重保险)
    PID=$(get_pid)
    if [ -z "${PID}" ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 启动应用:${APP_PATH}" | tee -a "${SCRIPT_LOG_FILE}"
        # 后台启动并将应用日志输出到指定文件
        nohup java -jar "${APP_PATH}" > "${APP_LOG_FILE}" 2>&1 &
        # 等待 2 秒检查启动状态
        sleep 2
        # 验证启动结果
        PID=$(get_pid)
        if [ -n "${PID}" ]; then
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] 应用启动成功,PID: ${PID}" | tee -a "${SCRIPT_LOG_FILE}"
        else
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] 启动失败,请查看日志:${APP_LOG_FILE}" | tee -a "${SCRIPT_LOG_FILE}"
            exit 1
        fi
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 应用已在运行,PID: ${PID},无需重复启动" | tee -a "${SCRIPT_LOG_FILE}"
    fi
}

# 主流程:先停止再启动
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ===== 开始部署 ${APP_NAME} =====" | tee -a "${SCRIPT_LOG_FILE}"
stop_process
start_process
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ===== 部署完成 =====" | tee -a "${SCRIPT_LOG_FILE}"

评论