-
Notifications
You must be signed in to change notification settings - Fork 1
09. CI CD 및 배포
Jiyoung Hwang edited this page May 1, 2025
·
1 revision
이 페이지에서는 Spring Boot 백엔드를 GitHub Actions와 Docker를 사용하여 자동화된 CI/CD 파이프라인을 설정하는 방법에 대해 설명합니다. 이 파이프라인은 애플리케이션의 빌드, 테스트, 배포를 자동화하여 효율적인 운영을 지원합니다.
-
main브랜치에 푸시되거나 PR이 생성될 때마다 CI/CD 파이프라인이 자동으로 실행됩니다. - 현재는 test/workflow 브랜치에 테스트 중입니다.
- Docker 이미지를 빌드하여 애플리케이션 환경을 구성합니다.
- Spring Boot 애플리케이션의 의존성을 설치하고, 실행 가능한 상태로 준비합니다.
- 빌드된 Docker 컨테이너 내에서 자동화된 테스트가 실행됩니다.
- 테스트가 성공하면 배포 단계로 넘어갑니다.
- 빌드된 Docker 이미지를 Docker Hub에 푸시합니다.(이때 EC2에 Docker가 설치되어 있어야합니다)
- EC2에서 docker pull-> docker run또는 docker-compose를 실행합니다.
name: CI/CD Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
- name: Cache Maven dependencies
uses: actions/cache@v2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Build the project
run: mvn clean install -DskipTests
- name: Build Docker image
run: |
docker build -t my-springboot-app .
- name: Run tests in Docker
run: |
docker run --rm my-springboot-app mvn test
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Deploy to Docker Hub
run: |
docker tag my-springboot-app myusername/my-springboot-app:latest
docker push myusername/my-springboot-app:latest
- name: Notify deployment success
run: echo "Deployment Successful!"-
on:
main브랜치에 푸시되거나 PR이 생성될 때마다 트리거됩니다. -
jobs:
- build: Docker 이미지를 빌드하고, gradle을 사용하여 Spring Boot 애플리케이션을 빌드 및 테스트합니다.
- deploy: 빌드된 Docker 이미지를 Docker Hub와 같은 레지스트리에 푸시하여 배포합니다.
# 1. Use the official OpenJDK image as the base image
FROM openjdk:11-jre-slim
# 2. Set the working directory inside the container
WORKDIR /app
# 3. Copy the Spring Boot jar file
COPY target/my-springboot-app.jar /app/my-springboot-app.jar
# 4. Expose the port
EXPOSE 8080
# 5. Run the Spring Boot application
CMD ["java", "-jar", "my-springboot-app.jar"]-
FROM openjdk:11-jre-slim: OpenJDK 11을 기반으로 한 이미지를 사용합니다. -
WORKDIR /app: 컨테이너 내에서 작업할 디렉토리를/app으로 설정합니다. -
COPY target/my-springboot-app.jar: 빌드된 Spring Boot 애플리케이션의.jar파일을 컨테이너로 복사합니다. -
EXPOSE 8080: Spring Boot 애플리케이션이 8080 포트를 사용한다고 가정하여 해당 포트를 열어줍니다. -
CMD ["java", "-jar", "my-springboot-app.jar"]: 컨테이너 시작 시 Spring Boot 애플리케이션을 실행합니다.
- GitHub Actions와 Docker를 이용하여 자동화된 배포가 가능해졌습니다. 이를 통해 개발팀은 수동 배포의 부담을 줄이고, 빠르게 안정적인 배포를 진행할 수 있습니다.
- Docker를 활용하여 애플리케이션을 경량화하고, 다양한 환경에서 동일한 방식으로 실행할 수 있도록 했습니다.
CI/CD 파이프라인에서 발생한 문제들은 다음과 같은 방식으로 해결했습니다:
- Gradle 빌드 오류: chmod +x 로 gradle 권한을 부여합니다.
- application을 도커 이미디로: jar에서 직접 실행하는 방식에서 컨테이너 기반 방식을 사용하여 docker 이미지를 EC2에 push하는 형식으로 수정했습니다.