CI/CD 구축과 자동 배포 시스템
1. 문제 상황: 수동 배포로 인한 비효율성
팀에서 애플리케이션을 배포할 때 수동으로 작업을 수행하면서 다음과 같은 문제가 발생했다.
- 개발자가 직접 코드를 빌드하고 서버에 배포해야 하므로 시간 소요
- 사소한 실수로 인해 배포 중 오류 발생 가능
- 테스트 과정이 수동으로 이루어져 품질 관리 어려움
- 여러 명이 협업하는 경우 배포 시점 관리가 어려움
이러한 문제를 해결하기 위해 CI/CD 시스템을 구축하여 자동화된 빌드 및 배포 프로세스를 도입할 필요가 있다.
2. 해결 과정: CI/CD 개념과 구축 방법
2.1 CI/CD란?
CI/CD(Continuous Integration & Continuous Deployment)는 코드 변경 사항을 지속적으로 통합하고, 테스트 및 배포 과정을 자동화하는 개발 방법론이다.
- CI(Continuous Integration): 코드가 변경될 때마다 자동으로 빌드하고 테스트하여 문제를 조기에 발견
- CD(Continuous Deployment): 테스트를 통과한 코드가 자동으로 운영 서버에 배포
2.2 CI/CD 도구 선택
CI/CD 파이프라인을 구축할 때 사용할 수 있는 도구는 다음과 같다.
도구 | 특징 |
---|---|
Jenkins | 오픈소스 CI/CD 도구, 플러그인 지원 |
GitHub Actions | GitHub과 통합된 CI/CD 시스템 |
GitLab CI/CD | GitLab에 내장된 CI/CD 기능 |
CircleCI | 클라우드 기반 CI/CD 서비스 |
ArgoCD | Kubernetes 네이티브 CD 도구 |
3. Jenkins를 활용한 CI/CD 구축
3.1 Jenkins 설치
Ubuntu 환경에서 Jenkins를 설치하는 방법은 다음과 같다.
sudo apt update
sudo apt install openjdk-11-jdk -y
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install jenkins -y
설치 후 Jenkins를 실행한다.
sudo systemctl start jenkins
sudo systemctl enable jenkins
3.2 Jenkins 기본 설정
Jenkins 웹 UI(http://localhost:8080
)에 접속하여 초기 설정을 완료한다.
- 관리자 계정 생성
- 필수 플러그인 설치 (Git, Docker, Kubernetes 등)
- GitHub 또는 GitLab과 연동
3.3 Jenkins Pipeline 설정
Jenkinsfile을 사용하여 CI/CD 파이프라인을 정의한다.
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git 'https://github.com/myrepo.git'
}
}
stage('Build') {
steps {
sh './gradlew build'
}
}
stage('Test') {
steps {
sh './gradlew test'
}
}
stage('Deploy') {
steps {
sh 'scp build/libs/myapp.jar user@server:/deploy/'
}
}
}
}
4. GitHub Actions를 활용한 CI/CD 구축
GitHub Actions를 활용하여 자동 배포를 설정할 수도 있다.
4.1 GitHub Actions Workflow 설정
프로젝트의 .github/workflows/main.yml
파일을 생성하고 다음과 같이 설정한다.
name: CI/CD Pipeline
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'adopt'
- name: Build
run: ./gradlew build
- name: Deploy
run: scp build/libs/myapp.jar user@server:/deploy/
5. Docker와 Kubernetes를 활용한 배포 자동화
5.1 Docker를 활용한 컨테이너 배포
Dockerfile을 작성하여 애플리케이션을 컨테이너화할 수 있다.
FROM openjdk:11
COPY build/libs/myapp.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
5.2 Kubernetes를 활용한 자동 배포
Kubernetes에서 배포를 자동화하려면 Deployment와 Service를 정의한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myrepo/myapp:latest
ports:
- containerPort: 8080
6. 최종 정리
CI/CD를 구축하면 개발, 빌드, 테스트, 배포 과정을 자동화하여 생산성을 높이고, 배포 오류를 최소화할 수 있다.
핵심 요약:
- CI/CD는 지속적인 통합(CI)과 지속적인 배포(CD)로 구성됨
- Jenkins, GitHub Actions, GitLab CI/CD 등 다양한 도구 활용 가능
- Jenkinsfile 또는 GitHub Actions Workflow를 통해 빌드 및 배포 자동화
- Docker와 Kubernetes를 활용하여 컨테이너 기반 배포 가능
- CI/CD 도입으로 개발 생산성을 향상하고 배포 안정성을 높일 수 있음
이러한 시스템을 구축하면 개발팀의 효율성을 극대화하고, 빠르고 안정적인 배포가 가능해진다.