Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ff22a09
โœจ Feat : CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ Docker ์„ค์ • ์ถ”๊ฐ€
hyeonda02 Jan 19, 2025
839171f
๐Ÿš€ Deploy : CICD.yml ์ˆ˜์ •
hyeonda02 Jan 19, 2025
38a961f
Merge pull request #3 from capgoing/feature/cicd-workflows
hyeonda02 Jan 19, 2025
3449c9e
๐Ÿ‘ท CICD : CICD.yml ์ˆ˜์ •
hyeonda02 Jan 19, 2025
ee034c3
Merge pull request #4 from capgoing/feature/cicd-workflows
hyeonda02 Jan 19, 2025
46c55e5
๐Ÿ‘ท CICD : CICD.yml ์ˆ˜์ •
hyeonda02 Jan 19, 2025
f8ae70a
Merge pull request #5 from capgoing/feature/cicd-workflows
hyeonda02 Jan 19, 2025
eaf6d21
๐Ÿ‘ท CICD : CICD.yml ์ˆ˜์ •
hyeonda02 Jan 19, 2025
460cb75
Merge pull request #6 from capgoing/feature/cicd-workflows
hyeonda02 Jan 19, 2025
5fa1072
โœจ Feat : FastAPI ์„œ๋ฒ„ ํ…Œ์ŠคํŠธ์šฉ API ์ถ”๊ฐ€
hyeonda02 Jan 25, 2025
6d7ae4e
๐Ÿ‘ท CICD(Refactor) : CI.yml ๋ฐ CICD.yml์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ถ”๊ฐ€
hyeonda02 Jan 25, 2025
c35abc1
Merge pull request #8 from capgoing/feature/api-test
hyeonda02 Jan 25, 2025
895cf11
โž• ์‘๋‹ต ๊ด€๋ จ ์ฝ”๋“œ ์ถ”๊ฐ€
Juye0nLee Jan 27, 2025
496d000
โœจ ํด๋Ÿฌ์Šคํ„ฐ๋ง ๊ฒฐ๊ณผ ์กฐํšŒ api ๊ฐœ๋ฐœ
Juye0nLee Jan 29, 2025
0241b6f
โœจ ์ด๋ฏธ์ง€ ์ถ”๊ฐ€
Juye0nLee Jan 29, 2025
5e544f9
โœจ ํด๋Ÿฌ์Šคํ„ฐ๋ง ๊ฒฐ๊ณผ ๊ด€๋ จ API ๊ตฌํ˜„
Juye0nLee Jan 29, 2025
3ac3a7d
โฌ†๏ธ ์Šค์›จ๊ฑฐ ๋ฒ„์ „ ๋ณ€๊ฒฝ
Juye0nLee Jan 29, 2025
d5dc975
โฌ†๏ธ ์Šค์›จ๊ฑฐ ๋ฒ„์ „ ๋ณ€๊ฒฝ
Juye0nLee Jan 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: CI with Gradle

on:
push:
branches-ignore:
- main
- develop

jobs:
CI:
name: Continuous Integration
runs-on: ubuntu-latest
permissions:
contents: read

services:
mongo:
image: mongo:6.0
ports:
- 27017:27017
env:
MONGO_INITDB_ROOT_USERNAME: test
MONGO_INITDB_ROOT_PASSWORD: testPW

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Wait for MongoDB to be ready
run: |
echo "Waiting for MongoDB to start..."
sleep 10

- name: Build and Test with Gradle Wrapper
env:
SPRING_DATA_MONGODB_URI: "mongodb://test:testPW@localhost:27017/testdb"
FASTAPI_BASE_URL: ${{ secrets.FASTAPI_BASE_URL }}
run: |
./gradlew build test
142 changes: 142 additions & 0 deletions .github/workflows/CICD.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
name: CI/CD FOR DEVELOP

on:
push:
branches:
- main
- develop

env:
DOCKERHUB_REPOSITORY: ${{ secrets.DOCKER_REPOSITORY }}
FASTAPI_BASE_URL: ${{ secrets.FASTAPI_BASE_URL }}

jobs:
CI:
name: Continuous Integration
runs-on: ubuntu-latest
permissions:
contents: read

services:
mongo:
image: mongo:6.0
ports:
- 27017:27017
env:
MONGO_INITDB_ROOT_USERNAME: test
MONGO_INITDB_ROOT_PASSWORD: testPW

steps:
- name: Get short SHA
id: slug
run: echo "sha7=$(echo ${GITHUB_SHA} | cut -c1-7)" >> $GITHUB_OUTPUT


- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

- name: Wait for MongoDB to start
run: sleep 10

- name: Build and Test with Gradle Wrapper
env:
SPRING_DATA_MONGODB_URI: "mongodb://test:testPW@localhost:27017/testdb"
FASTAPI_BASE_URL: ${{ secrets.FASTAPI_BASE_URL }}
run: |
./gradlew build test

- name: Upload jar file to Artifact
uses: actions/upload-artifact@v4
with:
name: jar_files
path: build/libs/*.jar

- name: Upload Dockerfile to Artifact
uses: actions/upload-artifact@v4
with:
name: Dockerfile
path: ./Dockerfile

CD_Delivery_to_DockerHub:
name: CD_Delivery_to_DockerHub
needs: CI
runs-on: ubuntu-latest

permissions:
contents: read

steps:
- name: Download jar file from Artifact
uses: actions/download-artifact@v4
with:
name: jar_files
path: build/libs

- name: Download Dockerfile file from Artifact
uses: actions/download-artifact@v4
with:
name: Dockerfile
path: ./

- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

- name: Get short SHA
id: slug
run: echo "sha7=$(echo ${GITHUB_SHA} | cut -c1-7)" >> $GITHUB_OUTPUT

- name: Build, tag, and push image to DockerHub
id: build-image
env:
USERNAME: ${{ secrets.DOCKER_USERNAME }}
IMAGE_TAG: ${{ steps.slug.outputs.sha7 }}
FASTAPI_BASE_URL: ${{ secrets.FASTAPI_BASE_URL }}

run: |
docker build -t $USERNAME/$DOCKERHUB_REPOSITORY:$IMAGE_TAG -t $USERNAME/$DOCKERHUB_REPOSITORY:latest .
docker push $USERNAME/$DOCKERHUB_REPOSITORY --all-tags
echo "image=$USERNAME/$DOCKERHUB_REPOSITORY:$IMAGE_TAG&latest" >> $GITHUB_OUTPUT


CD_Deploy:
name: CD_Deploy
needs: CD_Delivery_to_DockerHub
runs-on: ubuntu-latest

steps:
- name: Get short SHA
id: slug
run: echo "sha7=$(echo ${GITHUB_SHA} | cut -c1-7)" >> $GITHUB_OUTPUT

- name: Executing remote ssh commands
uses: appleboy/[email protected]
with:
host: ${{ secrets.REMOTE_IP }}
username: ${{ secrets.REMOTE_USER }}
key: ${{ secrets.REMOTE_PRIVATE_KEY }}
port: ${{ secrets.REMOTE_SSH_PORT }}
script: |
export DOCKER_IMAGE="${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY }}:latest"
export DOCKER_COMPOSE_PATH="${{ secrets.DOCKER_COMPOSE_PATH }}"
export FASTAPI_BASE_URL="${{ secrets.FASTAPI_BASE_URL }}"

cd /home/ubuntu/scripts
./rolling-update.sh

echo "Stopping current containers..."
docker compose -f $DOCKER_COMPOSE_PATH down

echo "Pulling the latest image..."
docker compose -f $DOCKER_COMPOSE_PATH pull

echo "Starting new deployment..."
docker compose -f $DOCKER_COMPOSE_PATH up -d
4 changes: 4 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM openjdk:17-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/app.jar"]
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ dependencies {
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
//swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0'
//webflux
implementation 'org.springframework.boot:spring-boot-starter-webflux'
}

tasks.named('test') {
Expand Down
6 changes: 6 additions & 0 deletions init.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
db = db.getSiblingDB('testdb');
db.createUser({
user: "test",
pwd: "testPW",
roles: [{ role: "readWrite", db: "testdb" }]
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.going.server.domain.word.controller;

import com.going.server.domain.word.dto.WordResponseDto;
import com.going.server.domain.word.service.WordService;
import com.going.server.global.response.SuccessResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
@RequestMapping("/words")
@RequiredArgsConstructor
public class WordController {
private final WordService wordService;

//๋Œ€ํ‘œ์–ดํœ˜ ์กฐํšŒ
@GetMapping()
public SuccessResponse<List<WordResponseDto>> getWords() {
List<WordResponseDto> response = wordService.getWords();
return SuccessResponse.of(response);
}

//๊ตฌ์„ฑ์–ดํœ˜ ์กฐํšŒ
@GetMapping("/composition-word")
public SuccessResponse<List<WordResponseDto>> getCompositionWords() {
List<WordResponseDto> response = wordService.getCompositionWords();
return SuccessResponse.of(response);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.going.server.domain.word.dto;

import lombok.*;

import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CompositionClusterResponseDto {
private Integer clusterId; // ํด๋Ÿฌ์Šคํ„ฐ ID
private List<CompositionWordResponseDto> words; // ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‹จ์–ด ๋ชฉ๋ก
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.going.server.domain.word.dto;

import com.going.server.domain.word.entity.CompositionWord;
import lombok.*;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CompositionWordResponseDto {
private String compositionWord;
private Boolean isRepresent;

public static CompositionWordResponseDto of(CompositionWord compositionWord) {
return new CompositionWordResponseDto(
compositionWord.getCompositionWord(),
compositionWord.getIsRepresent()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.going.server.domain.word.dto;

import lombok.*;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class WordResponseDto {
private Integer clusterId; // ํด๋Ÿฌ์Šคํ„ฐ ID ์ถ”๊ฐ€
private String word;
private String result_img;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.going.server.domain.word.entity;

import lombok.*;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "composition_words")
public class CompositionWord {
@Id
private String compositionId;

@Field(name = "composition_word")
private String compositionWord;

@Field(name = "is_represent")
private Boolean isRepresent;

// ID๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž ์ถ”๊ฐ€
public CompositionWord(String word) {
this.compositionId = new ObjectId().toString(); // MongoDB์˜ ObjectId๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
this.compositionWord = word;
this.isRepresent = false;
}
}
30 changes: 30 additions & 0 deletions src/main/java/com/going/server/domain/word/entity/Word.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.going.server.domain.word.entity;

import com.going.server.global.common.BaseEntity;
import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.bson.types.ObjectId;

@Document(collection = "words") // MongoDB ์ปฌ๋ ‰์…˜ ์ง€์ •
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Word extends BaseEntity {

@Id
private String id; // MongoDB์—์„œ ์ž๋™ ์ƒ์„ฑ๋  ObjectId๋ฅผ String์œผ๋กœ ์ €์žฅ

@Field(name = "word")
private String word;

// ID๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž ์ถ”๊ฐ€
public Word(String word) {
this.id = new ObjectId().toString(); // MongoDB์˜ ObjectId๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
this.word = word;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.going.server.domain.word.repository;

import com.going.server.domain.word.entity.Word;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface WordRepository extends MongoRepository<Word,Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.going.server.domain.word.service;

import com.going.server.domain.word.dto.WordResponseDto;

import java.util.List;

public interface WordService {
List<WordResponseDto> getWords();

List<WordResponseDto> getCompositionWords();
}
Loading