CI/CD는 소프트웨어 개발과 배포 과정을 자동화하여 개발 효율성을 높이고, 버그를 줄이며, 빠르게 제품을 출시할 수 있도록 돕는 일련의 방법론입니다. CI는 지속적인 통합(Continuous Integration), CD는 지속적인 배포(Continuous Deployment) 또는 지속적인 전달(Continuous Delivery)을 의미.
CI는 개발자들이 작성한 코드를 자주(보통 하루에도 여러 번) 통합하여 공유 저장소(Git 등)에 병합하는 과정을 말합니다. 주요 목표는 코드 변경 사항을 빠르게 통합하고, 통합 과정에서 발생할 수 있는 충돌이나 오류를 조기에 발견하는 것입니다.
Jenkins: 가장 널리 사용되는 오픈 소스 CI 도구 중 하나입니다.
GitLab CI/CD : GitLab에 통합된 CI/CD 기능으로 설정이 간편.
Travis CI, CircleCI : 클라우드 기반의 CI 서비스로 설정과 사용이 간편합니다.
코드 변경 사항을 자동을 프로덕션 환경에 배포하는 것을 목표로 합니다. 다음과 같은 차이가 있음.
지속적인 전달(Continuous Delivery) : 코드가 항상 배포 가능한 상태로 유지되며, 실제 배포는 수동으로 진행됩니다
지속적인 배포(Continuous Deployment) : 코드가 통합되고 테스트를 통과하면 자동으로 프로덕션 환경에 배포됩니다.
코드가 통합된 후부터 배포까지의 과정을 자동화하여 인적 오류를 줄입니다.
실제 사용자 환경에서의 피드백을 빠르게 받을 수 있어 제품 개선에 도움이 됩니다.
반복 가능한 배포 과정을 통해 배포 실패 확률을 줄입니다.
Jenkins : 배포 파이프라인을 구성할 수 있는 다양한 플러그인을 제공합니다.
Docker : 컨테이너화된 애플리케이션을 배포하는 데 유용합니다.
Kubernetes : 컨테이너 오케스트레이션 도구로, 대규모 배포를 관리하는 데 사용됩니다.
AWS CodePipeline, GitHub Actions : 클라우드 기반의 배포 도구로 다양한 서비스와 연동이 용이합니다.
취업 준비를 하고 있는 신입 Java/Spring 백엔드 개발자라면, 실습을 통해 실제 프로젝트 환경에서 CI/CD를 적용해보는 경험이 매우 중요합니다. 아래에 실습할 만한 프로젝트 아이디어와 단계별 가이드를 제공하겠습니다. 이를 통해 CI/CD의 개념을 실제로 적용해보며, 포트폴리오에도 활용할 수 있는 유용한 경험을 쌓을 수 있습니다.
먼저, 기본적인 Spring Boot 애플리케이션을 개발해보세요. 예를 들어, 간단한 게시판, To-Do 리스트, 또는 사용자 관리 시스템 등을 만들어볼 수 있습니다.
실습 내용:
프로젝트를 GitHub, GitLab, Bitbucket과 같은 Git 호스팅 서비스에 저장소를 생성하고, 소스 코드를 버전 관리하세요.
실습 내용:
CI 도구를 사용하여 코드가 푸시될 때마다 자동으로 빌드하고 테스트가 실행되도록 설정합니다. 여기서는 GitHub Actions와 Jenkins를 예로 들어보겠습니다.
GitHub Actions 실습:
프로젝트 루트에 .github/workflows 디렉토리 생성
ci.yml 파일 작성하여 Maven 또는 Gradle 빌드, JUnit 테스트 실행
예시:
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
- name: Build with Maven
run: mvn clean install
Jenkins 실습:
코드가 성공적으로 빌드되고 테스트를 통과하면, 자동으로 배포되도록 설정합니다. Docker와 Kubernetes를 활용해보세요.
Docker 실습:
Dockerfile 작성하여 애플리케이션 컨테이너화FROM openjdk:17-jdk-alpine
VOLUME /tmp
COPY target/myapp.jar myapp.jar
ENTRYPOINT ["java","-jar","/myapp.jar"]docker build -t myapp .
docker run -p 8080:8080 myappKubernetes 실습:
kubectl을 사용하여 애플리케이션 배포apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: myappCI/CD 도구와 배포 도구를 연동하여 전체 파이프라인을 자동화합니다. 예를 들어, GitHub Actions를 사용하여 Docker 이미지를 빌드하고 Kubernetes에 배포하는 과정을 자동화할 수 있습니다.
GitHub Actions 예시:
name: CI/CD Pipeline
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
- name: Build with Maven
run: mvn clean install
- name: Build Docker Image
run: docker build -t myapp:${{ github.sha }} .
- name: Push to Docker Hub
env:
DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }}
run: |
echo $DOCKER_HUB_PASSWORD | docker login -u $DOCKER_HUB_USERNAME --password-stdin
docker tag myapp:${{ github.sha }} mydockerhubuser/myapp:${{ github.sha }}
docker push mydockerhubuser/myapp:${{ github.sha }}
- name: Deploy to Kubernetes
env:
KUBECONFIG: ${{ secrets.KUBECONFIG }}
run: |
kubectl set image deployment/myapp-deployment myapp=mydockerhubuser/myapp:${{ github.sha }}
배포된 애플리케이션을 모니터링하고, 로그를 분석하여 문제를 신속하게 해결할 수 있는 체계를 마련합니다.
실습 내용:
위의 실습을 통해 CI/CD의 개념을 실제로 적용해보고, 자동화된 개발 및 배포 파이프라인을 구축해보세요. 이러한 경험은 취업 준비 시 큰 강점이 되며, 면접에서도 실제 프로젝트 경험을 이야기할 수 있어 유리합니다. 또한, GitHub에 프로젝트를 공개하여 포트폴리오로 활용하면 채용 담당자에게 좋은 인상을 줄 수 있습니다.
성공적인 취업 준비를 응원하며, 추가로 궁금한 점이 있으면 언제든지 질문해 주세요!