diff --git a/.gitattributes b/.gitattributes index 8af972c..f2b2c45 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,3 @@ -/gradlew text eol=lf -*.bat text eol=crlf -*.jar binary +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git "a/.github/ISSUE_TEMPLATE/\342\232\231\357\270\217-chore.md" "b/.github/ISSUE_TEMPLATE/\342\232\231\357\270\217-chore.md" index 71c1104..da51471 100644 --- "a/.github/ISSUE_TEMPLATE/\342\232\231\357\270\217-chore.md" +++ "b/.github/ISSUE_TEMPLATE/\342\232\231\357\270\217-chore.md" @@ -1,12 +1,12 @@ ---- -name: "⚙️ chore" -about: 빌드 및 CI/CD 이슈 템플릿 -title: "⚙️️ " -labels: "⚙️ chore" -assignees: '' - ---- - -## 📌 설명 - +--- +name: "⚙️ chore" +about: 빌드 및 CI/CD 이슈 템플릿 +title: "⚙️️ " +labels: "⚙️ chore" +assignees: '' + +--- + +## 📌 설명 + - \ No newline at end of file diff --git "a/.github/ISSUE_TEMPLATE/\342\232\241-feature.md" "b/.github/ISSUE_TEMPLATE/\342\232\241-feature.md" index 43a5c72..41be109 100644 --- "a/.github/ISSUE_TEMPLATE/\342\232\241-feature.md" +++ "b/.github/ISSUE_TEMPLATE/\342\232\241-feature.md" @@ -1,12 +1,12 @@ ---- -name: "️⚡ feature" -about: 기능 추가 이슈 템플릿 -title: "⚡ " -labels: "⚡ feature" -assignees: '' - ---- - -## 📌 설명 - +--- +name: "️⚡ feature" +about: 기능 추가 이슈 템플릿 +title: "⚡ " +labels: "⚡ feature" +assignees: '' + +--- + +## 📌 설명 + - \ No newline at end of file diff --git "a/.github/ISSUE_TEMPLATE/\360\237\223\204-documentation.md" "b/.github/ISSUE_TEMPLATE/\360\237\223\204-documentation.md" index 1db59e9..7806b99 100644 --- "a/.github/ISSUE_TEMPLATE/\360\237\223\204-documentation.md" +++ "b/.github/ISSUE_TEMPLATE/\360\237\223\204-documentation.md" @@ -1,12 +1,12 @@ ---- -name: "️📄 documentation" -about: 문서화 이슈 템플릿 -title: "📄 " -labels: "📄 documentation" -assignees: '' - ---- - -## 📌 설명 - +--- +name: "️📄 documentation" +about: 문서화 이슈 템플릿 +title: "📄 " +labels: "📄 documentation" +assignees: '' + +--- + +## 📌 설명 + - \ No newline at end of file diff --git "a/.github/ISSUE_TEMPLATE/\360\237\224\264-fix.md" "b/.github/ISSUE_TEMPLATE/\360\237\224\264-fix.md" index 5484fdd..3cfc537 100644 --- "a/.github/ISSUE_TEMPLATE/\360\237\224\264-fix.md" +++ "b/.github/ISSUE_TEMPLATE/\360\237\224\264-fix.md" @@ -1,12 +1,12 @@ ---- -name: "️🔴 fix" -about: 버그 및 에러 이슈 템플릿 -title: "🔴 " -labels: "🔴 bug/error" -assignees: '' - ---- - -## 📌 설명 - +--- +name: "️🔴 fix" +about: 버그 및 에러 이슈 템플릿 +title: "🔴 " +labels: "🔴 bug/error" +assignees: '' + +--- + +## 📌 설명 + - \ No newline at end of file diff --git "a/.github/ISSUE_TEMPLATE/\360\237\232\200-refactor.md" "b/.github/ISSUE_TEMPLATE/\360\237\232\200-refactor.md" index d9e1d50..121efb8 100644 --- "a/.github/ISSUE_TEMPLATE/\360\237\232\200-refactor.md" +++ "b/.github/ISSUE_TEMPLATE/\360\237\232\200-refactor.md" @@ -1,12 +1,12 @@ ---- -name: "🚀 refactor" -about: 리팩토링 이슈 템플릿 -title: "🚀️ " -labels: "🚀 refactor" -assignees: '' - ---- - -## 📌 설명 - +--- +name: "🚀 refactor" +about: 리팩토링 이슈 템플릿 +title: "🚀️ " +labels: "🚀 refactor" +assignees: '' + +--- + +## 📌 설명 + - \ No newline at end of file diff --git "a/.github/ISSUE_TEMPLATE/\360\237\247\252-test.md" "b/.github/ISSUE_TEMPLATE/\360\237\247\252-test.md" index 2557b62..e32e9f7 100644 --- "a/.github/ISSUE_TEMPLATE/\360\237\247\252-test.md" +++ "b/.github/ISSUE_TEMPLATE/\360\237\247\252-test.md" @@ -1,12 +1,12 @@ ---- -name: "️🧪 test" -about: 테스트 이슈 템플릿 -title: "🧪 " -labels: "🧪 test" -assignees: '' - ---- - -## 📌 설명 - +--- +name: "️🧪 test" +about: 테스트 이슈 템플릿 +title: "🧪 " +labels: "🧪 test" +assignees: '' + +--- + +## 📌 설명 + - \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e77e480..989b204 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,15 +1,15 @@ -## 🌱 관련 이슈 - -- close # - -## 📌 작업 내용 및 특이사항 - -- - -## 🔍 참고사항 - -- - -## 📚 기타 - +## 🌱 관련 이슈 + +- close # + +## 📌 작업 내용 및 특이사항 + +- + +## 🔍 참고사항 + +- + +## 📚 기타 + - \ No newline at end of file diff --git a/.github/workflows/develop_build_deploy.yml b/.github/workflows/develop_build_deploy.yml index 00e8c1c..c8a9f97 100644 --- a/.github/workflows/develop_build_deploy.yml +++ b/.github/workflows/develop_build_deploy.yml @@ -1,140 +1,140 @@ -name: develop push Build and Deploy - -on: - push: - branches: [ "develop" ] - -env: - DOCKERHUB_USERNAME: fittheman - DOCKERHUB_IMAGE_NAME: fittheman-server - -jobs: - build-deploy: - runs-on: ubuntu-latest - environment: DEV - - steps: - # 체크아웃 - - name: Checkout - uses: actions/checkout@v4 - - # JDK 17 세팅 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - - # 테스트 환경에서 필요한 컨테이너 실행 (redis, postgres) - - name: Run Containers - run: docker compose -f ./docker-compose-test.yml up -d - - # 테스트 환경에서 필요한 스키마, 데이터 등록 - - name: Apply Schema and Data - env: - TEST_POSTGRES_CONTAINER_NAME: "${{ github.event.repository.name }}-postgres-1" - TEST_POSTGRES_USER: test - TEST_POSTGRES_DB: ftm_test_db - run: | - echo "⏳ Waiting for postgres to be ready..." - until docker exec -i $TEST_POSTGRES_CONTAINER_NAME pg_isready -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB; do - echo "postgres is not ready yet. Retrying in 3 seconds..." - sleep 3 - done - echo "✅ postgres is ready!" - - echo "${{ secrets.SCHEMA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB - echo "${{ secrets.DATA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB - - # Gradlew 실행 권한 허용 - - name: Grant Execute Permission for Gradlew - run: chmod +x ./gradlew - - # .env 파일 생성 - - name: Load secrets into .env file - run: | - echo "${{ secrets.ENV }}" >> .env - - # Swagger API 문서화 task 실행 - - name: Apply Swagger API Document Task - run: ./gradlew copyOasToSwagger - - # Rest Docs API 문서화 task 실행 - - name: Apply Rest Docs API Document Task - run: ./gradlew copyDocument - - # Gradle 빌드 - - name: Build with Gradle - id: gradle - uses: gradle/gradle-build-action@v2 - with: - arguments: | - bootJar - --scan - cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }} - - # Dockerhub 로그인 - - name: Login to Dockerhub - uses: docker/login-action@v3 - with: - username: ${{ env.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }} - - # Docker 메타데이터 - - name: Extract Docker metadata - id: metadata - uses: docker/metadata-action@v5.5.0 - env: - DOCKERHUB_IMAGE_FULL_NAME: ${{ env.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_IMAGE_NAME }} - with: - images: ${{ env.DOCKERHUB_IMAGE_FULL_NAME }} - tags: | - type=sha,prefix= - - # Docker 이미지 빌드, 도커허브 푸시 - - name: Build and Push Docker image - uses: docker/build-push-action@v3 - with: - context: . - push: true - tags: ${{ steps.metadata.outputs.tags }} # 추출된 도커 메타데이터 tags -> "${DOCKERHUB_USERNAME}/${DOCKERHUB_IMAGE_NAME}:{TAG} - - # EC2 서버로 docker-compose.yml 파일 복사 - - name: Copy docker-compose file to EC2 - uses: burnett01/rsync-deployments@7.0.1 - with: - switches: -avzr --delete - path: docker-compose.yml - remote_host: ${{ secrets.EC2_HOST }} - remote_user: ${{ secrets.EC2_USER }} - remote_key: ${{ secrets.SSH_PRIVATE_KEY }} - remote_path: /home/ubuntu/ - - # EC2 서버로 nginx 파일 복사 - # docker-compose.yml 에서 nginx 컨테이너 실행 시 파일을 마운트하기 위함 - - name: Copy default.conf file to EC2 - uses: burnett01/rsync-deployments@7.0.1 - with: - switches: -avzr --delete - path: ./nginx - remote_host: ${{ secrets.EC2_HOST }} - remote_user: ${{ secrets.EC2_USER }} - remote_key: ${{ secrets.SSH_PRIVATE_KEY }} - remote_path: /home/ubuntu - - # EC2 배포 - - name: Deploy to EC2 Server - uses: appleboy/ssh-action@v1.0.3 - env: - IMAGE_FULL_PATH: ${{ steps.metadata.outputs.tags }} - DOCKERHUB_IMAGE_NAME: ${{ env.DOCKERHUB_IMAGE_NAME }} - with: - host: ${{ secrets.EC2_HOST }} - username: ${{ secrets.EC2_USER }} - key: ${{ secrets.SSH_PRIVATE_KEY }} - envs: IMAGE_FULL_PATH, DOCKERHUB_IMAGE_NAME # docker-compose.yml 에서 사용할 환경 변수 - debug: true - script: | - echo "${{ secrets.DOCKERHUB_ACCESS_TOKEN }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin - docker compose up -d +name: develop push Build and Deploy + +on: + push: + branches: [ "develop" ] + +env: + DOCKERHUB_USERNAME: fittheman + DOCKERHUB_IMAGE_NAME: fittheman-server + +jobs: + build-deploy: + runs-on: ubuntu-latest + environment: DEV + + steps: + # 체크아웃 + - name: Checkout + uses: actions/checkout@v4 + + # JDK 17 세팅 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + # 테스트 환경에서 필요한 컨테이너 실행 (redis, postgres) + - name: Run Containers + run: docker compose -f ./docker-compose-test.yml up -d + + # 테스트 환경에서 필요한 스키마, 데이터 등록 + - name: Apply Schema and Data + env: + TEST_POSTGRES_CONTAINER_NAME: "${{ github.event.repository.name }}-postgres-1" + TEST_POSTGRES_USER: test + TEST_POSTGRES_DB: ftm_test_db + run: | + echo "⏳ Waiting for postgres to be ready..." + until docker exec -i $TEST_POSTGRES_CONTAINER_NAME pg_isready -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB; do + echo "postgres is not ready yet. Retrying in 3 seconds..." + sleep 3 + done + echo "✅ postgres is ready!" + + echo "${{ secrets.SCHEMA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB + echo "${{ secrets.DATA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB + + # Gradlew 실행 권한 허용 + - name: Grant Execute Permission for Gradlew + run: chmod +x ./gradlew + + # .env 파일 생성 + - name: Load secrets into .env file + run: | + echo "${{ secrets.ENV }}" >> .env + + # Swagger API 문서화 task 실행 + - name: Apply Swagger API Document Task + run: ./gradlew copyOasToSwagger + + # Rest Docs API 문서화 task 실행 + - name: Apply Rest Docs API Document Task + run: ./gradlew copyDocument + + # Gradle 빌드 + - name: Build with Gradle + id: gradle + uses: gradle/gradle-build-action@v2 + with: + arguments: | + bootJar + --scan + cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }} + + # Dockerhub 로그인 + - name: Login to Dockerhub + uses: docker/login-action@v3 + with: + username: ${{ env.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }} + + # Docker 메타데이터 + - name: Extract Docker metadata + id: metadata + uses: docker/metadata-action@v5.5.0 + env: + DOCKERHUB_IMAGE_FULL_NAME: ${{ env.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_IMAGE_NAME }} + with: + images: ${{ env.DOCKERHUB_IMAGE_FULL_NAME }} + tags: | + type=sha,prefix= + + # Docker 이미지 빌드, 도커허브 푸시 + - name: Build and Push Docker image + uses: docker/build-push-action@v3 + with: + context: . + push: true + tags: ${{ steps.metadata.outputs.tags }} # 추출된 도커 메타데이터 tags -> "${DOCKERHUB_USERNAME}/${DOCKERHUB_IMAGE_NAME}:{TAG} + + # EC2 서버로 docker-compose.yml 파일 복사 + - name: Copy docker-compose file to EC2 + uses: burnett01/rsync-deployments@7.0.1 + with: + switches: -avzr --delete + path: docker-compose.yml + remote_host: ${{ secrets.EC2_HOST }} + remote_user: ${{ secrets.EC2_USER }} + remote_key: ${{ secrets.SSH_PRIVATE_KEY }} + remote_path: /home/ubuntu/ + + # EC2 서버로 nginx 파일 복사 + # docker-compose.yml 에서 nginx 컨테이너 실행 시 파일을 마운트하기 위함 + - name: Copy default.conf file to EC2 + uses: burnett01/rsync-deployments@7.0.1 + with: + switches: -avzr --delete + path: ./nginx + remote_host: ${{ secrets.EC2_HOST }} + remote_user: ${{ secrets.EC2_USER }} + remote_key: ${{ secrets.SSH_PRIVATE_KEY }} + remote_path: /home/ubuntu + + # EC2 배포 + - name: Deploy to EC2 Server + uses: appleboy/ssh-action@v1.0.3 + env: + IMAGE_FULL_PATH: ${{ steps.metadata.outputs.tags }} + DOCKERHUB_IMAGE_NAME: ${{ env.DOCKERHUB_IMAGE_NAME }} + with: + host: ${{ secrets.EC2_HOST }} + username: ${{ secrets.EC2_USER }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + envs: IMAGE_FULL_PATH, DOCKERHUB_IMAGE_NAME # docker-compose.yml 에서 사용할 환경 변수 + debug: true + script: | + echo "${{ secrets.DOCKERHUB_ACCESS_TOKEN }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin + docker compose up -d docker image prune -a -f \ No newline at end of file diff --git a/.github/workflows/develop_pull_request.yml b/.github/workflows/develop_pull_request.yml index 08ae798..8033509 100644 --- a/.github/workflows/develop_pull_request.yml +++ b/.github/workflows/develop_pull_request.yml @@ -1,58 +1,58 @@ -name: develop pull request Check and Test - -on: - pull_request: - branches: [ "develop" ] - -jobs: - test: - runs-on: ubuntu-latest - - steps: - # 체크아웃 - - name: Checkout - uses: actions/checkout@v4 - - # JDK 17 세팅 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - - # 테스트 환경에서 필요한 컨테이너 실행 (redis, postgres) - - name: Run Containers - run: docker compose -f ./docker-compose-test.yml up -d - - # 테스트 환경에서 필요한 스키마, 데이터 등록 - - name: Apply Schema and Data - env: - TEST_POSTGRES_CONTAINER_NAME: "${{ github.event.repository.name }}-postgres-1" - TEST_POSTGRES_USER: test - TEST_POSTGRES_DB: ftm_test_db - run: | - echo "⏳ Waiting for postgres to be ready..." - until docker exec -i $TEST_POSTGRES_CONTAINER_NAME pg_isready -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB; do - echo "postgres is not ready yet. Retrying in 3 seconds..." - sleep 3 - done - echo "✅ postgres is ready!" - - echo "${{ secrets.SCHEMA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB - echo "${{ secrets.DATA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB - - # Gradlew 실행 권한 허용 - - name: Grant Execute Permission for Gradlew - run: chmod +x ./gradlew - - # .env 파일 생성 - - name: Load secrets into .env file - run: | - echo "${{ secrets.ENV }}" >> .env - - # Gradle setup, check(코드 품질 관리, 테스트) 실행 - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 - with: - arguments: check +name: develop pull request Check and Test + +on: + pull_request: + branches: [ "develop" ] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + # 체크아웃 + - name: Checkout + uses: actions/checkout@v4 + + # JDK 17 세팅 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + # 테스트 환경에서 필요한 컨테이너 실행 (redis, postgres) + - name: Run Containers + run: docker compose -f ./docker-compose-test.yml up -d + + # 테스트 환경에서 필요한 스키마, 데이터 등록 + - name: Apply Schema and Data + env: + TEST_POSTGRES_CONTAINER_NAME: "${{ github.event.repository.name }}-postgres-1" + TEST_POSTGRES_USER: test + TEST_POSTGRES_DB: ftm_test_db + run: | + echo "⏳ Waiting for postgres to be ready..." + until docker exec -i $TEST_POSTGRES_CONTAINER_NAME pg_isready -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB; do + echo "postgres is not ready yet. Retrying in 3 seconds..." + sleep 3 + done + echo "✅ postgres is ready!" + + echo "${{ secrets.SCHEMA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB + echo "${{ secrets.DATA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB + + # Gradlew 실행 권한 허용 + - name: Grant Execute Permission for Gradlew + run: chmod +x ./gradlew + + # .env 파일 생성 + - name: Load secrets into .env file + run: | + echo "${{ secrets.ENV }}" >> .env + + # Gradle setup, check(코드 품질 관리, 테스트) 실행 + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + with: + arguments: check cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index c279f7e..0a192a9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,48 +1,49 @@ -HELP.md -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/**/build/ -!**/src/test/**/build/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache -bin/ -!**/src/main/**/bin/ -!**/src/test/**/bin/ - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr -out/ -!**/src/main/**/out/ -!**/src/test/**/out/ - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ - -### VS Code ### -.vscode/ - -### env ### -.env - -### sql ### -*.sql - -### api docs ### -src/main/resources/static/docs/openapi3.yaml -src/main/resources/static/docs/index.html +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### env ### +.env +test.env + +### sql ### +*.sql + +### api docs ### +src/main/resources/static/docs/openapi3.yaml +src/main/resources/static/docs/index.html src/docs/asciidoc/index.html \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index f036759..5cf498d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM amazoncorretto:17-alpine-jdk -ARG JAR_FILE=build/libs/*.jar -COPY ${JAR_FILE} app.jar +FROM amazoncorretto:17-alpine-jdk +ARG JAR_FILE=build/libs/*.jar +COPY ${JAR_FILE} app.jar ENTRYPOINT ["java", "-jar", "/app.jar"] \ No newline at end of file diff --git a/README.md b/README.md index 5df26d9..77ebbd8 100644 --- a/README.md +++ b/README.md @@ -1,80 +1,80 @@ -## Git Commit Message Convention - -### 기본구조 - -``` - : - - - -