From cd98f6b5f529062d7170806d9f8badcc64eb1f7d Mon Sep 17 00:00:00 2001 From: HoKirby Date: Thu, 24 Apr 2025 20:44:55 +0900 Subject: [PATCH 1/6] =?UTF-8?q?fix:=20ci=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=97=90=EB=9F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_test.yml | 7 +- .../ililbooks/IlilBooksApplication.java | 2 + src/main/resources/application-docker.yml | 2 +- src/main/resources/application.yml | 2 +- .../book/BookStockOptimisticLockTest.java | 115 ------------------ .../controller/AuthKakaoControllerTest.java | 53 -------- src/test/resources/application-test.yml | 13 -- 7 files changed, 7 insertions(+), 187 deletions(-) delete mode 100644 src/test/java/com/example/ililbooks/concurrency/book/BookStockOptimisticLockTest.java delete mode 100644 src/test/java/com/example/ililbooks/domain/auth/kakao/controller/AuthKakaoControllerTest.java delete mode 100644 src/test/resources/application-test.yml diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 3f02da14..154f115d 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -4,7 +4,7 @@ on: push: branches: - dev - # - feat/ci_cd # 테스트 용 +# - feat/ci_cd # 테스트용 pull_request: branches: @@ -12,7 +12,6 @@ on: types: - closed - jobs: test: name: Run Tests @@ -45,7 +44,7 @@ jobs: notify: name: Send Notification - needs: test # job + needs: test runs-on: ubuntu-latest steps: @@ -54,4 +53,4 @@ jobs: env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} SLACK_MESSAGE: "build and run test 완료하였습니다" - if: always() + if: always() \ No newline at end of file diff --git a/src/main/java/com/example/ililbooks/IlilBooksApplication.java b/src/main/java/com/example/ililbooks/IlilBooksApplication.java index 16322acb..3b441866 100644 --- a/src/main/java/com/example/ililbooks/IlilBooksApplication.java +++ b/src/main/java/com/example/ililbooks/IlilBooksApplication.java @@ -4,10 +4,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; import org.springframework.data.web.config.EnableSpringDataWebSupport; +import org.springframework.scheduling.annotation.EnableScheduling; import static org.springframework.data.web.config.EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO; @SpringBootApplication +@EnableScheduling @EnableSpringDataWebSupport(pageSerializationMode = VIA_DTO) @EnableElasticsearchRepositories(basePackages = "com.example.ililbooks.domain.search.repository") public class IlilBooksApplication { diff --git a/src/main/resources/application-docker.yml b/src/main/resources/application-docker.yml index b14d0462..3fca301c 100644 --- a/src/main/resources/application-docker.yml +++ b/src/main/resources/application-docker.yml @@ -1,5 +1,5 @@ server: - port: 8080 + port: 8081 servlet: context-path: / encoding: diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3a23c72b..0d242be2 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 8081 + port: 8080 servlet: context-path: / encoding: diff --git a/src/test/java/com/example/ililbooks/concurrency/book/BookStockOptimisticLockTest.java b/src/test/java/com/example/ililbooks/concurrency/book/BookStockOptimisticLockTest.java deleted file mode 100644 index ae3bcb6c..00000000 --- a/src/test/java/com/example/ililbooks/concurrency/book/BookStockOptimisticLockTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.example.ililbooks.concurrency.book; - -import com.example.ililbooks.domain.book.entity.Book; -import com.example.ililbooks.domain.book.enums.LimitedType; -import com.example.ililbooks.domain.book.enums.SaleStatus; -import com.example.ililbooks.domain.book.repository.BookRepository; -import com.example.ililbooks.domain.book.service.BookStockService; -import com.example.ililbooks.domain.user.entity.Users; -import com.example.ililbooks.domain.user.enums.UserRole; -import com.example.ililbooks.domain.user.repository.UserRepository; -import com.example.ililbooks.global.exception.BadRequestException; -import jakarta.persistence.OptimisticLockException; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Profile; -import org.springframework.orm.ObjectOptimisticLockingFailureException; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicInteger; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -@ActiveProfiles("test") -@SpringBootTest -class BookStockOptimisticLockTest { - - @Autowired - private BookStockService bookStockService; - - @Autowired - private BookRepository bookRepository; - - @Autowired - private UserRepository userRepository; - - private Long bookId; - private Book book; - private Users adminUsers; - - @BeforeEach - public void setup() { - adminUsers = Users.builder() - .email("admin@email.com") - .nickname("adminNickname") - .userRole(UserRole.ROLE_ADMIN) - .build(); - - adminUsers = userRepository.save(adminUsers); - - book = Book.builder() - .title("book1") - .users(adminUsers) - .stock(100) - .price(new BigDecimal(20000)) - .publisher("publisher1") - .saleStatus(SaleStatus.ON_SALE) - .limitedType(LimitedType.REGULAR) - .build(); - - book = bookRepository.save(book); - bookId = book.getId(); - } - - @Test - void 동시에_재고감소_요청_시_낙관적락_충돌_발생() throws InterruptedException { - int threadCount = 100; - ExecutorService executorService = Executors.newFixedThreadPool(10); - CountDownLatch latch = new CountDownLatch(threadCount); - AtomicInteger optimisticLockFailures = new AtomicInteger(); - AtomicInteger badRequestExceptions = new AtomicInteger(); // 추가: BadRequestException 카운터 - - for (int i = 0; i < threadCount; i++) { - executorService.submit(() -> { - try { - runInNewTransaction(() -> bookStockService.decreaseStock(bookId, 1)); - } catch (ObjectOptimisticLockingFailureException | OptimisticLockException e) { - optimisticLockFailures.incrementAndGet(); // 낙관적 락 충돌 - } catch (BadRequestException e) { - badRequestExceptions.incrementAndGet(); // 추가: 재고 부족 또는 recover에서 throw된 경우 - } finally { - latch.countDown(); - } - }); - } - - latch.await(); - executorService.shutdown(); - - Book book = bookRepository.findById(bookId).orElseThrow(); - int finalStock = book.getStock(); - int totalSuccess = threadCount - optimisticLockFailures.get() - badRequestExceptions.get(); - - System.out.println("낙관적 락 실패 횟수: " + optimisticLockFailures.get()); - System.out.println("BadRequestException 발생 횟수: " + badRequestExceptions.get()); - System.out.println("최종 재고: " + finalStock); - System.out.println("성공 요청 수: " + totalSuccess); - - assertEquals(100, totalSuccess + optimisticLockFailures.get() + badRequestExceptions.get()); - assertTrue(optimisticLockFailures.get() > 0 || badRequestExceptions.get() > 0); - } - - @Transactional(propagation = Propagation.REQUIRES_NEW) - public void runInNewTransaction(Runnable runnable) { - runnable.run(); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/ililbooks/domain/auth/kakao/controller/AuthKakaoControllerTest.java b/src/test/java/com/example/ililbooks/domain/auth/kakao/controller/AuthKakaoControllerTest.java deleted file mode 100644 index 25ee90bf..00000000 --- a/src/test/java/com/example/ililbooks/domain/auth/kakao/controller/AuthKakaoControllerTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.example.ililbooks.domain.auth.kakao.controller; - -import com.example.ililbooks.client.kakao.dto.AuthKakaoTokenResponse; -import com.example.ililbooks.domain.auth.kakao.service.AuthKakaoService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.bean.override.mockito.MockitoBean; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@SpringBootTest -@AutoConfigureMockMvc -class AuthKakaoControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockitoBean - private AuthKakaoService authKakaoService; - - private final String accessToken = "access-token"; - private final String refreshToken = "refresh-token"; - - @Test - void 카카오_로그인_성공시_refreshToken은_쿠키에만_저장된다() throws Exception { - // given - AuthKakaoTokenResponse responseDto = new AuthKakaoTokenResponse(accessToken, refreshToken); - - given(authKakaoService.signIn(anyString())) - .willReturn(responseDto); - - // when - MvcResult result = mockMvc.perform(get("/api/v1/auth/kakao/token") - .param("code", "dummy-code")) - .andExpect(status().isOk()) - .andReturn(); - - // then - String setCookie = result.getResponse().getHeader("Set-Cookie"); - assertThat(setCookie).isNotNull(); - assertThat(setCookie).contains("refreshToken="); - assertThat(setCookie).contains("HttpOnly"); - assertThat(setCookie).contains("Path=/"); - } -} \ No newline at end of file diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml deleted file mode 100644 index 45746d3d..00000000 --- a/src/test/resources/application-test.yml +++ /dev/null @@ -1,13 +0,0 @@ -spring: - datasource: - url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE - driver-class-name: org.h2.Driver - username: sa - password: - jpa: - hibernate: - ddl-auto: create-drop - show-sql: true - properties: - hibernate: - dialect: org.hibernate.dialect.H2Dialect \ No newline at end of file From cf8c983c7cb48aaaa360fb39c8dcd3c74c32969e Mon Sep 17 00:00:00 2001 From: Hokirby Date: Thu, 24 Apr 2025 23:01:17 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20coverage=20=EB=AF=B8=EB=8B=AC=20?= =?UTF-8?q?=EC=8B=9C=20PR=20=EB=B0=98=EB=A0=A4=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 154f115d..dc1c13f5 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -32,8 +32,8 @@ jobs: - name: Give permission to gradlew run: chmod +x ./gradlew - - name: Run tests with coverage - run: ./gradlew clean test jacocoTestReport + - name: Run tests with coverage verification + run: ./gradlew clean testCoverage - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v5 @@ -53,4 +53,4 @@ jobs: env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} SLACK_MESSAGE: "build and run test 완료하였습니다" - if: always() \ No newline at end of file + if: always() From 292223dba751249dbc2e8e626972fc9a1a5893be Mon Sep 17 00:00:00 2001 From: HoKirby Date: Sun, 4 May 2025 15:20:25 +0900 Subject: [PATCH 3/6] =?UTF-8?q?chore:=20=EA=B0=84=EB=8B=A8=ED=95=9C=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .docker/docker-compose-override.yml | 26 -------------------- .docker/docker-compose.yml | 15 ------------ .github/workflows/deploy.yml | 16 ------------ Dockerfile | 7 ++---- docker-compose.yml | 38 +---------------------------- 5 files changed, 3 insertions(+), 99 deletions(-) delete mode 100644 .docker/docker-compose-override.yml delete mode 100644 .docker/docker-compose.yml diff --git a/.docker/docker-compose-override.yml b/.docker/docker-compose-override.yml deleted file mode 100644 index 5777a6a8..00000000 --- a/.docker/docker-compose-override.yml +++ /dev/null @@ -1,26 +0,0 @@ -services: - ilildb: - image: mysql:8.0 - container_name: ilildb - environment: - MYSQL_DATABASE: ${DOCKER_MYSQL_DATABASE} - MYSQL_ROOT_PASSWORD: ${DOCKER_MYSQL_PASSWORD} - ports: - - 3306:3306 - volumes: - - ./mysql_data:/var/lib/mysql - - ililBooks: - build: .. - container_name: ililBooks - ports: - - 8080:8080 - environment: - - SPRING_DATASOURCE_URL=${DB_URL} - - SPRING_DATASOURCE_USERNAME=${DB_USER} - - SPRING_DATASOURCE_PASSWORD=${DB_PASSWORD} - depends_on: - ilildb: - condition: service_healthy - volumes: - - ./mysql_data:/var/lib/mysql diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml deleted file mode 100644 index 91d82ed4..00000000 --- a/.docker/docker-compose.yml +++ /dev/null @@ -1,15 +0,0 @@ -services: - ililBooks: - build: .. - container_name: ililBooks - ports: - - 8080:8080 - environment: - - SPRING_DATASOURCE_URL=${DOCKER_MYSQL_URL} - - SPRING_DATASOURCE_USERNAME=${DOCKER_MYSQL_USER} - - SPRING_DATASOURCE_PASSWORD=${DOCKER_MYSQL_PASSWORD} - depends_on: - ilildb: - condition: service_healthy - volumes: - - ./mysql_data:/var/lib/mysql \ No newline at end of file diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2f43f8af..055953e3 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -12,8 +12,6 @@ jobs: env: AWS_REGION: ${{ secrets.AWS_REGION }} IMAGE_TAG: ${{ github.sha }} - # ECR_REGISTRY: ${{ secrets.ECR_REGISTRY }} - # IMAGE_URI: ${{ secrets.ECR_REGISTRY }}/${{ secrets.ECR_REPOSITORY }}:${{ github.sha }} steps: - name: Checkout code @@ -38,20 +36,6 @@ jobs: docker build -t $IMAGE_URI . docker push $IMAGE_URI - - name: Render task definition using sed - run: sed "s|__IMAGE_URI__|${{ env.IMAGE_URI }}|g" ecs-task-def-template.json > ecs-task-def.json - -# - name: debug task definition -# run: cat ecs-task-def.json # 디버그용 - - - name: Render updated task definition - id: render-task-def - uses: aws-actions/amazon-ecs-render-task-definition@v1 - with: - task-definition: ecs-task-def.json - container-name: ilil-books-app - image: ${{ env.IMAGE_URI }} - - name: Deploy to ECS uses: aws-actions/amazon-ecs-deploy-task-definition@v1 with: diff --git a/Dockerfile b/Dockerfile index 52e2671a..a6356055 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,3 @@ -# TODO 전승민 dockerfile # Build 스테이지 FROM gradle:8.10.2-jdk17 AS builder # 작업 디렉토리 설정 @@ -7,7 +6,8 @@ WORKDIR /apps COPY . /apps # 어플리케이션 빌드 RUN chmod +x gradlew -RUN ./gradlew build -x test # 테스트용 +RUN ./gradlew build + # 실행 스테이지 # OpenJDK 17 slim 기반 이미지 사용 FROM amazoncorretto:17.0.12 @@ -17,9 +17,6 @@ LABEL type="application" WORKDIR /apps # 애플리케이션 jar 파일을 컨테이너로 복사 COPY --from=builder /apps/build/libs/ilil-books-0.0.1-SNAPSHOT.jar /apps/app.jar -#COPY wait-for-it.sh /apps/wait-for-it.sh -#RUN chmod +x /apps/wait-for-it.sh - # 애플리케이션이 사용할 포트 노출 EXPOSE 8081 # 애플리케이션을 실행하기 위한 엔트리포인트 정의 diff --git a/docker-compose.yml b/docker-compose.yml index d773d077..c4ff13f7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,41 +1,6 @@ version: '3.8' services: -# app: -# build: -# context: . -# dockerfile: Dockerfile -# container_name: ililBooks -# ports: -# - "8081:8081" -# depends_on: -## - db -## - elasticsearch -## - redis -# elasticsearch: -# condition: service_healthy -# db: -# condition: service_healthy -# redis: -# condition: service_started -# environment: -# - SPRING_DATASOURCE_URL=${DB_URL_DOCKER} -# - SPRING_DATASOURCE_USERNAME=${DB_USER} -# - SPRING_DATASOURCE_PASSWORD=${DB_PASSWORD} -# - JWT_SECRET_KEY=${JWT_SECRET_KEY} -# - BOOK_API_KEY=${BOOK_API_KEY} -# - SPRING_PROFILES_ACTIVE=docker -# - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} # 추가 -# - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} # 추가 -# - AWS_S3_BUCKET_NAME=${AWS_S3_BUCKET_NAME} # 추가 -# - AWS_REGION=${AWS_REGION} -# networks: -# - esnet -# -# env_file: -# - .env # .env 파일 로드 - - db: image: mysql:8.0 container_name: mysql-db @@ -59,11 +24,10 @@ services: container_name: redis ports: - "6379:6379" -# command: redis-server --requirepass ${REDIS_PASSWORD} networks: - esnet healthcheck: - test: [ "CMD", "redis-cli", "-a", "ping" ] # ${REDIS_PASSWORD}" + test: [ "CMD", "redis-cli", "-a", "ping" ] interval: 10s timeout: 5s retries: 5 From 3f91e210dd8d7cdde6b442295bc49f3412f0fbf2 Mon Sep 17 00:00:00 2001 From: HoKirby Date: Sun, 4 May 2025 15:46:23 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20cd=20=ED=8C=8C=EC=9D=B4=ED=94=84?= =?UTF-8?q?=EB=9D=BC=EC=9D=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitHub/build Docker image -> ECR -> S3 -> Elastic Beanstalk -> EC2 --- .github/workflows/deploy.yml | 31 ++++++++++++++++++++++++------- Dockerrun.aws.json | 12 ++++++++++++ ecs-task-def-template.json | 28 ---------------------------- scripts/start.sh | 16 ---------------- 4 files changed, 36 insertions(+), 51 deletions(-) create mode 100644 Dockerrun.aws.json delete mode 100644 ecs-task-def-template.json delete mode 100644 scripts/start.sh diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 055953e3..00a6b24a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -12,6 +12,7 @@ jobs: env: AWS_REGION: ${{ secrets.AWS_REGION }} IMAGE_TAG: ${{ github.sha }} + VERSION_LABEL: v-${{ github.run_number }} steps: - name: Checkout code @@ -36,13 +37,29 @@ jobs: docker build -t $IMAGE_URI . docker push $IMAGE_URI - - name: Deploy to ECS - uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - with: - task-definition: ecs-task-def.json - service: ililbooks-service - cluster: ilil-books - wait-for-service-stability: true + - name: Replace image URI in Dockerrun.aws.json + run: | + sed -i "s|__IMAGE_URI__|${{ secrets.ECR_REGISTRY }}/${{ secrets.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}|g" Dockerrun.aws.json + + - name: Zip deployment package + run: zip deploy.zip Dockerrun.aws.json + + - name: Upload to S3 + run: | + aws s3 cp deploy.zip s3://${{ secrets.AWS_S3_BUCKET_NAME }}/deploy-${{ github.run_number }}.zip + + - name: Create new application version + run: | + aws elasticbeanstalk create-application-version \ + --application-name ${{ secrets.EB_APP_NAME }} \ + --version-label ${{ env.VERSION_LABEL }} \ + --source-bundle S3Bucket=${{ secrets.AWS_S3_BUCKET_NAME }},S3Key=deploy-${{ github.run_number }}.zip + + - name: Deploy to Elastic Beanstalk + run: | + aws elasticbeanstalk update-environment \ + --environment-name ${{ secrets.EB_ENV_NAME }} \ + --version-label ${{ env.VERSION_LABEL }} - name: Notify via Slack uses: rtCamp/action-slack-notify@v2 diff --git a/Dockerrun.aws.json b/Dockerrun.aws.json new file mode 100644 index 00000000..b541b7de --- /dev/null +++ b/Dockerrun.aws.json @@ -0,0 +1,12 @@ +{ + "AWSEBDockerrunVersion": "1", + "Image": { + "Name": "__IMAGE_URI__", + "Update": "true" + }, + "Ports": [ + { + "ContainerPort": 8081 + } + ] +} \ No newline at end of file diff --git a/ecs-task-def-template.json b/ecs-task-def-template.json deleted file mode 100644 index 4f31bc29..00000000 --- a/ecs-task-def-template.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "family": "ililbooks-task", - "networkMode": "awsvpc", - "executionRoleArn": "arn:aws:iam::198109037411:role/ecsTaskExecutionRole", - "requiresCompatibilities": [ - "FARGATE" - ], - "cpu": "512", - "memory": "1024", - "containerDefinitions": [ - { - "name": "ilil-books-app", - "image": "__IMAGE_URI__", - "portMappings": [ - { - "containerPort": 8081 - } - ], - "essential": true, - "environment": [ - { - "name": "SPRING_PROFILES_ACTIVE", - "value": "docker" - } - ] - } - ] -} \ No newline at end of file diff --git a/scripts/start.sh b/scripts/start.sh deleted file mode 100644 index 058698f4..00000000 --- a/scripts/start.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -APP_NAME=my-app -JAR_NAME=$(ls /home/ec2-user/app/*.jar | head -n 1) -LOG_FILE=/home/ec2-user/app/logs/$APP_NAME.log -PID_FILE=/home/ec2-user/app/$APP_NAME.pid - -echo "> Starting $JAR_NAME" - -# 백그라운드로 Spring Boot 앱 실행 -nohup java -jar "$JAR_NAME" > "$LOG_FILE" 2>&1 & - -# PID 저장 -echo $! > "$PID_FILE" - -echo "> Application started with PID $(cat $PID_FILE)" \ No newline at end of file From a8ca6455eeebf21486aa7dee3f9253db5d64d6a8 Mon Sep 17 00:00:00 2001 From: HoKirby Date: Sun, 4 May 2025 16:10:09 +0900 Subject: [PATCH 5/6] fix: resolve conflicts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @EnableScheduling 중복되어 삭제 --- src/main/java/com/example/ililbooks/IlilBooksApplication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/example/ililbooks/IlilBooksApplication.java b/src/main/java/com/example/ililbooks/IlilBooksApplication.java index d17e1075..3b441866 100644 --- a/src/main/java/com/example/ililbooks/IlilBooksApplication.java +++ b/src/main/java/com/example/ililbooks/IlilBooksApplication.java @@ -12,7 +12,6 @@ @EnableScheduling @EnableSpringDataWebSupport(pageSerializationMode = VIA_DTO) @EnableElasticsearchRepositories(basePackages = "com.example.ililbooks.domain.search.repository") -@EnableScheduling public class IlilBooksApplication { public static void main(String[] args) { SpringApplication.run(IlilBooksApplication.class, args); From de5ca33e952d5bd2b71197f7e31da96269edd19f Mon Sep 17 00:00:00 2001 From: HoKirby Date: Sun, 4 May 2025 16:45:54 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=20chore:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=ED=95=B4=20=EA=B4=80=EB=A0=A8=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 00a6b24a..98681717 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -4,7 +4,6 @@ on: push: branches: - main -# - feat/ci_cd # 테스트 jobs: deploy: