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는 파이프라인 형태로 구성되며, 각 단계가 자동화되어 있습니다.
- 코드 커밋: Git과 같은 버전 관리 시스템에 코드 푸시
- 빌드 단계: CI 서버(Jenkins, GitHub Actions 등)가 코드를 빌드
- 테스트 단계: 자동화된 테스트 실행 (단위, 통합, UI 테스트 등)
- 배포 준비 단계: 준비된 아티팩트를 스테이징 환경에 배포
- 배포 단계: 최종적으로 프로덕션 환경에 배포
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를 비교하며 프로젝트에 맞는 도구를 선택하는 것도 중요하다고 느꼈습니다.
- 도전 과제: 초기 설정은 다소 복잡했지만 설정 후 배포 속도가 크게 향상되었습니다.