엔터프라이즈 Jenkins 파이프라인: WAR를 DEV, QA, UAT, PROD에 배포하고 승인 게이트, 롤백 및 SCP 적용

발행: (2026년 2월 17일 오후 04:18 GMT+9)
10 분 소요
원문: Dev.to

Source: Dev.to

Srinivasaraju Tangella

소개

현대 기업 환경에서는 애플리케이션을 여러 환경(DEV, QA, UAT, PROD)에 수동으로 배포하는 것이 위험하고 오류가 발생하기 쉬우며 비효율적입니다.

조직이 필요로 하는 것

  • 자동화된 배포
  • 환경별 타깃 지정
  • 프로덕션을 위한 승인 게이트
  • 백업 및 롤백 기능
  • 보안 파일 전송
  • 높은 신뢰성 및 감사 가능성

이 문서에서는 다음을 활용하여 WAR 파일을 여러 환경에 배포하는 프로덕션 수준의 Jenkins 파이프라인을 구축합니다:

  • 파라미터화된 파이프라인
  • 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

Source:

사전 요구 사항

이 파이프라인을 구현하기 전에 다음 사항을 확인하십시오:

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 파일을 자동으로 복원합니다.

Production Safety Mechanisms

  • Manual approval for PROD deployments → PROD 배포에 대한 수동 승인
  • Backup before deployment → 배포 전 백업
  • Secure SSH authentication (via Jenkins credentials) → 보안 SSH 인증 (Jenkins 자격 증명 사용)
  • Health‑check verification after restart → 재시작 후 헬스 체크 검증

주요 엔터프라이즈 기능

- 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 파일은 SSH 키 인증을 사용한 SCP를 통해 안전하게 전송되어 Jenkins와 대상 서버 간의 암호화된 통신을 보장합니다.

프로덕션 승인 게이트
프로덕션 배포 전에는 수동 승인 단계가 필요하여 실수로 인한 릴리스를 방지하고 통제된 롤아웃을 강제합니다.

배포 전 자동 백업
파이프라인은 현재 배포된 WAR 파일을 자동으로 백업하여 복구를 위한 안정적인 버전을 항상 사용할 수 있게 합니다.

즉시 롤백 기능
배포가 실패하거나 문제가 발생하면 파이프라인은 백업에서 이전 버전을 즉시 복원하여 다운타임과 위험을 최소화합니다.

완전 자동화 배포 워크플로우
빌드 → 배포 → 서비스 재시작 → 검증까지 전체 과정이 자동화되어 수동 개입과 인적 오류를 줄입니다.

보안 자격 증명 관리
모든 SSH 키와 자격 증명은 Jenkins Credentials Manager에 안전하게 저장되어 엔터프라이즈 수준의 보안을 제공합니다.

배포 검증 및 헬스 체크
배포 후 자동 헬스 체크를 통해 애플리케이션 가용성을 확인하고 성공적인 릴리스를 검증합니다.


실제 엔터프라이즈 혜택

수동 배포 위험 제거
자동화는 수동 배포에 내재된 오류, 불일치 및 지연을 제거합니다.

배포 속도 및 효율성 향상
이전에는 수동으로 30~60분이 걸리던 작업이 이제는 몇 분 안에 완료됩니다.

프로덕션 안전 및 안정성 보장
승인 게이트, 백업 및 롤백 메커니즘이 프로덕션 환경을 안전하게 유지합니다.

더 빠른 릴리즈 사이클 가능
팀은 기능, 수정 및 업데이트를 빠르게 제공하여 애자일 및 DevOps 실천을 지원합니다.

완전한 추적성 및 감사 가능성 제공
모든 배포가 Jenkins에 기록되어 컴플라이언스를 위한 완전한 추적성을 제공합니다.

다운타임 감소 및 신뢰성 향상
자동 롤백 및 헬스 체크가 애플리케이션의 높은 가용성을 유지합니다.

DevOps 자동화 성숙도 향상
이 파이프라인은 은행, 핀테크, 헬스케어 및 대규모 클라우드 환경에서 사용되는 엔터프라이즈 수준의 관행을 반영합니다.

확장 가능하고 미래 지향적인 아키텍처 지원
Kubernetes, 클라우드 배포, 블루‑그린 전략 및 GitOps 워크플로우로 손쉽게 확장할 수 있습니다.


향후 개선 사항

파이프라인을 다음과 같이 확장할 수 있습니다:

  • 블루‑그린 배포
  • 카나리 배포
  • Kubernetes 배포
  • 헬스 체크 실패 시 자동 롤백
  • Slack(또는 기타) 알림
  • GitOps 통합

결론

이 Jenkins 파이프라인은 다음과 같은 완전한 엔터프라이즈 급 배포 솔루션을 제공합니다:

  • 다중 환경 배포
  • 보안 SCP 전송
  • 프로덕션 승인 게이트
  • 자동 백업 및 즉시 롤백
  • 완전 자동화 워크플로우

이는 전 세계 DevOps 팀이 채택한 실제 프로덕션 배포 패턴을 나타냅니다.

0 조회
Back to Blog

관련 글

더 보기 »

채용 중인 기업 — 2026년 2월

Dev‑First 기업의 오픈 포지션: Product engineers, Developer advocates, 혹은 Community builders? 새해를 맞아 dev tools 분야에서 새로운 기회를 시작하세요.