流水线部署流程如下图:

一、git安装
1、 服务器上安装 Git
- 如果是 CentOS/RHEL 系统:
sudo yum install git -y
- 如果是 Ubuntu/Debian 系统:
sudo apt-get install git -y
2、验证 Git 安装
登录到 Jenkins 服务器,执行git --version
确认 Git 已正确安装
3、在 Jenkins 中配置 Git 凭据
- 登录 Jenkins 管理界面
- 进入 "系统管理/凭据/系统/全局凭据 (unrestricted)"
- 设置全局凭据id,增加git用户账号密码,后续流水线会使用凭证id


二、maven安装
1、服务器上安装maven
下载maven
官网下载地址**:** https://maven.apache.org/download.cgi
解压 Maven
cd /data
sudo tar xzvf apache-maven-3.9.11.tar.gz
设置环境变量
# 配置环境变量
vi /etc/profile
# 在末尾添加
export MAVEN_HOME=/data/apache-maven-3.9.11
export PATH=$PATH:$MAVEN_HOME/bin
# 使环境变量生效
source /etc/profile
验证安装是否成功
mvn -v
2、在 Jenkins 中配置 maven

配置maven路径

三、服务器间免密登录配置
因需要将部署文件上传到应用服务器及远程调用脚本,所以需要配置服务器间免密访问
1、生成SSH密钥对
首先,在本地机器上生成SSH密钥对。打开终端,运行以下命令:
ssh-keygen -t rsa -b 2048
按照提示操作,可以按回车键接受默认的文件保存位置(通常在~/.ssh/id_rsa
和~/.ssh/id_rsa.pub
),也可以为密钥设置密码(可选)。
2、复制公钥到远程服务器
使用ssh-copy-id
命令将公钥复制到远程服务器上。例如,要将公钥复制到用户名为username
的远程服务器(IP地址或主机名是remote_host
):
ssh-copy-id root@47.95.178.19
3、测试免密登录
ssh root@47.95.178.19
首次需要输入密码,后续就不再需要了。
四、流水线编写
新建任务选择流水线

因是微服务项目服务很多及阿里云外网访问受限,所以拆分两个流水线:
1、下载代码、编译、打包
2、将打包的文件上传阿里云跳板机,利用跳板机复制到应用服务器及调用应用服务器启动脚本。
流水线1
pipeline {
agent any
environment {
// 配置Git仓库地址
GIT_REPO = "http://10.11.20.38/cyjr/cloud.git"
// 配置分支
BRANCH = "test"
// 配置存储在Jenkins中的Git凭证ID(需要提前配置)
GIT_CREDENTIALS_ID = "glpat-iigmKJf2mLadomP-LXGX" // 替换为你的凭证ID
// 配置Maven打包后的文件名
ARTIFACT_NAME = "your-project.jar"
// 配置打包后的文件路径
ARTIFACT_PATH = "target/${ARTIFACT_NAME}"
// 配置服务器信息
REMOTE_HOST = "47.95.178.19" // 服务器IP
REMOTE_USER = "root" // 服务器用户名
REMOTE_DIR = "/data/TEST/TEMP" // 服务器部署目录
// 应用启动脚本名称
START_SCRIPT = "start.sh"
CODE_DIR = "/data/.jenkins/workspace/Cloud-test"
}
stages {
// 阶段1:清理旧目录 + 创建新目录
stage('清理并创建目录') {
steps {
echo "开始清理旧目录:${CODE_DIR}"
// 1. 删除旧目录(若存在,强制删除所有内容)
sh "rm -rf ${CODE_DIR} || true" // || true 避免目录不存在时脚本报错
echo "旧目录清理完成,开始创建新目录:${CODE_DIR}"
// 2. 创建新目录(-p 确保父目录不存在时也能创建)
sh "mkdir -p ${CODE_DIR}"
echo "新目录创建完成:${CODE_DIR}"
}
}
stage('拉取代码') {
steps {
echo "进入目录:${CODE_DIR},开始拉取Git代码"
// dir步骤:切换到指定目录执行后续操作(相当于cd ${CODE_DIR})
dir("${CODE_DIR}") {
// 拉取Git代码(引用凭证,避免认证失败)
git(
url: "${GIT_REPO}",
branch: "${BRANCH}",
credentialsId: "${GIT_CREDENTIALS_ID}",
)
echo "Git代码拉取完成,当前目录文件列表:"
// 查看目录内容,验证代码是否拉取成功
sh "ls -l"
}
}
}
stage('Maven打包') {
steps {
echo "进入代码目录打包:${CODE_DIR}"
dir("${CODE_DIR}") {
// 执行打包命令,增加 -e(详细错误日志)、-U(强制更新快照依赖)
sh '''
echo "Maven版本:$(mvn -v)"
echo "开始执行打包命令:mvn clean package -Dmaven.test.skip=true -Ptest -e -U"
mvn clean package -Dmaven.test.skip=true -Ptest -e -U
'''
}
}
}
}
}
流水线2
pipeline {
agent any
environment {
// 配置服务器信息
REMOTE_HOST = "47.95.178.19" // 服务器IP
REMOTE_USER = "root" // 服务器用户名
REMOTE_DIR = "/data/PROD" // 服务器部署目录
// 应用启动脚本名称
CODE_DIR = "/data/.jenkins/workspace/Cloud-prod"
JAR_NAME = "cyjr-auth"
}
stages {
stage('上传到服务器') {
steps {
echo "上传文件到远程服务器..."
dir("${CODE_DIR}") {
// 确保远程目录存在
// sh """
// ssh ${REMOTE_USER}@${REMOTE_HOST} "mkdir -p ${REMOTE_DIR}"
// """
// 上传打包好的jar文件
sh """
scp cyjr-modules/${JAR_NAME}/target/${JAR_NAME}.jar ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/TEMP/
"""
}
}
}
stage('应用拷贝及启动') {
steps {
echo "在远程服务器上启动应用..."
sh """
ssh ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && ./${JAR_NAME}.sh"
"""
}
}
}
// post {
// success {
// echo "流水线执行成功!应用已成功部署并启动"
// // 可以添加邮件通知等操作
// }
// failure {
// echo "流水线执行失败!"
// // 可以添加失败通知等操作
// }
// always {
// echo "流水线执行结束"
// }
// }
}
跳板机器脚本
#!/bin/bash
# 配置参数 - 根据实际情况修改以下变量
LOCAL_JAR_PATH="TEMP/cyjr-auth.jar" # 本地JAR文件路径
REMOTE_USER="root" # 远程服务器用户名
REMOTE_HOST="172.16.2.11" # 远程服务器地址或IP
REMOTE_JAR_DIR="/usr/local/application/cyjr-auth" # 远程服务器存放JAR的目录
REMOTE_SCRIPT="/usr/local/application/cyjr-auth/start.sh" # 远程服务器上要执行的脚本路径
SSH_PORT=22 # SSH端口,默认为22
# 检查本地JAR文件是否存在
if [ ! -f "$LOCAL_JAR_PATH" ]; then
echo "错误:本地JAR文件 $LOCAL_JAR_PATH 不存在!"
exit 1
fi
# 创建远程目录(如果不存在)
echo "正在创建远程目录(如果不存在)..."
ssh -p $SSH_PORT $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_JAR_DIR"
# 检查SSH连接是否成功
if [ $? -ne 0 ]; then
echo "错误:无法连接到远程服务器 $REMOTE_HOST"
exit 1
fi
# 拷贝JAR文件到远程服务器
echo "正在将JAR文件拷贝到远程服务器..."
scp -P $SSH_PORT $LOCAL_JAR_PATH $REMOTE_USER@$REMOTE_HOST:$REMOTE_JAR_DIR/
# 检查文件传输是否成功
if [ $? -ne 0 ]; then
echo "错误:JAR文件传输失败!"
exit 1
fi
# 远程执行指定脚本
echo "正在远程执行脚本 ssh -p $SSH_PORT $REMOTE_USER@$REMOTE_HOST $REMOTE_SCRIPT ..."
ssh -p $SSH_PORT $REMOTE_USER@$REMOTE_HOST $REMOTE_SCRIPT
echo "操作完成:JAR文件已成功拷贝并执行远程脚本"
应用启动脚本中需要指定绝对路径,不然会报错
#!/bin/sh
# 定义应用目录和jar文件的绝对路径
APP_DIR="/usr/local/application/cyjr-gateway"
JAR_FILE="${APP_DIR}/cyjr-gateway.jar"
# 检查jar文件是否存在
if [ ! -f "$JAR_FILE" ]; then
echo "错误: 找不到$JAR_FILE文件"
exit 1
fi
# 查找进程并杀死(仅当进程存在时)
PID=$(ps -ef | grep "$JAR_FILE" | grep -v grep | awk '{print $2}')
if [ -n "$PID" ]; then
kill -9 $PID
echo "已杀死进程 $PID"
sleep 1s
else
echo "服务进程未运行,无需杀死"
fi
# 进入应用目录
cd "$APP_DIR" || {
echo "错误: 无法进入目录$APP_DIR"
exit 1
}
sleep 1s
# start app
nohup java -jar -javaagent:/usr/local/application/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=cyjr-gateway -Dskywalking.collector.backend_service=172.16.2.167:11800 "$JAR_FILE" > nohup.log 2>&1 &
# view startup log
# 查看启动日志,但只持续30秒或显示100行后退出
timeout 30s tail -n 100 -f nohup.log
五、流水线执行

