From 893e1837e59f9ae86d118fa003ea8a2c8dc05e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AF=BC=EC=B0=AC=EA=B8=B0?= Date: Wed, 10 Jul 2024 22:20:49 +0900 Subject: [PATCH] feat: dev cd (#27) --- .github/workflows/showpot-dev-cd.yml | 102 ++++++++++++++++++ ...{showPot-dev-ci.yml => showpot-dev-ci.yml} | 0 ...howPot-prod-ci.yml => showpot-prod-ci.yml} | 0 Dockerfile | 4 + .../org/example/config/SecurityConfig.java | 1 + .../org/example/health/HealthController.java | 17 +++ .../main/resources/application-domain-dev.yml | 7 ++ app/src/main/resources/application-dev.yml | 14 ++- docker-compose.yml | 38 +++++-- start-develop.sh | 11 ++ 10 files changed, 186 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/showpot-dev-cd.yml rename .github/workflows/{showPot-dev-ci.yml => showpot-dev-ci.yml} (100%) rename .github/workflows/{showPot-prod-ci.yml => showpot-prod-ci.yml} (100%) create mode 100644 Dockerfile create mode 100644 app/api/src/main/java/org/example/health/HealthController.java create mode 100644 start-develop.sh diff --git a/.github/workflows/showpot-dev-cd.yml b/.github/workflows/showpot-dev-cd.yml new file mode 100644 index 00000000..a14f5e0f --- /dev/null +++ b/.github/workflows/showpot-dev-cd.yml @@ -0,0 +1,102 @@ +name: ShowPot-Dev-CD + +on: + push: + branches: + - develop + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'liberica' + cache: gradle + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + + - name: Copy Secrets + env: + ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} + SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} + run: + echo $ACCESS_KEY > ./app/src/main/resources/application-dev.yml + echo $SECRET_KEY > ./app/src/main/resources/application-dev.yml + + - name: Build with Gradle Wrapper + run: ./gradlew clean build + + - name: Prepare File for Deployment + run: | + mkdir -p deployment + cp Dockerfile docker-compose.yml deployment/ + cp -r ./app/build/libs deployment/ + + - name: Get Github Actions IP + id: ip + uses: haythem/public-ip@v1.3 + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }} + aws-region: ap-northeast-2 + + - name: Add Github Actions IP on Security Group + run: | + aws ec2 authorize-security-group-ingress --group-id ${{ secrets.AWS_DEV_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32 + + - name: Upload files to EC2 + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ secrets.EC2_DEV_HOST }} + username: ec2-user + key: ${{ secrets.EC2_DEV_SSH_PRIVATE_KEY }} + source: "deployment/*" + target: "/home/ec2-user/" + + - name: Deploy using Docker Compose + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.EC2_DEV_HOST }} + username: ec2-user + key: ${{ secrets.EC2_DEV_SSH_PRIVATE_KEY }} + script: | + cd /home/ec2-user/deployment/ + docker-compose down + docker-compose up -d --build + + - name: Remove Github Actions IP from Security Group + if: always() + run: | + aws ec2 revoke-security-group-ingress --group-id ${{ secrets.AWS_DEV_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32 + + - name: Backend CD for Dev Server Discord Notification + uses: sarisia/actions-status-discord@v1 + if: success() + with: + title: ✅ 개발 서버 배포 프로세스가 완료되었습니다! ✅ + webhook: ${{ secrets.DISCORD_WEBHOOK_URL }} + content: "<@1084774841460215839> <@281597829636423682> 배포가 정상적으로 이뤄졌는지 확인해주세요!" + color: 00FF00 + username: showPot-Bot + avatar_url: ${{ secrets.DISCORD_NOTIFICATION_SUCCESS_AVATAR_URL }} + + - name: Backend CD for Dev Server Discord Notification + uses: sarisia/actions-status-discord@v1 + if: failure() + with: + title: ❗️개발 서버 배포 프로세스가 실패했습니다! ❗️ + webhook: ${{ secrets.DISCORD_WEBHOOK_URL }} + color: FF0000 + username: showPot-Bot + avatar_url: ${{ secrets.DISCORD_NOTIFICATION_FAILED_AVATAR_URL }} diff --git a/.github/workflows/showPot-dev-ci.yml b/.github/workflows/showpot-dev-ci.yml similarity index 100% rename from .github/workflows/showPot-dev-ci.yml rename to .github/workflows/showpot-dev-ci.yml diff --git a/.github/workflows/showPot-prod-ci.yml b/.github/workflows/showpot-prod-ci.yml similarity index 100% rename from .github/workflows/showPot-prod-ci.yml rename to .github/workflows/showpot-prod-ci.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..0c96825e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:21-jdk-slim +ARG JAR_FILE_PATH=libs/*.jar +COPY ${JAR_FILE_PATH} app.jar +ENTRYPOINT ["java", "-jar", "app.jar"] \ No newline at end of file diff --git a/app/api/common-api/src/main/java/org/example/config/SecurityConfig.java b/app/api/common-api/src/main/java/org/example/config/SecurityConfig.java index 5719e7bb..2b20032c 100644 --- a/app/api/common-api/src/main/java/org/example/config/SecurityConfig.java +++ b/app/api/common-api/src/main/java/org/example/config/SecurityConfig.java @@ -38,6 +38,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .authorizeHttpRequests(registry -> registry .requestMatchers( + "/health", "/swagger-ui/**", "/v3/api-docs/**", "/api/v1/users/login", "/admin/**", "/css/**", "/js/**" diff --git a/app/api/src/main/java/org/example/health/HealthController.java b/app/api/src/main/java/org/example/health/HealthController.java new file mode 100644 index 00000000..754db1e9 --- /dev/null +++ b/app/api/src/main/java/org/example/health/HealthController.java @@ -0,0 +1,17 @@ +package org.example.health; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Tag(name = "서버 상태") +public class HealthController { + + @GetMapping("/health") + @Operation(summary = "서버 상태 체크") + public String health() { + return "OK"; + } +} diff --git a/app/domain/common-domain/src/main/resources/application-domain-dev.yml b/app/domain/common-domain/src/main/resources/application-domain-dev.yml index e69de29b..2ebac146 100644 --- a/app/domain/common-domain/src/main/resources/application-domain-dev.yml +++ b/app/domain/common-domain/src/main/resources/application-domain-dev.yml @@ -0,0 +1,7 @@ +spring: + jpa: + hibernate: + ddl-auto: create + show-sql: true + open-in-view: false + generate-ddl: true \ No newline at end of file diff --git a/app/src/main/resources/application-dev.yml b/app/src/main/resources/application-dev.yml index b4eec485..dc782d94 100644 --- a/app/src/main/resources/application-dev.yml +++ b/app/src/main/resources/application-dev.yml @@ -5,7 +5,19 @@ spring: enabled: true docker: compose: - enabled: false + enabled: true + lifecycle-management: start_and_stop + stop: + command: down + timeout: 1m + security: + user: + name: user + password: password + data: + redis: + host: localhost + port: 6379 cloud: aws: diff --git a/docker-compose.yml b/docker-compose.yml index 005bf304..2d7585f5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,19 +1,43 @@ -version: '3' - services: postgresql: container_name: yapp_postgresql image: postgres:14 environment: - - 'POSTGRES_DATABASE=yapp' - - 'POSTGRES_USER=local' - - 'POSTGRES_PASSWORD=local' + POSTGRES_DB: yapp + POSTGRES_USER: yapp + POSTGRES_PASSWORD: yapp ports: - - '5432' + - '5432:5432' restart: always + networks: + - app-network redis: container_name: yapp_redis image: redis:alpine ports: - - '6379:6379' \ No newline at end of file + - '6379:6379' + networks: + - app-network + + app: + image: yapp + build: + context: . + dockerfile: Dockerfile + environment: + SPRING_DATASOURCE_URL: jdbc:postgresql://postgresql:5432/yapp + SPRING_DATASOURCE_USERNAME: yapp + SPRING_DATASOURCE_PASSWORD: yapp + SPRING_REDIS_HOST: redis + SPRING_REDIS_PORT: 6379 + ports: + - '8080:8080' + depends_on: + - postgresql + - redis + networks: + - app-network + +networks: + app-network: \ No newline at end of file diff --git a/start-develop.sh b/start-develop.sh new file mode 100644 index 00000000..6f36b7ad --- /dev/null +++ b/start-develop.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Git 리포지토리에서 최신 코드를 가져옵니다. +git pull origin develop + +# 애플리케이션 빌드 +./gradlew app:build + +# Docker Compose를 사용하여 컨테이너 실행 +docker-compose down +docker-compose up -d --build \ No newline at end of file