diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 0000000..f0fe8ac --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,81 @@ +name: SpringBoot deploy with Docker + +on: + # after merge to main with pr + pull_request: + types: [ closed ] + branches: [ "develop" ] + +jobs: + build-and-deploy: + runs-on: ubuntu-22.04 + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Build with Gradle Wrapper + run: ./gradlew build -x test + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and Push Docker Image + run: | + docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_REPOSITORY }}:${{ github.sha }} . + docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_REPOSITORY }}:${{ github.sha }} + + - name: Modify docker-compose.dev.yaml + run: | + sed -i "s|REPLACE_IMAGE_TAG|${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_REPOSITORY }}:${{ github.sha }}|g" docker-compose.dev.yaml && + sed -i "s|REPLACE_GOOGLE_CLIENT_ID|${{ secrets.GOOGLE_CLIENT_ID }}|g" docker-compose.dev.yaml && + sed -i "s|REPLACE_GOOGLE_CLIENT_SECRET|${{ secrets.GOOGLE_CLIENT_SECRET }}|g" docker-compose.dev.yaml && + sed -i "s|REPLACE_GOOGLE_REDIRECT_URI|${{ secrets.GOOGLE_REDIRECT_URI }}|g" docker-compose.dev.yaml && + sed -i "s|REPLACE_JWT_SECRET|${{ secrets.JWT_SECRET }}|g" docker-compose.dev.yaml + + - name: Send script to remote server + uses: appleboy/scp-action@master + with: + host: ${{ secrets.REMOTE_HOST }} + username: ${{ secrets.REMOTE_USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + source: "docker-compose.dev.yaml,script/deploy.sh" + target: /home/${{ secrets.REMOTE_USERNAME }}/gdsc-project + + - name: SSH to remote server and run docker-compose + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.REMOTE_HOST }} + username: ${{ secrets.REMOTE_USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + script: | + cd /home/${{ secrets.REMOTE_USERNAME }}/gdsc-project/script + chmod +x deploy.sh + sudo ./deploy.sh + + dependency-submission: + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + # Generates and submits a dependency graph, enabling Dependabot Alerts for all project dependencies. + # See: https://github.com/gradle/actions/blob/main/dependency-submission/README.md + - name: Generate and submit dependency graph + uses: gradle/actions/dependency-submission@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0 \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..27d038f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,36 @@ +name: SpringBoot test with Redis + +on: + pull_request: + types: [ opened, synchronize, reopened ] + branches: [ "develop" ] + +jobs: + test: + runs-on: ubuntu-22.04 + services: + redis: + image: redis:latest + ports: + - 6379:6379 + + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Test with Gradle Wrapper + run: ./gradlew test + env: + REDIS_HOST: ${{ secrets.REDIS_HOST }} + REDIS_PORT: ${{ secrets.REDIS_PORT }} + GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }} + GOOGLE_CLIENT_SECRET: ${{ secrets.GOOGLE_CLIENT_SECRET }} + GOOGLE_REDIRECT_URI: ${{ secrets.GOOGLE_REDIRECT_URI }} + JWT_SECRET: ${{ secrets.JWT_SECRET }} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..eb2886a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM amd64/amazoncorretto:17 +WORKDIR /usr/src/app +ARG JAR_FILE=build/libs/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java", "-Duser.timezone=Asia/Seoul", "-jar", "app.jar"] \ No newline at end of file diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml new file mode 100644 index 0000000..bf17b9c --- /dev/null +++ b/docker-compose.dev.yaml @@ -0,0 +1,22 @@ +version: '3' +services: + gradingx-redis: + image: redis:latest + container_name: redis + hostname: redis + expose: + - "6379" + + gradingx-server: + image: REPLACE_IMAGE_TAG + environment: + - REDIS_HOST=localhost + - REDIS_PORT=6379 + - GOOGLE_CLIENT_ID=REPLACE_GOOGLE_CLIENT_ID + - GOOGLE_CLIENT_SECRET=REPLACE_GOOGLE_CLIENT_SECRET + - GOOGLE_REDIRECT_URI=REPLACE_GOOGLE_REDIRECT_URI + - JWT_SECRET=REPLACE_JWT_SECRET + ports: + - "8080:8080" + depends_on: + - gradingx-redis \ No newline at end of file diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/script/deploy.sh b/script/deploy.sh new file mode 100644 index 0000000..3f6b892 --- /dev/null +++ b/script/deploy.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +cd .. + +docker-compose -f docker-compose.dev.yaml up --build -d + +docker-compose -f docker-compose.dev.yaml ps diff --git a/src/test/java/gdsc/comunity/CommunityApplicationTests.java b/src/test/java/gdsc/comunity/CommunityApplicationTests.java index 775da28..1b62628 100644 --- a/src/test/java/gdsc/comunity/CommunityApplicationTests.java +++ b/src/test/java/gdsc/comunity/CommunityApplicationTests.java @@ -2,8 +2,10 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; @SpringBootTest +@ActiveProfiles("test") class CommunityApplicationTests { @Test diff --git a/src/test/java/gdsc/comunity/security/jwt/RefreshTokenRepositoryTest.java b/src/test/java/gdsc/comunity/security/jwt/RefreshTokenRepositoryTest.java index dd1c30e..646f275 100644 --- a/src/test/java/gdsc/comunity/security/jwt/RefreshTokenRepositoryTest.java +++ b/src/test/java/gdsc/comunity/security/jwt/RefreshTokenRepositoryTest.java @@ -14,7 +14,7 @@ import org.springframework.transaction.annotation.Transactional; @Transactional -@ActiveProfiles("dev") +@ActiveProfiles("test") @SpringBootTest(webEnvironment = WebEnvironment.MOCK) class RefreshTokenRepositoryTest {