Published on

CI/CD

Authors
  • avatar
    Name
    Inhwan Cho
    Twitter

CI(Continuous Integration, 지속적 통합)CD(Continuous Delivery 또는 Continuous Deployment, 지속적 제공 또는 지속적 배포)는 개발 효율성과 품질을 높이기 위한 방법론입니다.

이 두 용어는 종종 함께 언급되며, 자동화된 소프트웨어 개발 및 배포 프로세스의 중요한 구성 요소입니다.

CI (Continuous Integration)

  • 정의: 개발자들이 작업한 코드를 주기적으로(보통 매일 여러 번) 공유 리포지토리에 통합(merge)하는 것을 말합니다. 이 과정에서 코드 변경사항에 대해 자동으로 빌드와 테스트를 수행하여, 통합 과정에서 발생할 수 있는 문제를 조기에 발견하고 해결합니다.

  • 목적: 코드 통합 과정에서의 충돌을 최소화하고, 소프트웨어 품질을 개선하며, 배포 준비 과정을 단순화합니다.

  • 구성 요소: 소스 코드 리포지토리(GitHub, GitLab 등), 빌드 서버(Jenkins, Travis CI 등), 테스트 자동화 도구(JUnit, Selenium 등) 등이 포함됩니다.

CD (Continuous Delivery / Continuous Deployment)

  • Continuous Delivery (지속적 제공): CI 과정을 거친 후, 소프트웨어를 실제 운영 환경과 유사한 스테이징 환경에 자동으로 릴리즈하는 것을 말합니다. 이 단계에서는 수동으로 최종 배포 여부를 결정합니다.

  • Continuous Deployment (지속적 배포): 지속적 제공의 다음 단계로, 스테이징 환경을 거쳐 검증된 코드를 실제 운영 환경에 자동으로 배포하는 과정입니다. 이 과정에서는 사람의 개입 없이 모든 변경 사항이 자동으로 고객에게 제공됩니다.

  • 목적: 소프트웨어를 더 빠르고, 자주, 안전하게 배포하여 사용자에게 지속적으로 가치를 전달합니다.

  • 구성 요소: CI 도구, 배포 자동화 도구(Ansible, Chef, Kubernetes 등), 모니터링 및 알림 시스템(Prometheus, Slack 알림 등) 등이 포함됩니다.

CI/CD 파이프라인을 통해 개발팀은 코드 변경 사항을 신속하게 통합하고, 테스트하며, 배포할 수 있게 되어 전체 소프트웨어 개발 및 배포 프로세스의 속도와 안정성을 크게 향상시킬 수 있습니다.

Github Action을 통한 예시

GitHub Actions는 GitHub 리포지토리 내에서 직접 CI/CD 워크플로우를 자동화할 수 있는 기능을 제공합니다.

아래 예시는 간단한 Node.js 애플리케이션에 대한 CI/CD 파이프라인 구성 방법을 보여줍니다.

nodejs.yml
name: Node.js CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x]

    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v2
      with:
        node-version: ${{ matrix.node-version }}
    - run: npm install
    - run: npm test
      env:
        CI: true

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    # 이 부분에 실제 배포를 위한 스크립트를 추가합니다. 예를 들어, SSH를 통한 서버 배포, AWS Elastic Beanstalk, Firebase 등의 서비스를 사용할 수 있습니다.
    - name: Deploy to Server
      run: echo "Deploying to server..."
      # 실제 배포 스크립트 또는 명령어를 여기에 추가

주요 포인트

  • on: 이 워크플로우가 어떤 이벤트에 의해 실행될지 정의합니다. 여기서는 main 브랜치로의 push와 pull_request 이벤트에 반응하도록 설정했습니다.
  • jobs: 워크플로우에서 실행될 작업을 정의합니다. 여기서는 build와 deploy 두 가지 작업을 정의했습니다.
  • build: Node.js 환경을 설정하고, 의존성을 설치한 다음, 테스트를 실행합니다.
  • deploy: build 작업이 성공한 후에 실행됩니다. 실제 배포 로직을 포함합니다. 배포 방법은 사용하는 서비스나 환경에 따라 다르므로, 해당 부분은 실제 배포 명령어로 대체해야 합니다.

GitHub Actions를 사용하면 소스 코드의 변경 사항이 GitHub 리포지토리에 푸시될 때마다 자동으로 CI/CD 파이프라인이 실행되어, 코드의 빌드, 테스트, 배포가 자동화됩니다.

이를 통해 소프트웨어 개발 프로세스의 효율성과 안정성을 크게 향상시킬 수 있습니다.