如何通过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}" } } }
关键细节说明
- 环境变量集中管理:所有可变配置放在
environment块,后续修改只需调整这里,无需改动流程代码 - 容错处理:停止服务时加
|| true,避免服务未运行导致流程中断;替换Jar包前先校验文件存在性,提前终止异常流程 - 版本信息留存:通过Jar包名称提取版本号,结合Git提交哈希、部署时间写入本地日志,每次部署追加新记录,便于回溯
- 服务状态验证:新增验证阶段,确保服务启动后处于
online状态,避免出现部署成功但服务未正常运行的情况
注意事项
- 确保Jenkins节点的SSH密钥已配置到GitHub仓库,避免拉取代码权限不足
- 若Jar包命名规则不同,需调整
JAR_SOURCE_PATH和版本提取的正则表达式 - 可根据需求扩展流程,比如添加原有Jar包备份、部署成功后发送通知等步骤
内容的提问来源于stack exchange,提问作者bomjenkins
相关产品推荐
相关产品推荐

