diff --git a/blog/.github/workflows/cicd.yml b/blog/.github/workflows/cicd.yml new file mode 100644 index 0000000..3014e00 --- /dev/null +++ b/blog/.github/workflows/cicd.yml @@ -0,0 +1,98 @@ +name: CI/CD Pipeline + +on: + push: + branches: + - "김민지/main" + - "김민지/8주차" + pull_request: + branches: [ "김민지/main" ] + workflow_dispatch: + +jobs: + # 1. 테스트 및 빌드 작업 + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + # Secret에 넣어둔 application.yml을 생성하는 단계 + - name: Restore application.yml + run: | + mkdir -p ./blog/src/main/resources + echo "${{ secrets.APPLICATION_YML }}" | base64 --decode > ./blog/src/main/resources/application.yml + + - name: Grant execute permission for gradlew + run: chmod +x ./gradlew + + - name: Build with Gradle + run: ./gradlew clean build -x test + + - name: Upload Build Artifact + uses: actions/upload-artifact@v4 + with: + name: build-artifact + path: blog/build/libs/*.jar + + # 2. 도커 이미지 빌드 및 Push 작업 + docker-push: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v4 + + # application.yml이 이미지 빌드에 필요하므로 다시 생성 + - name: Restore application.yml + run: | + mkdir -p ./blog/src/main/resources + echo "${{ secrets.APPLICATION_YML }}" | base64 --decode > ./blog/src/main/resources/application.yml + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and Push Docker Image + uses: docker/build-push-action@v5 + with: + context: ./blog + file: ./blog/Dockerfile + push: true + tags: sxvxnxwt/leets-blog:latest + + # 3. EC2 배포 작업 + deploy: + runs-on: ubuntu-latest + needs: docker-push + steps: + - uses: actions/checkout@v4 + + # docker-compose.yml 파일을 EC2로 복사 + - name: Copy docker-compose.yml to EC2 + uses: appleboy/scp-action@master + with: + host: ${{ secrets.EC2_HOST }} + username: ${{ secrets.EC2_USERNAME }} + key: ${{ secrets.EC2_SSH_KEY }} + source: "blog/docker-compose.yml" + target: "/home/ubuntu/" + + # SSH로 접속하여 배포 명령 실행 + - name: Deploy to EC2 + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.EC2_HOST }} + username: ${{ secrets.EC2_USERNAME }} + key: ${{ secrets.EC2_SSH_KEY }} + script: | + cd /home/ubuntu + sudo docker-compose down || true + sudo docker-compose pull + sudo docker-compose up -d \ No newline at end of file diff --git a/blog/Dockerfile b/blog/Dockerfile new file mode 100644 index 0000000..fdf4a13 --- /dev/null +++ b/blog/Dockerfile @@ -0,0 +1,11 @@ +FROM eclipse-temurin:17-jre-alpine + +WORKDIR /app + +ENV SERVER_PORT=8080 + +COPY blog/build/libs/blog-0.0.1-SNAPSHOT.jar app.jar + +EXPOSE ${SERVER_PORT} + +ENTRYPOINT ["java", "-jar", "app.jar"] \ No newline at end of file diff --git a/blog/docker-compose.yml b/blog/docker-compose.yml new file mode 100644 index 0000000..b12b9f4 --- /dev/null +++ b/blog/docker-compose.yml @@ -0,0 +1,52 @@ +version: "3.9" + +services: + db: + image: mysql:8 + container_name: mydb + restart: always + environment: + MYSQL_ROOT_PASSWORD: 1234 + MYSQL_DATABASE: leets_blog # application.yml의 DB명과 일치 + TZ: Asia/Seoul + command: [ + "--performance-schema=off", + "--innodb-buffer-pool-size=64M" + ] + ports: + - "3306:3306" + volumes: + - db-data:/var/lib/mysql + networks: + - mynetwork + healthcheck: + test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ] + timeout: 10s + retries: 10 + interval: 3s + start_period: 25s + + springapp: + image: sxvxnxwt/leets-blog:latest # Docker Hub에 올라갈 이미지 이름 + container_name: springapp + restart: always + ports: + - "8080:8080" + depends_on: + db: + condition: service_healthy + environment: + SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/leets_blog?serverTimezone=Asia/Seoul + SPRING_DATASOURCE_USERNAME: root + SPRING_DATASOURCE_PASSWORD: 1234 + SPRING_JPA_HIBERNATE_DDL_AUTO: update + TZ: Asia/Seoul + networks: + - mynetwork + +volumes: + db-data: + +networks: + mynetwork: + driver: bridge diff --git a/blog/src/main/resources/application.yml b/blog/src/main/resources/application.yml index c71b046..d61a8a7 100644 --- a/blog/src/main/resources/application.yml +++ b/blog/src/main/resources/application.yml @@ -5,7 +5,7 @@ spring: application: name: blog datasource: - url: jdbc:mysql://localhost:3306/leets_blog?serverTimezone=Asia/Seoul + url: jdbc:mysql://db:3306/leets_blog?serverTimezone=Asia/Seoul username: root password: 1234 jpa: