diff --git a/.github/workflows/cd-develop.yml b/.github/workflows/cd-develop.yml new file mode 100644 index 00000000..88df35e1 --- /dev/null +++ b/.github/workflows/cd-develop.yml @@ -0,0 +1,92 @@ +name: Java CI with Gradle + +on: + push: + branches: [ "develop" ] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Set up JDK 17 (JDK 17 설정) + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: '17' + + - name: Create application.properties from git secret (application.properties 파일 생성) + run: | + mkdir -p default/src/main/resources + mkdir -p chat/src/main/resources + echo "$APPLICATION_DEFAULT" > default/src/main/resources/application.properties + echo "$APPLICATION_CHAT" > chat/src/main/resources/application.properties + env: + APPLICATION_DEFAULT: ${{ secrets.APPLICATION_DEFAULT }} + APPLICATION_CHAT: ${{ secrets.APPLICATION_CHAT }} + + - name: Grant execute permission to Gradle (Gradle 실행 권한 부여) + run: | + chmod +x ./default/gradlew + chmod +x ./chat/gradlew + +# - name: Detect Changes (변경된 파일 감지) +# id: changed-files +# run: | +# git fetch origin develop --depth=1 +# CHANGED_FILES=$(git diff --name-only origin/develop HEAD) +# +# echo "Changed files: $CHANGED_FILES" +# +# if echo "$CHANGED_FILES" | grep -q '^default/'; then +# echo "DEFAULT_CHANGED=true" >> $GITHUB_ENV +# fi +# +# if echo "$CHANGED_FILES" | grep -q '^chat/'; then +# echo "CHAT_CHANGED=true" >> $GITHUB_ENV +# fi + + - name: Build JAR (JAR 빌드) + run: | + ./default/gradlew bootJar + ./chat/gradlew bootJar + + # CR_PAT: Container Registry - Personal Access Token + - name: GitHub Container Registry login (GitHub Container Registry 로그인) + run: | + export CR_PAT=${{ secrets.SOUNDLINK_TOKEN }} + echo $CR_PAT | docker login ghcr.io -u ${{ secrets.GIT_ID }} --password-stdin + + - name: Docker build & push (Default) + run: | + TAG=$(git rev-parse --short HEAD) + DOCKER_IMAGE_DEFAULT=ghcr.io/${{ secrets.GIT_ID }}/soundlink_default:$TAG + docker build -t soundlink_default -f ./docker/default.Dockerfile . + docker tag soundlink_default $DOCKER_IMAGE_DEFAULT + docker push $DOCKER_IMAGE_DEFAULT + + - name: Docker build & push (Chat) + run: | + TAG=$(git rev-parse --short HEAD) + DOCKER_IMAGE_CHAT=ghcr.io/${{ secrets.GIT_ID }}/soundlink_chat:$TAG + docker build -t soundlink_chat -f ./docker//chat.Dockerfile . + docker tag soundlink_chat $DOCKER_IMAGE_CHAT + docker push $DOCKER_IMAGE_CHAT + + - name: Deploy to Linux Server (리눅스 서버 배포) + uses: appleboy/ssh-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.PRIVATE_KEY }} + port: ${{ secrets.PORT }} + script: | + cd /home/ubuntu/docker + sudo docker-compose down spring + sudo docker-compose pull spring + sudo docker-compose up -d spring + sudo docker-compose down spring_chat + sudo docker-compose pull spring_chat + sudo docker-compose up -d spring_chat \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/ci-test.yml similarity index 80% rename from .github/workflows/test.yml rename to .github/workflows/ci-test.yml index f354566b..7c5de55b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/ci-test.yml @@ -38,7 +38,13 @@ jobs: chmod +x ./default/gradlew chmod +x ./chat/gradlew - - name: Run tests (테스트 실행) + - name: Run tests - default server (디폴트 서버 테스트 실행) run: | - ./default/gradlew test - ./chat/gradlew test \ No newline at end of file + cd default + ./gradlew test + cd .. + + - name: Run tests - chat server (채팅 서버 테스트 실행) + run: | + cd chat + ./gradlew test \ No newline at end of file diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml deleted file mode 100644 index d68c056c..00000000 --- a/.github/workflows/gradle.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Java CI with Gradle - -on: - push: - branches: [ "develop" ] - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - - ## 원격 서버에서 docker-compose 실행 - - name: Build and Run Docker on Server - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.HOST }} - username: ${{ secrets.USERNAME }} - key: ${{ secrets.PRIVATE_KEY }} - port: ${{ secrets.PORT }} - script: | - # 최신 코드 가져오기 - cd /home/ubuntu/server - git pull origin develop - - # application.properties 새로 생성 - touch ./src/main/resources/application.properties - echo "${{ secrets.APPLICATION }}" | sudo tee ./src/main/resources/application.properties > /dev/null - - # 🔹 JAR 빌드 (서버에서 실행) - ./gradlew bootJar - - # 파일명 변경 - mv /home/ubuntu/server/build/libs/SoundLink_Java-0.0.1-SNAPSHOT.jar /home/ubuntu/docker/soundlink.jar - - cd /home/ubuntu/docker - - # 기존 Spring 컨테이너 중지 및 제거 - sudo docker-compose stop spring - sudo docker-compose rm -f spring - - # Spring 컨테이너만 다시 빌드 & 실행 - docker-compose up --build -d spring - sudo docker-compose up -d spring - - # 불필요한 이미지 정리 - sudo docker image prune -f \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index abfad51a..00000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Java CI with Gradle - -on: - push: - branches: [ "dev" ] - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - - ## 원격 서버에서 docker-compose 실행 - - name: Build and Run Docker on Server - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.HOST }} - username: ${{ secrets.USERNAME }} - key: ${{ secrets.PRIVATE_KEY }} - port: ${{ secrets.PORT }} - script: | - # 최신 코드 가져오기 - cd /home/ubuntu/chat - git pull origin dev - - # application.properties 새로 생성 - touch ./src/main/resources/application.properties - echo "${{ secrets.APPLICATION }}" | sudo tee ./src/main/resources/application.properties > /dev/null - - # 🔹 JAR 빌드 (서버에서 실행) - ./gradlew bootJar - - # 파일명 변경 - mv /home/ubuntu/chat/build/libs/SoundLinkChat_Java-0.0.1-SNAPSHOT.jar /home/ubuntu/docker/soundlink.jar - - cd /home/ubuntu/docker - - # 기존 Spring 컨테이너 중지 및 제거 - sudo docker-compose stop spring_chat - sudo docker-compose rm -f spring_chat - - # Spring 컨테이너만 다시 빌드 & 실행 - docker-compose up --build -d spring_chat - sudo docker-compose up -d spring_chat - - # 불필요한 이미지 정리 - sudo docker image prune -f diff --git a/.gitignore b/.gitignore index 2c97edbe..86f29485 100644 --- a/.gitignore +++ b/.gitignore @@ -37,8 +37,10 @@ out/ .vscode/ ### yml & properties ### -*.yml -*.properties +chat/**/*.yml +default/**/*.yml +chat/src/main/resources/application.properties +default/src/main/resources/application.properties ### 폴더 추가 default/src/main/generated diff --git a/default/README.md b/README.md similarity index 100% rename from default/README.md rename to README.md diff --git a/chat/gradle/wrapper/gradle-wrapper.jar b/chat/gradle/wrapper/gradle-wrapper.jar index a4b76b95..9bbc975c 100644 Binary files a/chat/gradle/wrapper/gradle-wrapper.jar and b/chat/gradle/wrapper/gradle-wrapper.jar differ diff --git a/chat/gradle/wrapper/gradle-wrapper.properties b/chat/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..37f853b1 --- /dev/null +++ b/chat/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/chat/gradlew b/chat/gradlew index f5feea6d..faf93008 100755 --- a/chat/gradlew +++ b/chat/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/chat/src/main/resources/htmlFile/test.html b/chat/src/main/resources/htmlFile/test.html deleted file mode 100644 index b5e32e61..00000000 --- a/chat/src/main/resources/htmlFile/test.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - SoundLink 채팅 - - - - - - - - - -
- SoundLink 채팅 데모 -
- -
-
웹소켓 연결 관리
-
- - -
- -
- -
채팅 입력
-
- - -
- -
채팅 로그
-
- -
-
- - - - - \ No newline at end of file diff --git a/chat/src/main/resources/htmlFile/test2.html b/chat/src/main/resources/htmlFile/test2.html deleted file mode 100644 index 82eb2a1a..00000000 --- a/chat/src/main/resources/htmlFile/test2.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - SoundLink 채팅 - - - - - - - - - -
- SoundLink 채팅 데모 -
- -
-
웹소켓 연결 관리
-
- - -
- -
- -
채팅 입력
-
- - -
- -
채팅 로그
-
- -
-
- - - - - \ No newline at end of file diff --git a/default/gradle/wrapper/gradle-wrapper.properties b/default/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e18bc253 --- /dev/null +++ b/default/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/default/src/main/java/org/dfbf/soundlink/global/kafka/KafkaConsumer.java b/default/src/main/java/org/dfbf/soundlink/global/kafka/KafkaConsumer.java index b405ac4b..dd020563 100644 --- a/default/src/main/java/org/dfbf/soundlink/global/kafka/KafkaConsumer.java +++ b/default/src/main/java/org/dfbf/soundlink/global/kafka/KafkaConsumer.java @@ -20,29 +20,29 @@ @RequiredArgsConstructor public class KafkaConsumer { - private final AlertService alertService; - private final AlertRepository alertRepository; - private final RedisTemplate redisTemplate; - - private final ObjectMapper mapper = new ObjectMapper(); - - // KafkaListener annotation을 통해 메시지를 수신함 - @KafkaListener(topics = "alert-topic", groupId = "alert-service") - public void updateQty(String kafkaMessage) { - log.info("Kafka Message: -> {}", kafkaMessage); - - try { - Alert alert = mapper.readValue(kafkaMessage, Alert.class); +// private final AlertService alertService; +// private final AlertRepository alertRepository; +// private final RedisTemplate redisTemplate; +// +// private final ObjectMapper mapper = new ObjectMapper(); +// +// // KafkaListener annotation을 통해 메시지를 수신함 +// @KafkaListener(topics = "alert-topic", groupId = "alert-service") +// public void updateQty(String kafkaMessage) { +// log.info("Kafka Message: -> {}", kafkaMessage); // -// if (alertRepository.getEmitterId(alert.getUserId()).isPresent()) { -// log.info("알림 전송: {}", alert.getUserId()); -// alertService.send(alert.getUserId(), alert.getType(), alert.getData()); -// } else { -// //redisTemplate.opsForValue().set("alert:" + alert.getEventId(), alert, 10, TimeUnit.MINUTES); -// log.info("No SSE connection for user {}.", alert.getUserId()); -// } - } catch (JsonProcessingException e) { - log.error("JSON parsing error: {}", e.getMessage()); - } - } +// try { +// Alert alert = mapper.readValue(kafkaMessage, Alert.class); +//// +//// if (alertRepository.getEmitterId(alert.getUserId()).isPresent()) { +//// log.info("알림 전송: {}", alert.getUserId()); +//// alertService.send(alert.getUserId(), alert.getType(), alert.getData()); +//// } else { +//// //redisTemplate.opsForValue().set("alert:" + alert.getEventId(), alert, 10, TimeUnit.MINUTES); +//// log.info("No SSE connection for user {}.", alert.getUserId()); +//// } +// } catch (JsonProcessingException e) { +// log.error("JSON parsing error: {}", e.getMessage()); +// } +// } } diff --git a/default/src/main/java/org/dfbf/soundlink/global/kafka/KafkaProducer.java b/default/src/main/java/org/dfbf/soundlink/global/kafka/KafkaProducer.java index f74cacd7..f1c65abf 100644 --- a/default/src/main/java/org/dfbf/soundlink/global/kafka/KafkaProducer.java +++ b/default/src/main/java/org/dfbf/soundlink/global/kafka/KafkaProducer.java @@ -13,21 +13,21 @@ @RequiredArgsConstructor public class KafkaProducer { - private final KafkaTemplate kafkaTemplate; - private final ObjectMapper mapper = new ObjectMapper(); - - // 주어진 주제(topic)로 OrderDto 객체를 Kafka 메시지로 전송하고, 전송한 OrderDto 객체를 반환하는 메서드 - public Alert send(String topic, Alert alert) { - String jsonInstring = ""; - - try { - jsonInstring = mapper.writeValueAsString(alert); // OrderDto 객체를 JSON 문자열로 변환 - } catch (JsonProcessingException e) { - log.info(e.getMessage()); - } - - kafkaTemplate.send(topic, jsonInstring); // KafkaTemplate을 사용하여 Kafka 메시지를 보냄 - - return alert; // 전송한 OrderDto 객체를 반환 - } +// private final KafkaTemplate kafkaTemplate; +// private final ObjectMapper mapper = new ObjectMapper(); +// +// // 주어진 주제(topic)로 OrderDto 객체를 Kafka 메시지로 전송하고, 전송한 OrderDto 객체를 반환하는 메서드 +// public Alert send(String topic, Alert alert) { +// String jsonInstring = ""; +// +// try { +// jsonInstring = mapper.writeValueAsString(alert); // OrderDto 객체를 JSON 문자열로 변환 +// } catch (JsonProcessingException e) { +// log.info(e.getMessage()); +// } +// +// kafkaTemplate.send(topic, jsonInstring); // KafkaTemplate을 사용하여 Kafka 메시지를 보냄 +// +// return alert; // 전송한 OrderDto 객체를 반환 +// } } diff --git a/docker/chat.Dockerfile b/docker/chat.Dockerfile new file mode 100644 index 00000000..07457dd4 --- /dev/null +++ b/docker/chat.Dockerfile @@ -0,0 +1,11 @@ +# Start with a base image containing Java runtime +FROM openjdk:17-jdk-slim + +# The application's jar file +ARG JAR_FILE=../chat/build/libs/SoundLinkChat_Java-0.0.1-SNAPSHOT.jar + +# Add the application's jar to the container +COPY ${JAR_FILE} app.jar + +# Run the jar file +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/docker/default.Dockerfile b/docker/default.Dockerfile new file mode 100644 index 00000000..dadf6454 --- /dev/null +++ b/docker/default.Dockerfile @@ -0,0 +1,11 @@ +# Start with a base image containing Java runtime +FROM openjdk:17-jdk-slim + +# The application's jar file +ARG JAR_FILE=../chat/build/libs/SoundLink_Java-0.0.1-SNAPSHOT + +# Add the application's jar to the container +COPY ${JAR_FILE} app.jar + +# Run the jar file +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file