diff --git a/.github/workflows/YEOJUNG-BACKEND-CICD.yml b/.github/workflows/YEOJUNG-BACKEND-CICD.yml new file mode 100644 index 0000000..6310ddd --- /dev/null +++ b/.github/workflows/YEOJUNG-BACKEND-CICD.yml @@ -0,0 +1,115 @@ +name: YEOJUNG-BACKEND-CICD + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + ci: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build with Gradle + run: ./gradlew clean build -x test + + cd: + runs-on: ubuntu-latest + needs: ci + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build with Gradle + run: ./gradlew clean build -x test + + - name: Docker login + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push Docker image + run: | + docker build -t ${{ secrets.DOCKER_USERNAME }}/yeojung-backend:latest . + docker push ${{ secrets.DOCKER_USERNAME }}/yeojung-backend:latest + + - name: Deploy to AWS EC2 + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.AWS_EC2_IP }} + username: ec2-user + key: ${{ secrets.EC2_SSH_KEY }} + script: | + docker pull ${{ secrets.DOCKER_USERNAME }}/yeojung-backend:latest + docker stop yeojung-backend || true + docker rm yeojung-backend || true + docker run -d -p 8081:8080 --name yeojung-backend \ + -e DB_HOST='${{ secrets.DB_HOST }}' \ + -e DB_NAME='${{ secrets.DB_NAME }}' \ + -e DB_USERNAME='${{ secrets.DB_USERNAME }}' \ + -e DB_PASSWORD='${{ secrets.DB_PASSWORD }}' \ + -e JWT_SECRET_KEY='${{ secrets.JWT_SECRET_KEY }}' \ + ${{ secrets.DOCKER_USERNAME }}/yeojung-backend:latest + + - name: Health check + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.AWS_EC2_IP }} + username: ec2-user + key: ${{ secrets.EC2_SSH_KEY }} + script: | + sleep 10 + curl --fail http://localhost:8081/health || exit 1 + + - name: Rollback deployment if health check fails + if: failure() + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.AWS_EC2_IP }} + username: ec2-user + key: ${{ secrets.EC2_SSH_KEY }} + script: | + docker pull ${{ secrets.DOCKER_USERNAME }}/yeojung-backend:previous-version + docker stop yeojung-backend || true + docker rm yeojung-backend || true + docker run -d -p 8081:8080 --name yeojung-backend \ + -e DB_HOST='${{ secrets.DB_HOST }}' \ + -e DB_NAME='${{ secrets.DB_NAME }}' \ + -e DB_USERNAME='${{ secrets.DB_USERNAME }}' \ + -e DB_PASSWORD='${{ secrets.DB_PASSWORD }}' \ + -e JWT_SECRET_KEY='${{ secrets.JWT_SECRET_KEY }}' \ + ${{ secrets.DOCKER_USERNAME }}/yeojung-backend:previous-version + + - name: Check logs after deployment + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.AWS_EC2_IP }} + username: ec2-user + key: ${{ secrets.EC2_SSH_KEY }} + script: docker logs yeojung-backend