Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

DS's TechBlog

[GitHub Actions] Spring Boot + Docker CI/CD 구축하기 본문

Tools

[GitHub Actions] Spring Boot + Docker CI/CD 구축하기

dsjo 2024. 5. 10. 23:34

기능 추가/변경 시 자동으로 프로젝트를 빌드하여 Docker Hub에 이미지를 올리는 방법에 대해서 알아보겠습니다.

배경

프론트엔드 개발자와의 기존 협업 방식이 번거로워 도입하게 되었습니다. 기존 방식에 대해서 먼저 설명드리겠습니다.

 

<기존 방식>

  1. 백엔드 기능이 완성되면 프로젝트를 build 하고, jar 파일을 프론트엔드 개발자에게 넘겨줍니다.
  2. 프론트엔드 개발자는 docker-compose.yml, Dockerfile.yml와 함께 docker-compose up --build  명령어로 이미지를 생성하고, 도커 컨테이너를 띄웁니다.
  3. 백엔드 API를 로컬에서 테스트할 수 있게 됩니다.

비용문제로 개발 서버를 따로 두지 않고, Docker를 이용해 로컬에서 백엔드 API를 테스트하도록 했습니다.

하지만, 이 방식에는 크게 3가지 문제가 있습니다.

  1. 기능을 추가하거나 변경할 때마다 프로젝트를 빌드하여 jar 파일을 업데이트해야 합니다.
  2. jar 파일을 프론트엔드 개발자에게 직접 전달합니다. jar 파일의 용량이 크므로 많은 시간이 소요됩니다.
  3. 프론트엔드 개발자가 jar 파일을 직접 Docker image로 build 해야 합니다. 여기서도 시간이 소요됩니다.

이러한 문제들을 GitHub Actions로 해결해 보겠습니다.

해결 과정

프로젝트 관리를 깃허브로 하고 있기 때문에, GitHub Actionsworkflows를 통해 문제를 해결할 수 있습니다.

해결 방식에 대해서 설명드리겠습니다.

 

<변경 방식>

  1. GitHub의 main branch로 push 할 때마다 프로젝트를 빌드합니다.
  2. 빌드한 jar 파일을 Dockefile을 통해 Docker image로 빌드합니다.
  3. Docker image를 Docker Hub에 올립니다.
  4. 프론트엔드 개발자는 Docker Hub에서 이미지를 pull 받습니다.
  5. docker-compose.yml 파일로 컨테이너를 띄웁니다.
  6. 백엔드 API를 로컬에서 테스트할 수 있게 됩니다.

위와 같이 동작하도록 workflows를 작성해 보겠습니다. .github/workflows 디렉토리 아래에 yml 파일로 작성해야 합니다.

name: Backend CI

on:
  push:
    branches: [ main ]

jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: set up JDK 17
        uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '17'

      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew

      - name: Spring Boot Build
        run: ./gradlew build

      - name: Login to DockerHub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ secrets.DOCKER_USERNAME }}/haedal-web

 

또한, repository의 Settings에서 도커 아이디와 패스워드 등 github에 올라가면 안 되는 정보를 관리할 수 있습니다.

이렇게 하면 번거로웠던 빌드, 배포 과정을 간단하게 수행할 수 있게 됩니다.

다음에는 Docker와 GitHub Acitons에서 환경변수를 관리하는 방법에 대해서 작성하겠습니다.

감사합니다.