jekins 完整部署详细流程(集成 SVN 源码管理 + Maven 打包 + Jar 程序自动部署)

  1. 环境准备
    1. 硬件与系统要求

表1  硬件与系统要求

项目

最低配置

推荐配置

CPU

2 核

4 核及以上

内存

2 GB

4 GB 及以上(Maven 打包吃内存)

磁盘

20 GB

50 GB 及以上(工作区 + 构建产物)

系统

CentOS 7+ / Ubuntu 18+

CentOS 7.9 / Ubuntu 22.04

    1. 安装 JDK

Jenkins 自身运行需要 JDK 11 或 17(2024 年后的 LTS 版本要求 Java 17);而业务项目(如 qlcrm)可能使用 JDK 8。两者不冲突——Jenkins 全局工具里可以配置多个 JDK,构建任务时单独指定。先装一个 JDK 17 给 Jenkins 用:

# CentOS

sudo yum install -y java-17-openjdk java-17-openjdk-devel

 

# Ubuntu

sudo apt install -y openjdk-17-jdk

 

# 验证

java -version

# 应输出 openjdk version "17.x.x"

 

# 如服务器已有 JDK 8 且默认是 8,用 alternatives 切换

sudo alternatives --config java

# 选择 JDK 17 对应的编号

业务项目的 JDK 8 后面在 Jenkins「全局工具配置」里单独添加,不影响 Jenkins 自身运行。

    1. 开放端口

# CentOS 7/8(firewalld)

sudo firewall-cmd --permanent --add-port=8080/tcp

sudo firewall-cmd --reload

 

# 云服务器还需在安全组放行 8080

  1. 安装 Jenkins
    1. yum 仓库安装(推荐)

使用 yum 仓库安装的好处是可以通过 systemctl 管理启停和开机自启,升级也方便。

# 1. 添加 Jenkins 官方 yum 仓库

sudo wget -O /etc/yum.repos.d/jenkins.repo \

  https://pkg.jenkins.io/redhat-stable/jenkins.repo

 

# 2. 导入 GPG 密钥

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

 

# 3. 安装

sudo yum install -y jenkins

 

# 启动并设置开机自启

sudo systemctl start jenkins

sudo systemctl enable jenkins

sudo systemctl status jenkins

Ubuntu 用户使用以下命令:

curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key \

  | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null

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

sudo apt update && sudo apt install -y jenkins

    1. war 包直接运行

适合无 root 权限或需要多实例的场景。

cd /usr/local

sudo wget https://get.jenkins.io/war-stable/latest/jenkins.war

# 后台运行(用 SSH 终端,不要在 WinSCP 执行命令框里跑)

nohup java -jar jenkins.war --httpPort=8080 > jenkins.log 2>&1 &

    1. 启动与初始化解锁

默认端口为 8080。如需修改端口、查看初始密码:

sudo vi /etc/sysconfig/jenkins

# 找到 JENKINS_PORT="8080" 改为目标端口

sudo systemctl restart jenkins

 

# 查看初始管理员密码

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

浏览器访问 http://服务器IP:8080,首次进入提示输入管理员密码,粘贴上面命令输出的 32 位字符串。然后选择「安装推荐的插件」,等待完成,创建第一个管理员账号。

    1. 插件下载慢换国内镜像

进入 Manage Jenkins → Plugins → Advanced settings,底部 Update Site 改为:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json

提交后点「立即获取」。

  1. 安装所需插件

进入 Manage Jenkins → Plugins → Available plugins,搜索并安装以下插件(勾选后点 Install without restart):

表2  所需插件清单

插件名称

用途

Subversion Plug-in

SVN 源码拉取(自带 SVNKit,无需服务器装 svn 命令)

Maven Integration plugin

自由风格项目中调用 Maven

Pipeline Maven Integration Plugin

流水线(Pipeline)中调用 Maven

Publish Over SSH

打包后通过 SSH 把 jar 传到远程服务器并执行脚本

Credentials Binding

凭证管理(SVN 账号、SSH 密钥)

SSH plugin

远程执行命令(可选,Publish Over SSH 已够用)

安装完成后点 Restart Jenkins when installation is complete。

  1. 安装与配置 Maven
    1. 服务器安装 Maven

cd /usr/local

sudo wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz

sudo tar -zxf apache-maven-3.9.9-bin.tar.gz

sudo ln -s apache-maven-3.9.9 maven

 

# 配置环境变量

sudo vi /etc/profile

# 末尾追加:

export MAVEN_HOME=/usr/local/maven

export PATH=$MAVEN_HOME/bin:$PATH

 

# 生效并验证

source /etc/profile

mvn -version

# 应输出 Apache Maven 3.9.9

    1. 配置阿里云镜像与本地仓库

sudo vi /usr/local/maven/conf/settings.xml

 

# 在 <mirrors> 节点内加入阿里云镜像:

<mirror>

    <id>aliyunmaven</id>

    <mirrorOf>central</mirrorOf>

    <name>阿里云公共仓库</name>

    <url>https://maven.aliyun.com/repository/public</url>

</mirror>

 

# 指定本地仓库目录(可选):

<localRepository>/usr/local/maven/repo</localRepository>

    1. Jenkins 全局工具配置

进入 Manage Jenkins → Tools:

  • JDK 配置(点 JDK 安装):名称 JDK17,取消「自动安装」,JAVA_HOME 填 /usr/lib/jvm/java-17-openjdk;再添加一个名称 JDK8,JAVA_HOME 填业务项目用的 JDK 8 路径(如 /usr/local/java/jdk1.8.0_xxx)。
  • Maven 配置(点 Maven 安装):名称 Maven3.9,取消「自动安装」,MAVEN_HOME 填 /usr/local/maven。

保存。

  1. 配置 SVN 凭证

进入 Manage Jenkins → Credentials → System → Global credentials → Add credentials:

  • Kind:Username with password
  • Username:SVN 账号
  • Password:SVN 密码
  • ID:svn-cred(自定义,后面 Pipeline 会引用)
  • Description:SVN 凭证

保存。

  1. 创建构建任务(自由风格项目)
    1. 新建任务

首页点「新建任务」→ 输入名称(如 qlcrm-build)→ 选择「构建一个自由风格的软件项目」→ 确定。

    1. 源码管理(SVN)
  • 勾选 Subversion
  • Repository URL:填 SVN 地址,例如 svn://192.168.1.100/repo/qlcrm/trunk 或 http://svn.example.com/qlcrm/trunk
  • Credentials:下拉选刚才创建的 svn-cred
  • Local module directory:留空(默认工作区根目录)
  • Repository depth:Infinity(全量拉取)
    1. 构建触发器
  • 轮询 SCM:勾选,日程表填 H/5 * * * *(每 5 分钟检查 SVN 是否有更新,有就构建)
  • 定时构建:H 2 * * *(每天凌晨 2 点构建)
  • 也可以不勾,手动点「立即构建」
    1. 构建环境

勾选 Delete workspace before build starts(每次构建前清理工作区,避免旧文件干扰)。

    1. Maven 打包

「增加构建步骤」→ 选择 Invoke top-level Maven targets:

  • Maven Version:选 Maven3.9
  • Goals:clean package -DskipTests
  • POM:留空(默认根目录 pom.xml)
  • 高级 → JDK:选 JDK8(如果项目是 JDK 8 编译)

如果项目有多个模块,只打某个子模块:Goals 填 clean package -pl 子模块名 -am -DskipTests。

    1. 构建后部署——同机部署

适用于 Jenkins 与应用程序在同一台服务器的场景。「增加构建后操作步骤」→ 选择 Execute shell:

#!/bin/bash

# 变量

APP_NAME=qlcrm.jar

APP_HOME=/usr/local/java/qlcrm

WORKSPACE=/var/lib/jenkins/workspace/qlcrm-build

 

# 1. 停旧进程

PID=$(pgrep -f $APP_NAME)

if [ -n "$PID" ]; then

    echo "停止旧进程 PID=$PID"

    kill -9 $PID

    sleep 2

fi

 

# 2. 复制新 jar

cp -f $WORKSPACE/target/$APP_NAME $APP_HOME/

 

# 3. 启动(关键:加 BUILD_ID=dontKillMe 防止 Jenkins 任务结束时杀掉进程)

cd $APP_HOME

BUILD_ID=dontKillMe nohup java -jar $APP_NAME > nohup.out 2>&1 &

echo "启动成功,新 PID=$!"

 

# 4. 等 3 秒验证进程

sleep 3

pgrep -f $APP_NAME && echo "进程存活" || echo "进程未启动,请查看 nohup.out"

关键说明:BUILD_ID=dontKillMe 是必须加的。Jenkins 默认会在构建结束时杀掉该任务衍生的所有进程,不加这个参数,jar 启动后会被立刻杀掉。

    1. 构建后部署——远程部署

适用于 Jenkins 与应用程序不在同一台服务器的场景,使用 Publish Over SSH 插件。

先配置 SSH 服务器:Manage Jenkins → System → Publish Over SSH:

  • Passphrase:留空(用密码认证就填 SSH 密码,用密钥就留空)
  • Path to key:密钥文件路径(或直接把私钥粘到 Key 文本框)
  • 点「增加」:Name 填 prod-server;Hostname 填应用服务器 IP;Username 填登录用户(如 root);Remote Directory 填 /usr/local/java/qlcrm
  • 点 Test Configuration 验证连接成功,保存。

回到任务配置,「增加构建后操作步骤」→ 选择 Send build artifacts over SSH:

  • SSH Server Name:prod-server
  • Source files:target/*.jar
  • Remove prefix:target(去掉 target 目录层级,直接传到 Remote Directory)
  • Remote directory:留空(用全局配置的 /usr/local/java/qlcrm)
  • Exec command:bash /usr/local/java/qlcrm/restart.sh

在应用服务器上创建 /usr/local/java/qlcrm/restart.sh(内容见第 8 章),并赋权 chmod +x。

  1. Pipeline 流水线方式(推荐)

如果希望构建脚本随代码一起管理,使用 Pipeline。新建任务选「流水线」,Pipeline 脚本直接填以下内容:

pipeline {

    agent any

 

    tools {

        maven 'Maven3.9'

        jdk 'JDK8'   // 业务项目用 JDK8

    }

 

    environment {

        APP_NAME = 'qlcrm.jar'

        DEPLOY_DIR = '/usr/local/java/qlcrm'

    }

 

    stages {

        stage('拉取代码') {

            steps {

                checkout([

                    $class: 'SubversionSCM',

                    locations: [[

                        remote: 'svn://192.168.1.100/repo/qlcrm/trunk',

                        credentialsId: 'svn-cred'

                    ]]

                ])

            }

        }

 

        stage('Maven 打包') {

            steps {

                sh 'mvn clean package -DskipTests'

            }

            post {

                success {

                    archiveArtifacts artifacts: 'target/*.jar', fingerprint: true

                }

            }

        }

 

        stage('部署到服务器') {

            steps {

                sshPublisher(publishers: [

                    sshPublisherDesc(

                        configName: 'prod-server',

                        transfers: [

                            sshTransfer(

                                sourceFiles: 'target/*.jar',

                                removePrefix: 'target',

                                remoteDirectory: '',

                                execCommand: 'bash /usr/local/java/qlcrm/restart.sh'

                            )

                        ],

                        verbose: true

                    )

                ])

            }

        }

    }

 

    post {

        success { echo '构建部署成功' }

        failure { echo '构建部署失败,请查看控制台日志' }

    }

}

说明:Pipeline 中防止进程被杀的环境变量是 JENKINS_NODE_COOKIE=dontKillMe;但远程 restart.sh 里用 nohup 即可,因为是远程 SSH 执行,不受 Jenkins 进程树管理。

也可以把上面的脚本保存为 Jenkinsfile 放到 SVN 项目根目录,然后任务配置里选「Pipeline script from SCM」→ SCM 选 Subversion → 填 SVN 地址和凭证 → Script Path 填 Jenkinsfile。这样构建脚本随代码版本管理。

  1. 完整部署脚本(应用服务器端)

在 /usr/local/java/qlcrm/ 下创建三个脚本,分别负责启动、停止、重启。

    1. start.sh

#!/bin/bash

APP_NAME=qlcrm.jar

APP_HOME=$(cd "$(dirname "$0")"; pwd)

LOG_FILE=$APP_HOME/nohup.out

 

cd $APP_HOME

PID=$(pgrep -f $APP_NAME)

if [ -n "$PID" ]; then

    echo "程序已在运行,PID=$PID"

    exit 1

fi

nohup java -jar $APP_NAME > $LOG_FILE 2>&1 &

echo "启动成功,PID=$!"

    1. stop.sh

#!/bin/bash

APP_NAME=qlcrm.jar

PID=$(pgrep -f $APP_NAME)

if [ -z "$PID" ]; then

    echo "程序未运行"

    exit 0

fi

echo "停止进程 PID=$PID"

kill $PID

sleep 3

PID=$(pgrep -f $APP_NAME)

if [ -n "$PID" ]; then

    echo "强制 kill"

    kill -9 $PID

fi

echo "已停止"

    1. restart.sh

#!/bin/bash

APP_HOME=$(cd "$(dirname "$0")"; pwd)

bash $APP_HOME/stop.sh

sleep 1

bash $APP_HOME/start.sh

赋权:chmod +x /usr/local/java/qlcrm/*.sh

  1. 常见问题排查

表3  常见问题与解决方案

问题

原因与解决

Jenkins 启动后访问 8080 拒绝连接

防火墙/安全组未放行,或 JDK 版本不对(需 11/17)。用 systemctl status jenkins 看日志

插件安装一直转圈/失败

换清华镜像(见第 2.4 节),或检查服务器能否访问外网

SVN 连接报错 unable to connect

检查 URL、凭证、网络连通性(telnet SVN_IP 3690);SVN 地址不要带空格

SVN 认证失败

凭证用户名密码错误,或账号无该目录权限;在 Credentials 里重新配置

Maven 打包慢/卡死

settings.xml 未配阿里云镜像;或首次下载依赖量大,耐心等待

Maven 报错无效的标记

JDK 版本不匹配,项目用 Java 8 语法但 Jenkins 用了 17 编译,在构建步骤里指定 JDK8

jar 启动后 Jenkins 任务结束进程就没了

同机部署必须加 BUILD_ID=dontKillMe(自由风格)或 JENKINS_NODE_COOKIE=dontKillMe(Pipeline);远程 SSH 部署不受此限

Publish Over SSH 连接失败

目标服务器 SSH 服务未启、端口非 22(在高级里改 Port)、密码/密钥错误、目标服务器 .ssh 权限不对

jar 上传了但没启动

Exec command 路径写错,或 restart.sh 无执行权限(chmod +x),或脚本里 java 不在 PATH(用绝对路径)

Jenkins 用户无权限写部署目录

sudo chown -R jenkins:jenkins /usr/local/java/qlcrm,或在 sudoers 里给 jenkins 免密权限

控制台输出中文乱码

Manage Jenkins → System → 全局属性 → 环境变量 添加 LANG=zh_CN.UTF-8;服务器 locale 检查

构建后磁盘满

任务配置 → 构建后操作 → Discard old builds,设置保留最近 10 次构建

WinSCP 执行命令框跑 nohup 报语法错误

WinSCP 会在命令后自动拼接 ; echo,导致 & ; 连续。改用 SSH 终端,或命令末尾加 disown / sleep 1

SVN 提交后 Jenkins 没自动构建

轮询 SCM 日程表写错,或 SVN 服务器时间与 Jenkins 不同步;可改用 SVN post-commit hook 主动触发

  1. 验证流程

完成配置后,按以下步骤验证整条 CI/CD 链路:

  • 提交代码到 SVN(或直接在 Jenkins 任务点「立即构建」)
  • 查看「控制台输出」,确认:SVN 拉取成功 → Maven BUILD SUCCESS → jar 上传 → restart.sh 输出「进程存活」
  • 浏览器访问应用接口,验证服务正常响应
  • 服务器执行 tail -f /usr/local/java/qlcrm/nohup.out 查看启动日志,确认无异常
  • 确认 ps -ef | grep qlcrm 进程存在,且端口正常监听
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值