refactor: 채팅 프롬프팅 개선 #94
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI/CD | |
| on: | |
| push: | |
| branches: [ develop ] | |
| jobs: | |
| build-and-deploy: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v3 | |
| - name: Make gradlew executable | |
| run: chmod +x gradlew | |
| - name: Set up JDK | |
| uses: actions/setup-java@v3 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Build with Gradle | |
| run: ./gradlew clean bootJar -x test | |
| - name: Show artifact | |
| run: ls -la build/libs/ | |
| - name: Copy JAR to EC2 | |
| uses: appleboy/scp-action@v0.1.5 | |
| with: | |
| host: ${{ secrets.SERVER_HOST }} | |
| username: ${{ secrets.SERVER_USER }} | |
| key: ${{ secrets.SERVER_KEY }} | |
| port: 22 | |
| source: "build/libs/*-SNAPSHOT.jar" | |
| target: "/home/ubuntu/app" | |
| rm: true | |
| overwrite: true | |
| - name: Copy docker-compose.yml to EC2 | |
| uses: appleboy/scp-action@v0.1.5 | |
| with: | |
| host: ${{ secrets.SERVER_HOST }} | |
| username: ${{ secrets.SERVER_USER }} | |
| key: ${{ secrets.SERVER_KEY }} | |
| port: 22 | |
| source: "docker-compose.yml" | |
| target: "/home/ubuntu/app" | |
| overwrite: true | |
| - name: Deploy via SSH | |
| uses: appleboy/ssh-action@v0.1.5 | |
| with: | |
| host: ${{ secrets.SERVER_HOST }} | |
| username: ${{ secrets.SERVER_USER }} | |
| key: ${{ secrets.SERVER_KEY }} | |
| script: | | |
| set -euo pipefail | |
| cd /home/ubuntu/app | |
| echo "=== Stop containers first ===" | |
| docker compose -p myapp-stack down --remove-orphans --volumes || true | |
| echo "=== Clean old images and containers ===" | |
| docker rmi myapp:latest || true | |
| docker system prune -f | |
| echo "=== Rename JAR ===" | |
| rm -f click-0.0.1-SNAPSHOT.jar app.jar | |
| cp build/libs/*-SNAPSHOT.jar click-0.0.1-SNAPSHOT.jar | |
| echo "New JAR size: $(ls -lh click-0.0.1-SNAPSHOT.jar | awk '{print $5}')" | |
| echo "=== Create Dockerfile ===" | |
| TIMESTAMP=$(date +%s) | |
| cat > Dockerfile <<EOF | |
| FROM openjdk:17-jdk | |
| WORKDIR /app | |
| COPY click-0.0.1-SNAPSHOT.jar app.jar | |
| ENV BUILD_TIME=$TIMESTAMP | |
| ENTRYPOINT ["sh","-c","java \$JAVA_OPTS -jar /app/app.jar"] | |
| EOF | |
| echo "=== Build new image with no cache ===" | |
| docker build --no-cache --pull -t myapp:latest . | |
| echo "Image built successfully" | |
| echo "=== Create .env file ===" | |
| cat > .env <<ENV | |
| SERVER_HOST=${{ secrets.SERVER_HOST }} | |
| FRONTEND_URL=${{ secrets.FRONTEND_URL }} | |
| DB_URL=${{ secrets.DB_URL }} | |
| DB_USERNAME=${{ secrets.DB_USERNAME }} | |
| DB_PASSWORD=${{ secrets.DB_PASSWORD }} | |
| KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }} | |
| KAKAO_CLIENT_SECRET=${{ secrets.KAKAO_CLIENT_SECRET }} | |
| AWS_ACCESS_KEY=${{ secrets.AWS_ACCESS_KEY }} | |
| AWS_SECRET_KEY=${{ secrets.AWS_SECRET_KEY }} | |
| AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }} | |
| GOOGLE_API_KEY=${{ secrets.GOOGLE_API_KEY }} | |
| ENV | |
| echo "=== Start containers ===" | |
| docker compose -p myapp-stack --env-file .env up -d --force-recreate | |
| echo "=== Verify deployment ===" | |
| sleep 10 | |
| docker compose -p myapp-stack ps | |
| echo "=== Check JAR file in containers ===" | |
| docker exec myapp-local stat /app/app.jar || echo "Local container file check failed" | |
| docker exec myapp-prod stat /app/app.jar || echo "Prod container file check failed" | |
| echo "=== Final logs ===" | |
| docker compose -p myapp-stack logs --tail=30 myapp-prod | |
| docker compose -p myapp-stack logs --tail=30 myapp-local |