diff --git a/.github/workflows/cd-dev.yaml b/.github/workflows/cd-dev.yaml new file mode 100644 index 0000000..2b3f4c8 --- /dev/null +++ b/.github/workflows/cd-dev.yaml @@ -0,0 +1,29 @@ +name: discovery-service dev CD 파이프라인 + +on: + workflow_run: + workflows: ["discovery-service CI pipeline"] + types: + - completed + +jobs: + deploy: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + environment: dev + permissions: + contents: read + + steps: + - name: Docker 이미지 dev 서버 배포 + uses: appleboy/ssh-action@master + with: + host: ${{secrets.DEV_HOST}} + username: ${{secrets.DEV_USERNAME}} + key: ${{secrets.DEV_KEY}} + script: | + cd /home/ubuntu + docker rm -f discovery-service-dev || true + docker compose pull discovery-service-dev + docker compose up -d --no-deps --force-recreate --pull always discovery-service-dev + docker image prune -f diff --git a/.github/workflows/cd-prod.yaml b/.github/workflows/cd-prod.yaml new file mode 100644 index 0000000..fcfebb5 --- /dev/null +++ b/.github/workflows/cd-prod.yaml @@ -0,0 +1,29 @@ +name: discovery-service prod CD 파이프라인 + +on: + workflow_run: + workflows: ["discovery-service CI pipeline"] + types: + - completed + +jobs: + deploy: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + environment: prod + permissions: + contents: read + + steps: + - name: Docker 이미지 dev 서버 배포 + uses: appleboy/ssh-action@master + with: + host: ${{secrets.PROD_HOST}} + username: ${{secrets.PROD_USERNAME}} + key: ${{secrets.PROD_KEY}} + script: | + cd /home/ubuntu + docker rm -f discovery-service-prod || true + docker compose pull discovery-service-prod + docker compose up -d --no-deps --force-recreate --pull always discovery-service-prod + docker image prune -f diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..5640f42 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,46 @@ +name: discovery-service CI pipeline + +on: + push: + branches: + - dev + pull_request: + branches: + - dev + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + environment: production + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: jdk 설정 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + cache: 'gradle' + + - name: Gradle Wrapper 권한 부여 + run: chmod +x gradlew + + - name: gradle 빌드 + run: ./gradlew clean build + + - name: 도커 로그인 + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_ACCESS_TOKEN }} + + - name: 이미지 빌드 및 푸시 + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + tags: ${{ secrets.DOCKER_USERNAME }}/unionmate-discovery-service:latest + push: true diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6532d51 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:21-jdk + +COPY build/libs/*SNAPSHOT.jar app.jar + +ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -Dspring.profiles.active=${PROFILE} -jar /app.jar"] diff --git a/build.gradle b/build.gradle index e75a4d4..12243a6 100644 --- a/build.gradle +++ b/build.gradle @@ -37,4 +37,5 @@ dependencyManagement { tasks.named('test') { useJUnitPlatform() + systemProperty "spring.profiles.active", "test" } diff --git a/src/main/java/com/unionmate/discovery_service/DiscoveryServiceApplication.java b/src/main/java/com/unionmate/discovery_service/DiscoveryServiceApplication.java index 5938e89..ded210f 100644 --- a/src/main/java/com/unionmate/discovery_service/DiscoveryServiceApplication.java +++ b/src/main/java/com/unionmate/discovery_service/DiscoveryServiceApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication +@EnableEurekaServer public class DiscoveryServiceApplication { public static void main(String[] args) { diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..5cad6e9 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,15 @@ +server: + port: 8761 + +spring: + application: + name: discovery-service-dev + +eureka: + client: + register-with-eureka: false + fetch-registry: false + + server: + wait-time-in-ms-when-sync-empty: 0 # 초기 레지스트리 정보가 비어 있어도 지연 없이 즉시 서버 시작 + response-cache-update-interval-ms: 30000 # 클라이언트에게 제공할 서비스 목록 캐시를 30초마다 갱신 diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 0000000..630db0e --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,15 @@ +server: + port: 8761 + +spring: + application: + name: discovery-service + +eureka: + client: + register-with-eureka: false + fetch-registry: false + + server: + wait-time-in-ms-when-sync-empty: 0 # 초기 레지스트리 정보가 비어 있어도 지연 없이 즉시 서버 시작 + response-cache-update-interval-ms: 30000 # 클라이언트에게 제공할 서비스 목록 캐시를 30초마다 갱신 diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml new file mode 100644 index 0000000..42d4818 --- /dev/null +++ b/src/main/resources/application-prod.yml @@ -0,0 +1,15 @@ +server: + port: 8761 + +spring: + application: + name: discovery-service-prod + +eureka: + client: + register-with-eureka: false + fetch-registry: false + + server: + wait-time-in-ms-when-sync-empty: 0 # 초기 레지스트리 정보가 비어 있어도 지연 없이 즉시 서버 시작 + response-cache-update-interval-ms: 30000 # 클라이언트에게 제공할 서비스 목록 캐시를 30초마다 갱신 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 534cfea..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=discovery_service diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml new file mode 100644 index 0000000..76a354f --- /dev/null +++ b/src/test/resources/application-test.yml @@ -0,0 +1,8 @@ +spring: + application: + name: discovery-service-test + +eureka: + client: + register-with-eureka: false + fetch-registry: false