본문 바로가기
카테고리 없음

CI/CD 구축 및 자동 배포 시스템

by 백수A 2025. 3. 31. 10:32

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 구축을 통해 개발과 배포 프로세스를 효율적으로 개선할 수 있다.