You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Jenkinsfile实现服务器应用自动化部署及版本留存?

使用Jenkinsfile实现Java应用自动化部署(基于PM2)

核心需求梳理

  • 停止运行中的PM2服务
  • 从GitHub仓库拉取最新jar包替换现有文件
  • 重启PM2服务
  • 留存每次部署的版本信息(如jar包版本、部署时间、Git提交哈希等)

前提准备

  • Jenkins节点已配置PM2环境,可正常执行pm2命令
  • Jenkins节点已配置Git环境,有权限拉取目标GitHub仓库
  • Jenkins具备目标部署目录的读写权限
  • PM2中已完成目标服务的注册(对应APP_NAME)

Jenkinsfile示例及说明

pipeline {
    agent any
    environment {
        // 按需修改以下配置项
        APP_NAME = "your-app-name"
        DEPLOY_DIR = "/path/to/your/deployment/directory"
        GITHUB_REPO_URL = "git@github.com:your-username/your-repo.git"
        JAR_SOURCE_PATH = "dist/application_snapshot-*.jar" // 仓库中jar包的路径
        VERSION_RECORD_FILE = "${DEPLOY_DIR}/deploy_history.log" // 版本记录文件路径
    }
    stages {
        stage('拉取GitHub仓库代码') {
            steps {
                git url: "${GITHUB_REPO_URL}", branch: "main" // 替换为实际分支名
            }
        }

        stage('停止PM2服务') {
            steps {
                script {
                    // 即使服务未运行也不中断流程
                    sh """
                        cd ${DEPLOY_DIR}
                        pm2 stop ${APP_NAME} || true
                    """
                }
            }
        }

        stage('替换Jar包并记录版本') {
            steps {
                script {
                    // 查找仓库中的jar包
                    def jarFiles = findFiles(glob: "${JAR_SOURCE_PATH}")
                    if (jarFiles.size() == 0) {
                        error("未找到符合规则的Jar包,请检查仓库路径")
                    }
                    def latestJar = jarFiles[0].name
                    // 复制替换部署目录的jar包
                    sh """
                        cp ${latestJar} ${DEPLOY_DIR}/application_snapshot-001.jar
                    """
                    // 提取版本信息并写入记录文件
                    def jarVersion = latestJar.replaceAll(/application_snapshot-(.*)\.jar/, '$1')
                    def deployTime = new Date().format("yyyy-MM-dd HH:mm:ss")
                    def gitCommit = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
                    sh """
                        echo "======================================" >> ${VERSION_RECORD_FILE}
                        echo "部署时间: ${deployTime}" >> ${VERSION_RECORD_FILE}
                        echo "Jar包版本: ${jarVersion}" >> ${VERSION_RECORD_FILE}
                        echo "Git提交哈希: ${gitCommit}" >> ${VERSION_RECORD_FILE}
                        echo "======================================" >> ${VERSION_RECORD_FILE}
                    """
                }
            }
        }

        stage('重启PM2服务') {
            steps {
                script {
                    sh """
                        cd ${DEPLOY_DIR}
                        pm2 start start-switch.json
                    """
                }
            }
        }

        stage('验证服务状态') {
            steps {
                script {
                    def status = sh(script: "pm2 status ${APP_NAME} | grep -q 'online' && echo 'success' || echo 'failed'", returnStdout: true).trim()
                    if (status != 'success') {
                        error("服务启动失败,请查看PM2日志排查")
                    }
                    echo "服务已成功启动并处于运行状态"
                }
            }
        }
    }
    post {
        always {
            cleanWs() // 清理Jenkins工作区临时文件
        }
        failure {
            echo "部署失败,请检查日志定位问题"
        }
        success {
            echo "部署完成,版本记录已写入${VERSION_RECORD_FILE}"
        }
    }
}

关键细节说明

  1. 环境变量集中管理:所有可变配置放在environment块,后续修改只需调整这里,无需改动流程代码
  2. 容错处理:停止服务时加|| true,避免服务未运行导致流程中断;替换Jar包前先校验文件存在性,提前终止异常流程
  3. 版本信息留存:通过Jar包名称提取版本号,结合Git提交哈希、部署时间写入本地日志,每次部署追加新记录,便于回溯
  4. 服务状态验证:新增验证阶段,确保服务启动后处于online状态,避免出现部署成功但服务未正常运行的情况

注意事项

  • 确保Jenkins节点的SSH密钥已配置到GitHub仓库,避免拉取代码权限不足
  • 若Jar包命名规则不同,需调整JAR_SOURCE_PATH和版本提取的正则表达式
  • 可根据需求扩展流程,比如添加原有Jar包备份、部署成功后发送通知等步骤

内容的提问来源于stack exchange,提问作者bomjenkins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:20:37