24.11.26 TIL CI/CD

신성훈·2024년 11월 26일
0

TIL

목록 보기
86/162

CI/CD에 대한 TIL

1. CI/CD란?

CI/CD는 소프트웨어 개발에서 Continuous Integration(지속적 통합)Continuous Delivery/Deployment(지속적 배포)의 약자입니다.

  • CI (지속적 통합): 개발자가 작성한 코드를 지속적으로 통합하여 빌드하고 테스트하는 자동화된 프로세스
  • CD (지속적 전달/배포): 새로운 기능이 안정적으로 사용자 환경에 전달되도록 자동화하는 프로세스

CI/CD의 주요 목표

  • 빠른 배포 주기: 코드 변경 사항을 신속하게 배포
  • 안정성 확보: 자동화된 테스트를 통해 코드 품질 보장
  • 개발 효율성: 배포 프로세스를 자동화하여 수작업 감소

2. CI/CD 주요 구성요소

2.1 Continuous Integration (CI)

  • 코드 통합: 개발자들의 코드 변경 사항을 주기적으로 병합
  • 자동화된 빌드: 새로운 코드가 병합되면 자동으로 빌드 실행
  • 자동화된 테스트: 빌드된 애플리케이션에 대해 단위 테스트 및 통합 테스트 수행

2.2 Continuous Delivery (CD)

  • 준비된 배포: 테스트를 통과한 코드를 프로덕션 환경에 배포할 준비 상태로 유지
  • 수동 배포 가능: 인프라 관리자의 확인 후 배포 가능

2.3 Continuous Deployment (CD)

  • 자동 배포: 모든 테스트를 통과한 코드를 자동으로 프로덕션 환경에 배포
  • 사용자 피드백 즉각 반영: 빠른 배포로 사용자 피드백에 신속히 대응

3. CI/CD 파이프라인 예시

CI/CD는 파이프라인 형태로 구성되며, 각 단계가 자동화되어 있습니다.

  1. 코드 커밋: Git과 같은 버전 관리 시스템에 코드 푸시
  2. 빌드 단계: CI 서버(Jenkins, GitHub Actions 등)가 코드를 빌드
  3. 테스트 단계: 자동화된 테스트 실행 (단위, 통합, UI 테스트 등)
  4. 배포 준비 단계: 준비된 아티팩트를 스테이징 환경에 배포
  5. 배포 단계: 최종적으로 프로덕션 환경에 배포

4. CI/CD 도구

4.1 CI 도구

  • Jenkins: 가장 널리 사용되는 오픈소스 CI/CD 도구
  • GitHub Actions: GitHub에서 제공하는 통합 CI/CD 플랫폼
  • GitLab CI/CD: GitLab 내장 CI/CD 기능

4.2 CD 도구

  • Docker: 컨테이너를 사용한 배포 환경 설정
  • Kubernetes: 컨테이너 오케스트레이션 도구
  • AWS CodePipeline: AWS에서 제공하는 CI/CD 솔루션

5. CI/CD 파이프라인 구축 예시 (GitHub Actions)

파이프라인 정의 파일 (.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@v2

      - name: Set up Java
        uses: actions/setup-java@v2
        with:
          java-version: '11'

      - name: Build project
        run: ./gradlew build

      - name: Run tests
        run: ./gradlew test

  deploy:
    runs-on: ubuntu-latest
    needs: build

    steps:
      - name: Deploy to production
        run: echo "Deploying to production environment"

6. 마무리

  • 자동화의 중요성: CI/CD를 통해 개발과 배포 과정의 효율성을 높이고 코드 품질을 안정적으로 유지할 수 있다는 것을 프로젝트를 통해 깨달았고 다시 한 번 알아가는 시간이였습니다.
  • 테스트의 역할: 자동화된 테스트가 없었다면 코드 통합 단계에서 버그를 조기에 발견하기 어려웠을 것입니다.
  • 프로젝트 적용 가능성: Jenkins와 GitHub Actions를 비교하며 프로젝트에 맞는 도구를 선택하는 것도 중요하다고 느꼈습니다.
  • 도전 과제: 초기 설정은 다소 복잡했지만 설정 후 배포 속도가 크게 향상되었습니다.
profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글