From c34b1899549a41b0967c3fb4d5593e68f369f265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9D=B8=ED=98=B8?= <79935974+kih00@users.noreply.github.com> Date: Fri, 3 Jan 2025 20:43:48 +0900 Subject: [PATCH] =?UTF-8?q?Actions=20workflow=20=EC=88=98=EC=A0=95=20(#16)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Yongbeom Kim Co-authored-by: kih02 --- .github/workflows/docker.yml | 100 ++++++++++++++++++------ Dockerfile | 4 +- src/main/resources/application-prod.yml | 7 +- src/main/resources/application.yml | 2 +- 4 files changed, 82 insertions(+), 31 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index f3dbc0b..cc5a254 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -5,6 +5,7 @@ on: workflows: ["Kotlin Lint Check"] # lint.yml이 끝난 후 실행 types: - completed + jobs: build: runs-on: ubuntu-latest @@ -14,45 +15,94 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - # 2. AWS 인증 - - name: Log in to Amazon ECR - uses: aws-actions/amazon-ecr-login@v1 + - name: Install Docker Compose + run: | + sudo apt-get update + sudo apt-get install -y docker-compose + +# # 2. Docker Compose로 DB 시작 +# - name: Start Database with Docker Compose +# run: | +# docker-compose up -d mysql +# working-directory: . + + # 2. Gradle 빌드 + - name: Build project + run: | + SPRING_PROFILES_ACTIVE=prod ./gradlew build + + # 3. 빌드 결과 확인 + - name: Verify build artifacts + run: ls -R build/libs + + # 4. Docker 빌드 컨텍스트 준비 + - name: Prepare Docker context + run: cp build/libs/*.jar . + + # 5. AWS 자격 증명 설정 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v3 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ap-northeast-2 - # 3. 도커 이미지 빌드 + # 6. AWS ECR 로그인 + - name: Log in to Amazon ECR + uses: aws-actions/amazon-ecr-login@v1 + + # 7. 도커 이미지 빌드 - name: Build Docker image - run: | - docker build -t memo-with-tags-backend:latest . + run: docker build -t memo-with-tags-backend:latest . - # 4. 도커 이미지를 ECR로 푸시 + # 8. 도커 이미지를 ECR로 푸시 - name: Push Docker image to ECR run: | - # ECR 리포지토리 URI REPOSITORY_URI=739275468912.dkr.ecr.ap-northeast-2.amazonaws.com/memo-with-tags TAG=$(echo $GITHUB_SHA | cut -c1-7) # 커밋 해시 앞 7자리로 태그 생성 - # ECR에 태그 추가 - docker tag memo-with-tags-backend:latest $REPOSITORY_URI:$TAG + echo "Pushing Docker image with TAG: $TAG" - # ECR에 푸시 + docker tag memo-with-tags-backend:latest $REPOSITORY_URI:$TAG docker push $REPOSITORY_URI:$TAG - # 5. EC2 서버에서 Docker 이미지 실행 + # 9. EC2 서버에서 Docker 이미지 실행 - name: Deploy to EC2 run: | - # EC2 서버 접속 - ssh -o StrictHostKeyChecking=no ubuntu@${{ secrets.EC2_PUBLIC_IP }} << 'EOF' - # ECR 로그인 - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin $REPOSITORY_URI - - # 기존 컨테이너 중지 및 삭제 - docker stop memo-with-tags-backend || true - docker rm memo-with-tags-backend || true - - # 새 컨테이너 실행 - docker pull $REPOSITORY_URI:$TAG - docker run -d --name memo-with-tags-backend -p 80:80 $REPOSITORY_URI:$TAG - EOF + # 개인 키를 파일로 저장하고 권한 설정 + echo "${{ secrets.EC2_SSH_PRIVATE_KEY }}" > private_key.pem + chmod 600 private_key.pem + + # 배포 스크립트 작성 + echo "#!/bin/bash + REPOSITORY_URI=739275468912.dkr.ecr.ap-northeast-2.amazonaws.com/memo-with-tags + TAG=$(echo $GITHUB_SHA | cut -c1-7) + + echo \"Deploying Docker image with TAG: \$TAG\" + echo \"Deploying Docker image with REPOSITORY_URI: \$REPOSITORY_URI\" + + aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin \$REPOSITORY_URI + + docker stop memo-with-tags-backend || true + docker rm memo-with-tags-backend || true + + docker pull \$REPOSITORY_URI:\$TAG + docker run -d \ + -p 8080:8080 \ + -e SPRING_PROFILES_ACTIVE=prod \ + -e DB_NAME=memowithtags_db \ + -e DB_USERNAME=${{ secrets.DB_USERNAME }} \ + -e DB_PASSWORD=${{ secrets.DB_PASSWORD }} \ + --name memowithtags-backend \ + \$REPOSITORY_URI:\$TAG" > deploy.sh + + # 배포 스크립트 EC2로 전송 + scp -i private_key.pem -o StrictHostKeyChecking=no deploy.sh ubuntu@${{ secrets.EC2_PUBLIC_IP }}:/home/ubuntu/ + + # EC2에서 스크립트 실행 + ssh -i private_key.pem -o StrictHostKeyChecking=no ubuntu@${{ secrets.EC2_PUBLIC_IP }} "bash /home/ubuntu/deploy.sh" + +# - name: Stop Database +# run: | +# docker-compose down +# working-directory: . diff --git a/Dockerfile b/Dockerfile index 5b5bc4d..958ef43 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ WORKDIR /app # 로컬의 빌드된 JAR 파일을 컨테이너 안으로 복사 # (빌드 과정에서 JAR 파일을 생성한다고 가정) -COPY build/libs/your-app.jar /app/your-app.jar +COPY build/libs/memo-with-tags-0.0.1-SNAPSHOT.jar /app/memo-with-tags-0.0.1-SNAPSHOT.jar # 컨테이너가 시작될 때 실행될 명령어 설정 -CMD ["java", "-jar", "your-app.jar"] +CMD ["java", "-jar", "/app/memo-with-tags-0.0.1-SNAPSHOT.jar"] diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index bea9a56..2d8203c 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -3,9 +3,9 @@ server: spring: datasource: - url: jdbc:mysql://${DB_HOST:memo-db.cn860meg8hj0.ap-northeast-2.rds.amazonaws.com}:3306/${DB_NAME:your-database-name} - username: ${DB_USERNAME:your-database-username} - password: ${DB_PASSWORD:your-database-password} + url: jdbc:mysql://${{ secrets.DB_ENDPOINT }}:3306/memo-db + username: ${{ secrets.DB_USERNAME }} + password: ${{ secrets.DB_PASSWORD }} driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: @@ -13,6 +13,7 @@ spring: properties: hibernate: format_sql: true + dialect: org.hibernate.dialect.MySQL8Dialect show-sql: false logging: level: diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 7107ed0..6ced7bb 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,3 @@ spring: profiles: - active: dev # 기본 활성화 프로파일 (개발 환경) + active: ${SPRING_PROFILES_ACTIVE:dev} # 기본값 dev