CI/CD 구축 및 자동 배포 시스템
1. 문제 상황: 수동 배포의 비효율성
개발팀에서 새로운 기능을 추가하거나 버그를 수정한 후, 운영 서버에 배포하는 과정에서 다음과 같은 문제가 발생했다.
- 코드 변경 사항을 수동으로 빌드하고 배포해야 하므로 시간이 오래 걸림
- 여러 명의 개발자가 동시에 작업할 경우, 코드 충돌이나 배포 오류가 발생할 가능성이 높음
- 배포 후 테스트를 수동으로 진행해야 하므로 버그가 뒤늦게 발견됨
- 롤백 절차가 복잡하여 문제 발생 시 빠른 복구가 어려움
이러한 문제를 해결하기 위해 CI/CD 시스템을 구축하여 배포 과정을 자동화하고, 코드 변경 사항을 안정적으로 운영 환경에 반영할 필요가 있다.
2. 해결 과정: CI/CD 시스템 구축
2.1 CI/CD 개요
CI/CD 시스템은 다음과 같은 단계로 구성된다.
- 지속적 통합(CI): 개발자가 코드를 변경하면 자동으로 빌드 및 테스트 수행
- 지속적 배포(CD): 테스트가 통과된 코드가 운영 서버에 자동 배포됨
이를 위해 Jenkins, GitHub Actions, GitLab CI/CD, CircleCI, Travis CI 등 다양한 도구를 사용할 수 있다. 여기서는 GitHub Actions와 Jenkins를 활용한 CI/CD 구축 방법을 다룬다.
2.2 GitHub Actions을 이용한 CI/CD 구축
GitHub Actions를 사용하면 GitHub 저장소에서 직접 CI/CD 파이프라인을 설정할 수 있다.
1) GitHub Actions 워크플로우 파일 생성
저장소의 .github/workflows/ci-cd.yml
파일을 생성하고 다음 내용을 추가한다.
name: CI/CD Pipeline
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 저장소 체크아웃
uses: actions/checkout@v3
- name: Node.js 설정
uses: actions/setup-node@v3
with:
node-version: '18'
- name: 의존성 설치
run: npm install
- name: 애플리케이션 빌드
run: npm run build
- name: 테스트 실행
run: npm test
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: 서버에 배포
uses: appleboy/ssh-action@v0.1.4
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /home/app
git pull origin main
npm install
npm run build
pm2 restart app
설명:
push
이벤트가 발생하면 자동으로 빌드 및 테스트를 수행- 테스트가 통과되면 원격 서버에 SSH로 접속하여 애플리케이션을 배포
- 환경 변수를 GitHub Secrets에 저장하여 보안성을 유지
2.3 Jenkins를 이용한 CI/CD 구축
Jenkins를 활용하여 CI/CD 파이프라인을 구축할 수도 있다.
1) Jenkins 설치
Ubuntu 서버에서 Jenkins를 설치한다.
sudo apt update
sudo apt install openjdk-11-jdk -y
wget -q -O - https://pkg.jenkins.io/debian/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
sudo systemctl start jenkins
sudo systemctl enable jenkins
2) Jenkins 파이프라인 설정
Jenkins의 "새로운 Item"에서 "Pipeline"을 선택하고, 아래와 같은 Jenkinsfile
을 작성한다.
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/user/repository.git'
}
}
stage('Build') {
steps {
sh 'npm install'
sh 'npm run build'
}
}
stage('Test') {
steps {
sh 'npm test'
}
}
stage('Deploy') {
steps {
sshagent(['jenkins-ssh-key']) {
sh 'ssh user@server_ip "cd /home/app && git pull origin main && npm install && npm run build && pm2 restart app"'
}
}
}
}
}
설명:
- Git 저장소에서 코드를 가져와 빌드 및 테스트 수행
- 테스트 통과 시 운영 서버에 SSH를 통해 배포
- PM2를 이용해 애플리케이션을 재시작
3. 최종 정리
CI/CD 시스템을 구축하면 코드 변경 사항을 신속하게 배포할 수 있으며, 배포 과정에서 발생할 수 있는 오류를 줄일 수 있다.
핵심 요약:
- CI/CD는 지속적 통합(CI)과 지속적 배포(CD)로 구성됨
- GitHub Actions 또는 Jenkins를 활용하여 자동화된 배포 프로세스를 구축할 수 있음
- GitHub Actions의 SSH 액션을 활용하여 원격 서버에 자동 배포
- Jenkins 파이프라인을 설정하여 빌드, 테스트, 배포 과정을 자동화
- 자동화된 배포 시스템을 구축하면 배포 속도를 향상시키고, 운영상의 오류를 줄일 수 있음
이러한 CI/CD 구축을 통해 개발과 배포 프로세스를 효율적으로 개선할 수 있다.