Jenkins 自动化部署项目

Jenkins 自动化部署项目

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

创建多分支流水线

配置 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}

Jenkins 配置 Gitea 凭据 2026-04-17

评论区