企业 Jenkins 流水线:将 WAR 部署到 DEV、QA、UAT 和 PROD,带审批门、回滚和 SCP

发布: (2026年2月17日 GMT+8 15:18)
8 分钟阅读
原文: Dev.to

Source: Dev.to

Srinivasaraju Tangella

介绍

在现代企业环境中,手动将应用程序部署到多个环境(DEV、QA、UAT、PROD)风险大、容易出错且效率低下。

组织需求

  • 自动化部署
  • 环境特定的目标定位
  • 生产环境的审批门槛
  • 备份和回滚能力
  • 安全文件传输
  • 高可靠性和可审计性

在本文中,我们将构建一个面向生产的 Jenkins 流水线,使用以下技术将 WAR 文件部署到多个环境:

  • 参数化流水线
  • SCP 部署
  • SSH 安全认证
  • 审批门槛
  • 自动备份
  • 回滚支持
  • Tomcat 重启
  • 部署验证

该架构已在真实企业环境中使用。

企业部署架构

Developer

Git Repository

Jenkins Pipeline

Build WAR File

Select Environment (DEV/QA/UAT/PROD)

Approval Gate (PROD only)

Backup Existing WAR

Deploy WAR using SCP

Restart Tomcat

Health Check Verification

Application Live

前置条件

在实现此流水线之前,请确保以下内容已就绪:

1. 已安装 Jenkins

必需插件

  • Pipeline Plugin
  • SSH Agent Plugin
  • Credentials Plugin

2. 在 Jenkins 中添加 SSH 凭据

路径:Manage Jenkins → Credentials → Global → Add Credentials

  • Kind(类型): SSH Username with private key
  • ID(标识): tomcat-key
  • Username(用户名): ec2-user
  • Private key(私钥): 粘贴 PEM 文件

3. 目标服务器已安装 Tomcat

典型的部署路径:

/opt/tomcat/webapps/

⚙️ 完整企业 Jenkins 流水线

pipeline {
    agent any

    tools {
        maven 'Maven-3.9'
    }

    parameters {
        choice(
            name: 'ENV',
            choices: ['DEV', 'QA', 'UAT', 'PROD'],
            description: 'Select Deployment Environment'
        )
        booleanParam(
            name: 'ROLLBACK',
            defaultValue: false,
            description: 'Rollback deployment'
        )
    }

    environment {
        DEV_SERVER  = "10.0.0.10"
        QA_SERVER   = "10.0.0.20"
        UAT_SERVER  = "10.0.0.30"
        PROD_SERVER = "10.0.0.40"

        USER        = "ec2-user"
        DEPLOY_PATH = "/opt/tomcat/webapps/"
        BACKUP_PATH = "/opt/tomcat/backup/"

        WAR_FILE    = "target/myapp.war"
    }

    stages {
        stage('Checkout') {
            steps {
                git 'https://GitHub.com/sresrinivas/EBusibess.git'
            }
        }

        stage('Build WAR') {
            when { expression { params.ROLLBACK == false } }
            steps {
                sh 'mvn clean package'
            }
        }

        stage('Select Server') {
            steps {
                script {
                    if (params.ENV == "DEV")  env.SERVER = env.DEV_SERVER
                    if (params.ENV == "QA")   env.SERVER = env.QA_SERVER
                    if (params.ENV == "UAT")  env.SERVER = env.UAT_SERVER
                    if (params.ENV == "PROD") env.SERVER = env.PROD_SERVER
                }
            }
        }

        stage('Approval for PROD') {
            when { expression { params.ENV == 'PROD' } }
            steps {
                input message: "Approve deployment to PROD?", ok: "Deploy"
            }
        }

        stage('Backup WAR') {
            steps {
                sshagent(['tomcat-key']) {
                    sh """
                    ssh -o StrictHostKeyChecking=no ${USER}@${SERVER} '
                        mkdir -p ${BACKUP_PATH}
                        cp ${DEPLOY_PATH}/myapp.war ${BACKUP_PATH}/myapp-${BUILD_NUMBER}.war || true
                    '
                    """
                }
            }
        }

        stage('Deploy WAR') {
            when { expression { params.ROLLBACK == false } }
            steps {
                sshagent(['tomcat-key']) {
                    sh """
                    scp -o StrictHostKeyChecking=no \
                        ${WAR_FILE} \
                        ${USER}@${SERVER}:${DEPLOY_PATH}
                    """
                }
            }
        }

        stage('Rollback WAR') {
            when { expression { params.ROLLBACK == true } }
            steps {
                sshagent(['tomcat-key']) {
                    sh """
                    ssh -o StrictHostKeyChecking=no ${USER}@${SERVER} '
                        cp ${BACKUP_PATH}/myapp-${BUILD_NUMBER}.war ${DEPLOY_PATH}/myapp.war
                    '
                    """
                }
            }
        }

        stage('Restart Tomcat') {
            steps {
                sshagent(['tomcat-key']) {
                    sh """
                    ssh -o StrictHostKeyChecking=no ${USER}@${SERVER} '
                        systemctl restart tomcat
                    '
                    """
                }
            }
        }

        stage('Health Check') {
            steps {
                sh """
                curl -I http://${SERVER}:8080/myapp || true
                """
            }
        }
    }
}

回滚机制

如果部署失败,只需使用 ROLLBACK = true 重新运行流水线。流水线将自动恢复之前的 WAR 文件。

生产安全机制

  • 手动批准生产部署
  • 部署前备份
  • 安全的 SSH 认证(通过 Jenkins 凭据)
  • 重启后进行健康检查验证

关键企业功能

- Parameterized environment selection
- Secure SSH/SCP transfers
- Automated backup & rollback
- Manual approval gate for production
- Tomcat service management
- Post‑deployment health verification

Jenkins 企业部署流水线

功能

多环境部署
流水线支持使用单个 Jenkins 任务无缝部署到 DEV、QA、UAT 和 PROD。工程师可以在运行时动态选择目标环境。

使用 SCP 和 SSH 的安全部署
WAR 文件通过 SCP 并使用 SSH‑key 认证安全传输,确保 Jenkins 与目标服务器之间的通信加密。

生产审批门
在任何生产部署之前都需要手动审批,防止意外发布并强制受控上线。

部署前自动备份
流水线会自动备份当前已部署的 WAR 文件,确保始终有稳定版本可用于恢复。

即时回滚能力
如果部署失败或出现问题,流水线可以立即从备份恢复之前的版本,最大限度降低停机时间和风险。

全自动部署工作流
从构建 → 部署 → 服务重启 → 验证,整个过程全程自动化,减少人工干预和人为错误。

安全凭证管理
所有 SSH 密钥和凭证均安全存储在 Jenkins Credentials Manager 中,提供企业级安全性。

部署验证与健康检查
部署完成后,自动健康检查会验证应用可用性,确认发布成功。


实际企业收益

消除手动部署风险
自动化消除了手动部署中固有的错误、不一致和延迟。

提升部署速度与效率
原本手动需要 30–60 分钟的工作,现在几分钟即可完成。

确保生产安全与稳定
审批门、备份和回滚机制保障生产环境安全。

加快发布周期
团队可以快速交付功能、修复和更新,支持敏捷和 DevOps 实践。

提供完整可追溯性与审计性
每一次部署都记录在 Jenkins 中,为合规提供完整追踪。

降低停机时间并提升可靠性
自动回滚和健康检查保持应用高可用。

提升 DevOps 自动化成熟度
该流水线体现了银行、金融科技、医疗和大规模云环境中使用的企业级实践。

支持可扩展和面向未来的架构
易于扩展至 Kubernetes、云部署、蓝绿策略和 GitOps 工作流。


未来改进方向

您可以进一步增强流水线:

  • 蓝绿部署
  • 金丝雀部署
  • Kubernetes 部署
  • 健康检查失败自动回滚
  • Slack(或其他)通知
  • GitOps 集成

结论

此 Jenkins 流水线提供了一套完整的企业级部署解决方案,具备:

  • 多环境部署
  • 安全的 SCP 传输
  • 生产审批门
  • 自动备份与即时回滚
  • 全自动工作流

它代表了全球 DevOps 团队在实际生产环境中采用的部署模式。

0 浏览
Back to Blog

相关文章

阅读更多 »

AI 编码工具:为什么开发者意见不合

AI‑Coding“辩论”并非真正的辩论 你会听到两个截然不同的故事: 朋友的创业公司创始人——“我们的团队现在使用 AI,功能发布速度提升了一倍。我是 e...”

谁在招聘 — 2026年2月

在以开发者为先的公司开放职位:产品工程师、Developer advocates 或 Community builders?以全新的 dev tools 机会开启新的一年。