쇼핑몰 - 3 [GitHub Actions를 통한 CI/CD]

2024. 11. 6. 15:55·Java/쇼핑몰

✅ 이전 포스팅

2024.11.03 - [Java/쇼핑몰] - 쇼핑몰 - 2 [Docker-compose 사용하기]

 

쇼핑몰 - 2 [Docker-compose 사용하기]

✅ 이전 포스팅2024.11.01 - [Java/쇼핑몰] - 쇼핑몰 만들기 - 1 [AWS EC2로 배포 서버 만들기] 쇼핑몰 만들기 - 1 [AWS EC2로 배포 서버 만들기]✅ 동기예에에에에에전에 만들었던 허접한 게시판을 뒤로하

magicmk.tistory.com

 

이전 포스팅에서는 EC2에 Docker-Compose를 사용하여 WAS, DB, Redis를 올리는 것까지 진행하였다.

이번 포스팅에서는 매번 직접 빌드하여 서버에 배포할 수 없기 때문에 github actions를 통해서

자동(?)으로 배포하는 방식에 대하여 작성하도록 한다.


✅ workflows yml 만들기

workflow를 만드는 것 자체는 인터넷에 수많은 내용이 있기 때문에 나의 경우는

yml 파일을 어떻게 구성했는지에 대해 간단하게 설명하려고 한다.

 

흐름만 간략히 설명하자면 아래와 같다.

  1. Code Checkout
  2. JDK Setup
  3. gradle 권한 및 캐쉬 지우기
  4. build
  5. build 한 것 docker image로 만들기
  6. docker image hub에 push하기
  7. 서버에 ssh로 접속
  8. was docker image pull 받은 뒤 docker-compose 실행시키기

위 일련의 과정들을 실행하도록 만든 파일이라고 보면 된다.

name: Deploy to AWS EC2

on:
  pull_request:
    branches:
      - master          # master 브랜치에서 PR 발생 시
  workflow_dispatch:  # 수동 실행을 허용

jobs:
  build_and_deploy:
    runs-on: ubuntu-latest

    env:
      HOST: ${{ secrets.EC2_HOST }}
      USER: ${{ secrets.EC2_USER }}
      DOCKER_COMPOSE_PATH: /home/ubuntu/compose/docker-compose.yml
      ENV_FILE_PATH: /home/ubuntu/.env  # .env 파일의 위치
      IMAGE_NAME: rlaalsrl9569/shop_was

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

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

      - name: Set executable permission for gradlew
        run: chmod +x ./gradlew

      - name: Clear Gradle cache
        run: rm -rf ~/.gradle/caches/

      - name: Build project
        run: ./gradlew clean build

      - name: Build Docker image
        run: |
          echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
          docker build -t $IMAGE_NAME:${GITHUB_SHA} -t $IMAGE_NAME:latest .
          docker push $IMAGE_NAME:${GITHUB_SHA}
          docker push $IMAGE_NAME:latest


      - name: Set up SSH
        uses: webfactory/ssh-agent@v0.5.3
        with:
          ssh-private-key: ${{ secrets.EC2_KEY }}

      - name: Deploy to EC2
        env:
          SHOP_WAS_TAG: ${{ github.sha }}
        run: |
          ssh -o StrictHostKeyChecking=no $USER@$HOST "
            cd $(dirname $DOCKER_COMPOSE_PATH) && \
            sudo docker-compose --env-file $ENV_FILE_PATH down --remove-orphans && \
            sudo docker-compose --env-file $ENV_FILE_PATH pull && \
            sudo docker-compose --env-file $ENV_FILE_PATH up -d
          "

 

내용이 직관적이고 쉬워서 설명할 것이 없을 것 같다...


✅ Dockerfile 만들기

workflows yml을 만들었다면 이번에는 Dockerfile을 작성해야 한다. docker image를 만들기 위해서는

Dockerfile이 필요하기 때문이다.

# 빌드 스테이지
FROM bellsoft/liberica-openjdk-alpine:17 AS build
WORKDIR /app

# Gradle 래퍼와 설정 파일 복사 및 빌드
COPY gradlew gradlew
COPY gradle gradle
COPY build.gradle settings.gradle ./
RUN chmod +x gradlew
COPY . .
RUN ./gradlew clean build -x test

# 실행 스테이지 (최종 이미지)
FROM bellsoft/liberica-openjdk-alpine:17
WORKDIR /app

# 빌드 스테이지에서 생성된 JAR 파일만 복사
COPY --from=build /app/build/libs/*.jar app.jar

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

 

workflows 과정을 보면 build할 때 test코드가 진행되기 때문에 docker image를 만들 때는 test코드 작동을

제한했다.


✅ 마무리

사실 블로그에 정리할 때는 엄청 간단하고 짧게 구현한 것 같지만 .env 파일을 읽지 못한다거나

Secrets가 적용이 안 됐다거나 이상한 부분에서 헤매어 시간이 많이 소요되었다.

분명 로컬에서는 빌드가 되었는데 github actions에서 빌드할 때는 테스트 코드에서 오류가 난다던지

정상적으로 workflows가 잘 진행되었는데 서버에서 was가 죽는다던지 수많은 시행착오를 겪었다...

 

GitHub Actions 로그1

 

GitHub Actoins 로그2

 

수많은 PR의 결과들.... 여기에 어떤 과정을 겪었는지 다 적으려고 했으나 시간이 지나서 기억 속에서 사라진 것들과

너무 자잘해서 도무지 어떻게 기술해야 할지 모르겠는 것들이 섞여 그냥 완성본만 작성했다...

나중에는 Jenkins로 CI/CD를 구성해 볼 텐데 그때는 또 얼마나 고통받을지...

어쨌든 결국 완성했고 지금은 문제없이 잘 진행되고 있으니 감사하다~

 

https://github.com/sideProject-org/shop-back

 

GitHub - sideProject-org/shop-back: 쇼핑몰 서버

쇼핑몰 서버. Contribute to sideProject-org/shop-back development by creating an account on GitHub.

github.com

 

저작자표시 비영리 (새창열림)

'Java > 쇼핑몰' 카테고리의 다른 글

쇼핑몰 - 6 [Spring Security + JWT + OAuth2 + Redis]  (2) 2024.12.02
쇼핑몰 - 5 [spring security + JWT + Redis 로그인]  (0) 2024.11.19
쇼핑몰 - 4 [회원 가입 구현]  (0) 2024.11.12
쇼핑몰 - 2 [Docker-compose 사용하기]  (0) 2024.11.03
쇼핑몰 만들기 - 1 [AWS EC2로 배포 서버 만들기]  (3) 2024.11.01
'Java/쇼핑몰' 카테고리의 다른 글
  • 쇼핑몰 - 5 [spring security + JWT + Redis 로그인]
  • 쇼핑몰 - 4 [회원 가입 구현]
  • 쇼핑몰 - 2 [Docker-compose 사용하기]
  • 쇼핑몰 만들기 - 1 [AWS EC2로 배포 서버 만들기]
요술공주밍키
요술공주밍키
조금씩이라도 꾸준히..
  • 요술공주밍키
    삽질의흔적
    요술공주밍키
  • 전체
    오늘
    어제
    • 분류 전체보기 (139)
      • Java (42)
        • Spring Boot (14)
        • Spring Boot 게시판 (14)
        • 공중화장실 찾기 (4)
        • 쇼핑몰 (8)
      • JavaScript (8)
        • NodeJS (2)
      • Python (5)
        • Django (4)
      • Server (10)
        • Docker (4)
        • K8S (0)
        • Jenkins (1)
      • 알고리즘 (24)
        • 프로그래머스 (19)
        • 백준 (5)
      • Etc (21)
        • 개발 팁 (1)
      • 일상 (27)
        • 독서 포스트 (25)
        • 회고록 (2)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
요술공주밍키
쇼핑몰 - 3 [GitHub Actions를 통한 CI/CD]
상단으로

티스토리툴바