diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml new file mode 100644 index 0000000..b8c0ffa --- /dev/null +++ b/.github/workflows/deploy-test.yml @@ -0,0 +1,92 @@ +name: CI/CD - Searchweb (version.txt 기반) + +on: + push: + branches: [ "main", "dev" ] + pull_request: + branches: [ "main", "dev" ] + +jobs: + build-and-push: + name: Build & Push Docker Image + runs-on: ubuntu-latest + + outputs: + image_tag: ${{ steps.meta.outputs.IMAGE_TAG }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Read version.txt + id: meta + run: | + VERSION=$(cat version.txt | tr -d ' \n') + echo "IMAGE_TAG=${VERSION}" >> $GITHUB_OUTPUT + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Grant execute permission + run: chmod +x ./gradlew + + - name: Build JAR + run: ./gradlew clean bootJar + + - name: Docker Login + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Docker Build (version + latest) + run: | + docker build \ + -t ${{ secrets.DOCKERHUB_USERNAME }}/searchweb:${{ steps.meta.outputs.IMAGE_TAG }} \ + -t ${{ secrets.DOCKERHUB_USERNAME }}/searchweb:latest \ + . + + - name: Docker Push + run: | + docker push ${{ secrets.DOCKERHUB_USERNAME }}/searchweb:${{ steps.meta.outputs.IMAGE_TAG }} + docker push ${{ secrets.DOCKERHUB_USERNAME }}/searchweb:latest + + deploy: + name: Deploy to OCI + runs-on: ubuntu-latest + needs: build-and-push + + env: + IMAGE_TAG: ${{ needs.build-and-push.outputs.image_tag }} + + steps: + - name: Prepare SSH key + run: | + mkdir -p ~/.ssh + echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + + - name: Add Known Hosts + run: ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts + + - name: Deploy via SSH + run: | + ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'EOF' + docker login -u '${{ secrets.DOCKERHUB_USERNAME }}' -p '${{ secrets.DOCKERHUB_TOKEN }}' + docker pull ${{ secrets.DOCKERHUB_USERNAME }}/searchweb:${IMAGE_TAG} + docker pull ${{ secrets.DOCKERHUB_USERNAME }}/searchweb:latest + + # 기존 컨테이너 강제 삭제 (있으면 지우고, 없으면 에러 무시) + docker rm -f searchweb 2>/dev/null || true + + # 새 컨테이너 실행 + docker run -d \ + --env SPRING_PROFILES_ACTIVE=dev \ + --env-file /home/ubuntu/Searchweb/.env \ + -p 8080:8080 \ + --name searchweb \ + ${{ secrets.DOCKERHUB_USERNAME }}/searchweb:latest + EOF \ No newline at end of file diff --git a/.gitignore b/.gitignore index f5415cc..b700666 100644 --- a/.gitignore +++ b/.gitignore @@ -19,8 +19,6 @@ bin/ ### Ignore application.properties ### -application.properties -application-*.properties .env diff --git a/Dockerfile b/Dockerfile index 8a0b110..dd932ed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,3 @@ -FROM openjdk:17-jdk-slim +FROM eclipse-temurin:17-jre-alpine COPY build/libs/SearchWeb-0.0.1-SNAPSHOT.jar app.jar -ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "-jar", "app.jar"] \ No newline at end of file +ENTRYPOINT ["java", "-jar", "app.jar"] \ No newline at end of file diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties new file mode 100644 index 0000000..8a319fb --- /dev/null +++ b/src/main/resources/application-dev.properties @@ -0,0 +1,15 @@ +# Dev mysql settings +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=${DEV_DB_URL} +spring.datasource.username=${DEV_DB_USERNAME} +spring.datasource.password=${DEV_DB_PASSWORD} + +## Dev OAUTH2 +spring.security.oauth2.client.registration.naver.redirect-uri=${CLOUD_NAVER_OAUTH_REDIRECT_URI} +spring.security.oauth2.client.registration.google.redirect-uri=${CLOUD_GOOGLE_OAUTH_REDIRECT_URI} +spring.security.oauth2.client.registration.kakao.redirect-uri=${CLOUD_KAKAO_OAUTH_REDIRECT_URI} + +## openai settings +#ai.openai.api-key=${OPENAI_API_KEY} +#ai.openai.chat.options.model=${OPENAI_API_MODEL} +#ai.openai.chat.options.temperature=${OPENAI_API_tmp} \ No newline at end of file diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties new file mode 100644 index 0000000..bdda5c0 --- /dev/null +++ b/src/main/resources/application-local.properties @@ -0,0 +1,14 @@ +## Local mysql settings +spring.datasource.url=${LOCAL_DB_URL} +spring.datasource.username=${LOCAL_DB_USERNAME} +spring.datasource.password=${LOCAL_DB_PASSWORD} + +## LOCAL OAUTH2 +spring.security.oauth2.client.registration.naver.redirect-uri=${LOCAL_NAVER_OAUTH_REDIRECT_URI} +spring.security.oauth2.client.registration.google.redirect-uri=${LOCAL_GOOGLE_OAUTH_REDIRECT_URI} +spring.security.oauth2.client.registration.kakao.redirect-uri=${LOCAL_KAKAO_OAUTH_REDIRECT_URI} + +## openai settings +#ai.openai.api-key=${OPENAI_API_KEY} +#ai.openai.chat.options.model=${OPENAI_API_MODEL} +#ai.openai.chat.options.temperature=${OPENAI_API_tmp} diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties new file mode 100644 index 0000000..c5f5ddf --- /dev/null +++ b/src/main/resources/application-prod.properties @@ -0,0 +1,15 @@ +# Prod mysql settings +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=${PROD_DB_URL} +spring.datasource.username=${PROD_DB_USERNAME} +spring.datasource.password=${PROD_DB_PASSWORD} + +## Prod OAUTH2 +spring.security.oauth2.client.registration.naver.redirect-uri=${CLOUD_NAVER_OAUTH_REDIRECT_URI} +spring.security.oauth2.client.registration.google.redirect-uri=${CLOUD_GOOGLE_OAUTH_REDIRECT_URI} +spring.security.oauth2.client.registration.kakao.redirect-uri=${CLOUD_KAKAO_OAUTH_REDIRECT_URI} + +## openai settings +#ai.openai.api-key=${OPENAI_API_KEY} +#ai.openai.chat.options.model=${OPENAI_API_MODEL} +#ai.openai.chat.options.temperature=${OPENAI_API_tmp} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..20d8468 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,50 @@ +spring.application.name=SearchWeb + +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +# mybatis settings +mybatis.mapper-locations=classpath:mapper/*.xml +logging.level.org.mybatis=DEBUG + +#logging.level.org.springframework.security=TRACE +logging.level.org.springframework.security=DEBUG + + +##### Oauth2 session login settings ##### +#naver settings +#registration +spring.security.oauth2.client.registration.naver.client-name=naver +spring.security.oauth2.client.registration.naver.client-id=${NAVER_CLIENT_ID} +spring.security.oauth2.client.registration.naver.client-secret=${NAVER_CLIENT_SECRET} +spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.naver.scope=name,email +#provider +spring.security.oauth2.client.provider.naver.authorization-uri=https://nid.naver.com/oauth2.0/authorize +spring.security.oauth2.client.provider.naver.token-uri=https://nid.naver.com/oauth2.0/token +spring.security.oauth2.client.provider.naver.user-info-uri=https://openapi.naver.com/v1/nid/me +spring.security.oauth2.client.provider.naver.user-name-attribute=response + + +#google settings +#registration +spring.security.oauth2.client.registration.google.client-name=google +spring.security.oauth2.client.registration.google.client-id=${GOOGLE_CLIENT_ID} +spring.security.oauth2.client.registration.google.client-secret=${GOOGLE_CLIENT_SECRET} +spring.security.oauth2.client.registration.google.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.google.scope=profile,email + + +#kakao settings +#registration +spring.security.oauth2.client.registration.kakao.client-name=kakao +spring.security.oauth2.client.registration.kakao.client-id=${KAKAO_CLIENT_ID} +spring.security.oauth2.client.registration.kakao.client-secret=${KAKAO_CLIENT_SECRET} +spring.security.oauth2.client.registration.kakao.client-authentication-method=client_secret_post +spring.security.oauth2.client.registration.kakao.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.kakao.scope=profile_nickname, account_email +#provider +spring.security.oauth2.client.provider.kakao.authorization-uri=https://kauth.kakao.com/oauth/authorize +spring.security.oauth2.client.provider.kakao.token-uri=https://kauth.kakao.com/oauth/token +spring.security.oauth2.client.provider.kakao.user-info-uri=https://kapi.kakao.com/v2/user/me +spring.security.oauth2.client.provider.kakao.user-name-attribute=id + +#spring.config.import=optional:dotenv:.env diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..1cc5f65 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +1.1.0 \ No newline at end of file