一、创建多分支流水线任务
创建多分支流水线

配置 Git 分支源

在代码根目录创建 Jenkinsfile 文件
pipeline {
agent any
environment {
DOCKER_IMAGE = 'padpanel/app'
DOCKER_VERSION = "latest" // 也可以使用 BRANCH_NAME 或其他变量来动态设置版本号
// 定义镜像文件名(全局可用)
IMAGE_FILE = "${DOCKER_IMAGE.replace('/','-')}-${DOCKER_VERSION}.tar"
// 测试目标服务器
DEPLOY_DEV_HOST = '目标服务器ip'
DEPLOY_DEV_USER = 'root'
DEPLOY_DEV_SSH_CREDENTIALS_ID = 'SSH 凭据ID'
// 目标服务器部署位置 (根据实际情况修改)
DEPLOY_DEV_PATH = '项目存放位置' # 例如:/opt/padpanel
}
tools {
maven 'Maven3' // 对应上面填的 Name
}
options {
timeout(time: 30, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '10'))
disableConcurrentBuilds()
}
triggers {
// pollSCM('H/5 * * * *') // 每5分钟检查一次代码库是否有更新,自动构建
GenericTrigger(
token: 'Gitea Webhook 的token'
)
}
stages {
stage('Clone Code') {
steps {
echo '===== Clone Code ====='
checkout scm
}
}
stage('Build Backend') {
steps {
echo '===== Build Backend ====='
dir('PadPanel-Backend') {
sh 'mvn -v'
sh 'mvn clean package -DskipTests'
}
}
}
stage('Build Frontend') {
steps {
echo '===== Build Frontend ====='
dir('PadPanel-Web') {
nvm('20'){ # 自动安装node 20版本
sh 'node -v'
sh 'npm -v'
sh 'npm install'
sh 'npm run build'
}
}
}
}
stage('Build Docker Image') {
steps {
echo '===== Build Docker Image ====='
script {
// 1. 构建
sh "docker build -t ${DOCKER_IMAGE}:${DOCKER_VERSION} ."
// 2. 导出镜像(关键!)
sh "docker save -o ${IMAGE_FILE} ${DOCKER_IMAGE}:${DOCKER_VERSION}"
echo "镜像已导出:${IMAGE_FILE}"
}
}
}
stage('Deploy Production') {
when { // 只有 pro 分支才部署
anyOf {
branch 'pro'
}
}
steps {
echo '===== Deploy Production ====='
sshagent(credentials: [DEPLOY_PRO_SSH_CREDENTIALS_ID]) {
sh """
# 3. 传输镜像文件
scp -o StrictHostKeyChecking=no ${IMAGE_FILE} ${DEPLOY_PRO_USER}@${DEPLOY_PRO_HOST}:${DEPLOY_PRO_PATH}/
# 4. 远程加载+部署
ssh -o StrictHostKeyChecking=no ${DEPLOY_PRO_USER}@${DEPLOY_PRO_HOST} "
cd ${DEPLOY_PRO_PATH}
# 强制删除旧容器(解决冲突)
docker compose down -v --remove-orphans
docker rm -f padPanel || true
# 加载镜像
docker load -i ${IMAGE_FILE}
# 启动
docker compose up -d
# 清理
rm -f ${IMAGE_FILE}
docker rmi \$(docker images -f 'dangling=true' -q) 2>/dev/null || true
"
"""
}
// 本地清理
sh "rm -f ${IMAGE_FILE}"
}
}
stage('Deploy Development') {
when { // 只有 dev 分支才部署
anyOf {
branch 'dev'
}
}
steps {
echo '===== Deploy Development ====='
sshagent(credentials: [DEPLOY_DEV_SSH_CREDENTIALS_ID]) {
sh """
# 3. 传输镜像文件
scp -o StrictHostKeyChecking=no ${IMAGE_FILE} ${DEPLOY_DEV_USER}@${DEPLOY_DEV_HOST}:${DEPLOY_DEV_PATH}/
# 4. 远程加载+部署
ssh -o StrictHostKeyChecking=no ${DEPLOY_DEV_USER}@${DEPLOY_DEV_HOST} "
cd ${DEPLOY_DEV_PATH}
# 强制删除旧容器(解决冲突)
docker compose down -v --remove-orphans
docker rm -f padPanel || true
# 加载镜像
docker load -i ${IMAGE_FILE}
# 启动
docker compose up -d
# 清理
rm -f ${IMAGE_FILE}
docker rmi \$(docker images -f 'dangling=true' -q) 2>/dev/null || true
"
"""
}
// 本地清理
sh "rm -f ${IMAGE_FILE}"
}
}
}
post {
success {
echo '===== Build Success ====='
}
failure {
echo '===== Build Failed ====='
}
}
}
将代码推送到 Gitea 会自动触发项目构建与部署,Gitea -> Webhook -> Jenkins -> 构建

二、配置 Gitea Webhook
http://Jenkins访问地址/generic-webhook-trigger/invoke?token=${Jekinsfile文件中的 GenericTrigger token}
