Skip to content

Merge pull request #208 from softeer5th/fix/be/course-search #50

Merge pull request #208 from softeer5th/fix/be/course-search

Merge pull request #208 from softeer5th/fix/be/course-search #50

Workflow file for this run

name: Deploy ReactON
on:
push:
branches: [ "dev", "main" ]
paths:
- "back-end/reacton/**"
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-22.04
permissions:
contents: read
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Generate application.properties from GitHub Secrets
run: |
mkdir -p back-end/reacton/src/main/resources
rm -f back-end/reacton/src/main/resources/application.properties
touch back-end/reacton/src/main/resources/application.properties
echo "${{ secrets.PROPERTIES }}" | tr -d '\r' > back-end/reacton/src/main/resources/application.properties
ls -lh back-end/reacton/src/main/resources/
- name: Grant execute permission for gradlew
run: chmod +x back-end/reacton/gradlew
- name: Build with Gradle
run: cd back-end/reacton && ./gradlew clean build -x test --build-cache
- name: Check Build Artifact
run: ls -lh back-end/reacton/build/libs/ || (echo "Build artifact missing!" && exit 1)
- name: Docker Build and Push
run: |
sudo docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/reacton-back:latest || true
sudo docker build --platform linux/arm64 \
-f back-end/reacton/Dockerfile \
-t ${{ secrets.DOCKER_USERNAME }}/reacton-back:latest back-end/reacton
sudo docker push ${{ secrets.DOCKER_USERNAME }}/reacton-back:latest
- name: Create .env file
run: |
echo "SPRING_DATASOURCE_URL=${{ secrets.DB_URL }}" > .env
echo "SPRING_DATASOURCE_USERNAME=${{ secrets.DB_USERNAME }}" >> .env
echo "SPRING_DATASOURCE_PASSWORD=${{ secrets.DB_PASSWORD }}" >> .env
echo "SPRING_JPA_HIBERNATE_DDL_AUTO=${{ secrets.SPRING_JPA_HIBERNATE_DDL_AUTO }}" >> .env
echo "OAUTH_GOOGLE_CLIENT_ID=${{ secrets.OAUTH_GOOGLE_CLIENT_ID }}" >> .env
echo "OAUTH_GOOGLE_CLIENT_SECRET=${{ secrets.OAUTH_GOOGLE_CLIENT_SECRET }}" >> .env
echo "JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }}" >> .env
echo "AWS_REGION=${{ secrets.AWS_REGION }}" >> .env
echo "AWS_BUCKET_NAME=${{ secrets.AWS_BUCKET_NAME }}" >> .env
echo "DOCKER_USERNAME=${{ secrets.DOCKER_USERNAME }}" >> .env
- name: Setup SSH Key
run: |
echo "${{ secrets.EC2_PRIVATE_KEY }}" > private_key.pem
chmod 600 private_key.pem
- name: Upload .env file using rsync
run: |
rsync -avz -e "ssh -o StrictHostKeyChecking=no -i private_key.pem" .env ubuntu@${{ secrets.HOST }}:/home/ubuntu/app/back-end/reacton/
- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ubuntu
key: ${{ secrets.EC2_PRIVATE_KEY }}
script: |
set -e
cd ~/app/back-end/reacton
echo "🔄 Pulling latest Docker images..."
sudo docker-compose pull --quiet || { echo "❌ Failed to pull Docker images"; exit 1; }
echo "🚀 Running Docker containers..."
sudo docker-compose up -d --remove-orphans || { echo "❌ Failed to start containers"; exit 1; }
echo "🧹 Deleting .env file for security..."
rm -f .env
echo "🧹 Cleaning up unused images..."
sudo docker image prune -f || { echo "❌ Failed to prune Docker images"; exit 1; }
echo "✅ Deployment completed successfully!"