운영 중인 백엔드 시스템에 CI/CD를 도입하면서, 코드 배포의 시간을 50% 이상 단축할 수 있었습니다.
1. 프로젝트 환경 구성
현재 시스템은 다음과 같은 구조로 운영되고 있습니다:
- 로컬 개발 환경 → Bastion Host → Portal Server
개발된 코드는 GitHub를 통해 관리되며, Bastion Host를 거쳐 Portal Server에 배포됩니다.- 기존 구조: Local (.war 파일 mvn build) -> .war 파일 Bastion Host 전송 -> .war 파일 Portal Server 전송 -> 배포
- 보안 강화 구조 (GCP Private IP + IAP)
Portal 서버는 GCP 내부 네트워크에 위치하고 있으며, 외부에서 직접 접근할 수 없고, IAP(Identity-Aware Proxy)를 통해서만 접속이 가능합니다. 모든 배포 작업은 IAP 터널링을 통해 Bastion Host를 경유합니다.
2. 의존성 이슈 대응 (googlebigquery)
배포 과정에서 googlebigquery-jdbc 관련 외부 의존성이 Maven 중앙 저장소에서 정상적으로 다운로드되지 않는 문제가 있었습니다.
이 문제는 해당 라이브러리 .jar 파일을 프로젝트 레포에 직접 포함시키는 방식으로 해결했습니다. 완전한 자동화에는 다소 한계가 있었지만, CI 파이프라인 내 의존성 충돌은 방지할 수 있었습니다.
3. CI 파이프라인 구성 (GitHub Actions)
트리거 조건
- test, production 브랜치로 Pull Request가 생성될 때 자동으로 동작합니다.
브랜치별로 설정된 프로파일(dev, prd)에 따라 빌드 환경이 구분됩니다.
주요 작업 흐름
- 코드 체크아웃 및 Java 환경 설정
- GitHub Actions에서 Temurin JDK 11 설치
- Maven 빌드 실행
- mvn clean install -Pdev 혹은 -Pprd로 WAR 파일 생성
- Google Cloud 인증 및 SSH 연결
- 서비스 계정 키를 활용한 인증
- Github 레포지토리 Settings > Secrets and variables > Actions > New repository secret 생성 -> yml 파일에서 사용
- IAP 터널을 통해 Bastion Host에 WAR 파일 전송
- 서비스 계정 키를 활용한 인증
- Bastion Host에서 배포 스크립트 실행
- 사전에 작성된 deploy_dev.sh 또는 deploy_prod.sh 실행
- 해당 스크립트는 내부 Portal 서버로 WAR 파일을 복사하는 역할 수행
name: Deploy WAR to Bastion (production)
on:
pull_request:
branches: [production]
jobs:
deploy:
name: Build and Deploy to Production
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '11'
- name: Build WAR using Maven
run: mvn -B clean install -Pprd
- name: Set up Google Cloud SDK
uses: google-github-actions/auth@v2
with:
project_id: service-account
credentials_json: ${{ secrets.key }}
export_default_credentials: true
- name: Activate service account for gcloud CLI
run: |
gcloud auth activate-service-account --key-file="${GOOGLE_APPLICATION_CREDENTIALS}"
gcloud config set account service-account@service-account.iam.gserviceaccount.com
- name: Transfer WAR to Bastion Host via IAP
run: |
gcloud compute scp target/file.war bastion-host:/home/service-account/ \
--zone=asia-northeast3-a \
--tunnel-through-iap \
--project=service-account
- name: Run deployment script on Bastion
run: |
gcloud compute ssh bastion-host \
--zone=asia-northeast3-a \
--tunnel-through-iap \
--project=dmdashboard-prod \
--command="bash /home/service-account/deploy_prod.sh"
4. CD (배포 자동화) 전략
보안상의 이유로, 최종 WAS 배포는 자동화하지 않고 운영자가 수동으로 수행하도록 했습니다.
WAR 파일만 전달된 상태에서, 직접 Tomcat을 재시작하거나 웹 애플리케이션을 교체하는 식으로 운영 환경에 반영합니다.
이렇게 설계한 이유는 다음과 같습니다:
- 운영 서버 접근 권한 최소화
- 실시간 장애 대응 여지를 확보
- 배포 승인 및 리스크 확인 프로세스 유지
이번 CI/CD 구축을 통해 배포 시간과 실수를 줄이고, 운영 안정성을 높일 수 있게 되었습니다.
'Git' 카테고리의 다른 글
[GIT] Git Flow - 가장 쉬운 깃 브랜치 전략 (생애 첫 기술 발표 영상) (1) | 2024.10.03 |
---|