✅ 이전 포스팅
2024.11.03 - [Java/쇼핑몰] - 쇼핑몰 - 2 [Docker-compose 사용하기]
이전 포스팅에서는 EC2에 Docker-Compose를 사용하여 WAS, DB, Redis를 올리는 것까지 진행하였다.
이번 포스팅에서는 매번 직접 빌드하여 서버에 배포할 수 없기 때문에 github actions를 통해서
자동(?)으로 배포하는 방식에 대하여 작성하도록 한다.
✅ workflows yml 만들기
workflow를 만드는 것 자체는 인터넷에 수많은 내용이 있기 때문에 나의 경우는
yml 파일을 어떻게 구성했는지에 대해 간단하게 설명하려고 한다.
흐름만 간략히 설명하자면 아래와 같다.
- Code Checkout
- JDK Setup
- gradle 권한 및 캐쉬 지우기
- build
- build 한 것 docker image로 만들기
- docker image hub에 push하기
- 서버에 ssh로 접속
- 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가 죽는다던지 수많은 시행착오를 겪었다...
수많은 PR의 결과들.... 여기에 어떤 과정을 겪었는지 다 적으려고 했으나 시간이 지나서 기억 속에서 사라진 것들과
너무 자잘해서 도무지 어떻게 기술해야 할지 모르겠는 것들이 섞여 그냥 완성본만 작성했다...
나중에는 Jenkins로 CI/CD를 구성해 볼 텐데 그때는 또 얼마나 고통받을지...
어쨌든 결국 완성했고 지금은 문제없이 잘 진행되고 있으니 감사하다~
https://github.com/sideProject-org/shop-back
'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 |