From c58334f98da988d0f1a27c30dc0294d6d46349ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EA=B7=9C?= Date: Tue, 10 Mar 2026 22:08:11 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=F0=9F=94=A5=20del:=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?deploy.yml=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 92 ------------------------------------ .gitignore | 2 +- 2 files changed, 1 insertion(+), 93 deletions(-) delete mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 10a708b..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,92 +0,0 @@ -name: Deploy (dev/main, Java 21, firebase shared) - -on: - push: - branches: [ "develop" ] # "main" 주석처리 - -jobs: - deploy: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Java 21 - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '21' - - # 공통 firebase 파일 생성 - - name: Inject firebase json (shared) - shell: bash - run: | - mkdir -p src/main/resources - cat > src/main/resources/firebase-scoi.json <<'EOF' - ${{ secrets.FIREBASE_JSON }} - EOF - - # # main application.yml (주석처리 — develop만 배포) - # - name: Inject application.yml (main) - # if: github.ref_name == 'main' - # shell: bash - # run: | - # mkdir -p src/main/resources - # cat > src/main/resources/application.yml <<'EOF' - # ${{ secrets.APP_YML_MAIN }} - # EOF - - # dev application.yml - - name: Inject application.yml (dev) - if: github.ref_name == 'develop' - shell: bash - run: | - mkdir -p src/main/resources - cat > src/main/resources/application.yml <<'EOF' - ${{ secrets.APP_YML_DEV }} - EOF - - - name: Build bootJar - run: | - chmod +x ./gradlew - ./gradlew clean bootJar -x test - - - name: Prepare SSH - run: | - mkdir -p ~/.ssh - echo "${{ secrets.EC2_SSH_KEY }}" > ~/.ssh/id_ed25519 - chmod 600 ~/.ssh/id_ed25519 - ssh-keyscan -H "${{ secrets.EC2_HOST }}" >> ~/.ssh/known_hosts - - - name: Upload jar to EC2 - shell: bash - run: | - # bootJar/ plain.jar 혼동 방지: plain 제외 우선 선택 - JAR_PATH=$(ls build/libs/*.jar | grep -v plain | head -n 1) - test -n "$JAR_PATH" - scp "$JAR_PATH" ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:/home/${{ secrets.EC2_USER }}/app.jar - - # - name: Deploy & restart (main) # 주석처리 — develop만 배포 - # if: github.ref_name == 'main' - # run: | - # ssh ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << 'EOF' - # set -e - # sudo mkdir -p /opt/myapp-main - # sudo mv /home/ec2-user/app.jar /opt/myapp-main/app.jar - # sudo chown -R ec2-user:ec2-user /opt/myapp-main - # sudo systemctl restart myapp-main - # sudo systemctl status myapp-main --no-pager - # EOF - - - name: Deploy & restart (dev) - if: github.ref_name == 'develop' - run: | - ssh ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << 'EOF' - set -e - sudo mkdir -p /opt/myapp-dev - sudo mv /home/ec2-user/app.jar /opt/myapp-dev/app.jar - sudo chown -R ec2-user:ec2-user /opt/myapp-dev - sudo systemctl restart myapp-dev - sudo systemctl status myapp-dev --no-pager - EOF \ No newline at end of file diff --git a/.gitignore b/.gitignore index 060889e..9757ff1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ *.yml *.properties # GitHub Actions workflow는 예외로 추적 -!.github/workflows/deploy.yml +!.github/workflows/ ### workflow.yml 제외 ### !workflow.yml From d7e208955176486ed0dd18dd1c0b34af6caaea45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EA=B7=9C?= Date: Tue, 10 Mar 2026 22:08:27 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=E2=9C=A8=20feat:=20ci=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 76 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7f2cb4b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,76 @@ +name: SCOI CI + +on: + push: + branches: [ "main", "develop" ] + pull_request: + branches: [ "main", "develop" ] + +jobs: + build: + runs-on: ubuntu-latest + + # CI 서버 내부에서 테스트용 DB/Redis 컨테이너 실행 + services: + mysql: + image: mysql:8.0 + env: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: scoi + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + + redis: + image: redis:latest + ports: + - 6379:6379 + options: --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3 + + steps: + - name: 체크아웃 + uses: actions/checkout@v4 + + - name: 자바 설정 Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + cache: 'gradle' + + - name: application.yml 주입 + shell: bash + run: | + mkdir -p src/main/resources + cat > src/main/resources/application.yml <<'EOF' + ${{ secrets.APPLICATION_YML }} + EOF + + # firebase 파일 생성 + - name: firebase json 주입 + shell: bash + run: | + mkdir -p src/main/resources + cat > src/main/resources/firebase-scoi.json <<'EOF' + ${{ secrets.FIREBASE_JSON }} + EOF + + - name: gradlew 실행 권한 부여 + run: chmod +x gradlew + + - name: gradle 빌드 + run: ./gradlew build + + # CI용 + env: + DB_URL: jdbc:mysql://localhost:3306/scoi?serverTimezone=Asia/Seoul + DB_USERNAME: root + DB_PASSWORD: root + REDIS_HOST: localhost + REDIS_PORT: 6379 + JWT_KEY: scoi-test-key + JWT_SECRET: scoi-test-secret-keysdsdsdsdsdsdssdsdsdsdsdsdsdsdsdsdsdsdsdsdsds + COOLSMS_API_URL: test_coolsms_api_key + COOLSMS_API_SECRET: test_coolsms_secret_key + COOLSMS_API_KEY: test_coolsms_key + COOLSMS_FROM_NUMBER: 01000000000 \ No newline at end of file From 33a4b7b44ec80ab8ee472e06f480417186d824c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EA=B7=9C?= Date: Tue, 10 Mar 2026 22:08:33 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=E2=9C=A8=20feat:=20cd=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cd.yml | 85 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 .github/workflows/cd.yml diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 0000000..5a77a76 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,85 @@ +name: SCOI CD +on: + push: + branches: [ "develop" ] + +env: + # 도커 허브 저장소 이름 (예: myusername/scoi-backend) + DOCKER_IMAGE_NAME: ${{ secrets.DOCKER_USERNAME }}/scoi-backend + +jobs: + # 📦 1단계: 빌드 및 도커 이미지 푸시 + build-and-push: + runs-on: ubuntu-latest + steps: + - name: 체크아웃 + uses: actions/checkout@v4 + + - name: 자바 설정 Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + cache: 'gradle' + + - name: application.yml 주입 + shell: bash + run: | + mkdir -p src/main/resources + cat > src/main/resources/application.yml <<'EOF' + ${{ secrets.DEV_APPLICATION_YML }} + EOF + + - name: firebase json 주입 + shell: bash + run: | + mkdir -p src/main/resources + cat > src/main/resources/firebase-scoi.json <<'EOF' + ${{ secrets.FIREBASE_JSON }} + EOF + + - name: gradlew 실행 권한 부여 + run: chmod +x gradlew + + - name: gradle 빌드 (테스트 제외) + run: ./gradlew clean build -x test + + - name: Docker Hub 로그인 + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Docker 이미지 빌드 및 푸시 + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: ${{ env.DOCKER_IMAGE_NAME }}:latest + + + deploy: + needs: build-and-push + runs-on: ubuntu-latest + steps: + - name: EC2에 배포 (SSH 접속) + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.EC2_HOST }} + username: ${{ secrets.EC2_SSH_USER }} + key: ${{ secrets.EC2_SSH_KEY }} + + script: | + cd ~/scoi-Backend + + echo "${{ secrets.DEV_ENV_FILE }}" > .env + echo "DOCKER_USERNAME=${{ secrets.DOCKER_USERNAME }}" >> .env + + # Docker Hub에서 방금 만든 최신 이미지 가져오기 + sudo docker-compose pull + + # 컨테이너 재실행 + sudo docker-compose up -d + + # 불필요한 이미지 삭제 + sudo docker image prune -f From d0ed21987c743a3d447ae4b5e16af339c9c484f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EA=B7=9C?= Date: Tue, 10 Mar 2026 22:08:45 +0900 Subject: [PATCH 4/6] =?UTF-8?q?=E2=9C=A8=20feat:=20docker-compose.yml=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9c0ef24 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,32 @@ +version: '3.8' + +services: + scoi-backend: + image: ${DOCKER_USERNAME}/scoi-backend:latest + container_name: scoi-backend + ports: + - "8080:8080" + + env_file: + - .env + + depends_on: + - redis + + networks: + - scoi-network + + restart: always + + redis: + image: redis:latest + container_name: scoi-redis + ports: + - "6379:6379" + networks: + - scoi-network + restart: always + +networks: + scoi-network: + driver: bridge \ No newline at end of file From 12713b0cb9f1637b81b2d511476f188a406498a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EA=B7=9C?= Date: Tue, 10 Mar 2026 22:08:55 +0900 Subject: [PATCH 5/6] =?UTF-8?q?=E2=9C=A8=20feat:=20Dockerfile=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9d49e57 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM openjdk:21-jdk + +WORKDIR /app + +COPY build/libs/*SNAPSHOT.jar app.jar + +ENTRYPOINT ["java", "-jar", "-Duser.timezone=Asia/Seoul", "app.jar"] \ No newline at end of file From 3c99fe35d5ad248c99fa24a6827e1dc10aa0dfaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EA=B7=9C?= Date: Tue, 10 Mar 2026 22:11:27 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20secret=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f2cb4b..206cb9a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ jobs: run: | mkdir -p src/main/resources cat > src/main/resources/application.yml <<'EOF' - ${{ secrets.APPLICATION_YML }} + ${{ secrets.DEV_APPLICATION_YML }} EOF # firebase 파일 생성