Skip to content

Merge pull request #140 from Coding-Club-IITG/ps #100

Merge pull request #140 from Coding-Club-IITG/ps

Merge pull request #140 from Coding-Club-IITG/ps #100

Workflow file for this run

name: Deploy CourseHub to EC2
on:
push:
branches:
- master
jobs:
deploy:
name: Deploy on Push to Master
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Add SSH Private Key
run: |
echo "${{ secrets.EC2_KEY }}" > private_key.pem
chmod 600 private_key.pem
- name: SSH - Pull Latest Code
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF'
set -e
echo "πŸ“¦ Pulling latest code..."
cd ~/CourseHub
git reset --hard HEAD
git clean -fd
git pull origin master
EOF
- name: SSH - Update Config Files
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << EOF
set -e
echo "πŸ” Updating env and token files..."
cd ~/CourseHub/server
echo "${{ secrets.ENV_FILE }}" > .env
echo "${{ secrets.ONEDRIVE_REFRESH_TOKEN }}" > onedrive-refresh-token.token
echo "${{ secrets.ONEDRIVE_ACCESS_TOKEN }}" > onedrive-access-token.token
echo "${{ secrets.ONEDRIVE_DEVICE_CODE }}" > onedrive-device-code.token
echo "${{ secrets.LINKS_JS_FILE }}" > links.js
cd ~/CourseHub/client/src/api
echo "${{ secrets.SERVER_JS_FILE }}" > server.js
cd ~/CourseHub/admin/src/apis
echo "${{ secrets.ADMIN_SERVER_JS_FILE }}" > server.js
EOF
- name: SSH - Build Frontend
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF'
set -e
echo "🧱 Installing and building frontend..."
cd ~/CourseHub/client
npm install
npm run build
EOF
- name: SSH - Backup and Deploy Frontend
if: success()
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF'
set -e
sudo mkdir -p /usr/share/nginx/html
echo "πŸ—‚οΈ Backing up old frontend..."
timestamp=$(date +%Y%m%d-%H%M%S)
sudo mkdir -p /usr/share/nginx/html-backup
if [ -d "/usr/share/nginx/html" ] && [ "$(ls -A /usr/share/nginx/html)" ]; then
sudo cp -r /usr/share/nginx/html /usr/share/nginx/html-backup/html-$timestamp
fi
echo "πŸš€ Deploying new frontend..."
sudo rm -rf /usr/share/nginx/html/*
sudo cp -r ~/CourseHub/client/dist/* /usr/share/nginx/html/
echo "🧹 Cleaning up older backups..."
cd /usr/share/nginx/html-backup
ls -1tr | head -n -1 | xargs -r -d '\n' sudo rm -rf --
EOF
- name: Rollback on Failure
if: failure()
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF'
echo "⚠️ Build failed. Restoring backup..."
latest_backup=$(ls -1tr /usr/share/nginx/html-backup 2>/dev/null | tail -n 1 || true )
if [ -n "$latest_backup" ] && [ -d "/usr/share/nginx/html-backup/$latest_backup" ] && [ "$(ls -A /usr/share/nginx/html-backup/$latest_backup 2>/dev/null)" ]; then
echo "βœ… Found backup: $latest_backup. Restoring..."
sudo mkdir -p /usr/share/nginx/html
sudo rm -rf /usr/share/nginx/html/*
sudo cp -r /usr/share/nginx/html-backup/$latest_backup/* /usr/share/nginx/html/
fi
EOF
- name: SSH - Build Admin_Frontend
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF'
set -e
echo "🧱 Installing and building admin_frontend..."
cd ~/CourseHub/admin
npm install
npm run build
EOF
- name: SSH - Backup and Deploy Admin_Frontend
if: success()
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF'
set -e
sudo mkdir -p /usr/share/nginx/html/admin
echo "πŸ—‚οΈ Backing up old admin_frontend..."
timestamp=$(date +%Y%m%d-%H%M%S)
sudo mkdir -p /usr/share/nginx/html/admin-backup
if [ -d "/usr/share/nginx/html/admin" ] && [ "$(ls -A /usr/share/nginx/html/admin)" ]; then
sudo cp -r /usr/share/nginx/html/admin /usr/share/nginx/html/admin-backup/html-$timestamp
fi
echo "πŸš€ Deploying new admin_frontend..."
sudo rm -rf /usr/share/nginx/html/admin/*
sudo cp -r ~/CourseHub/admin/dist/* /usr/share/nginx/html/admin/
echo "🧹 Cleaning up older admin_backups..."
cd /usr/share/nginx/html/admin-backup
ls -1tr | head -n -1 | xargs -r -d '\n' sudo rm -rf --
EOF
- name: Rollback on Failure
if: failure()
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF'
echo "⚠️ Admin_Build failed. Restoring admin_backup..."
latest_backup=$(ls -1tr /usr/share/nginx/html/admin-backup 2>/dev/null | tail -n 1 || true )
if [ -n "$latest_backup" ] && [ -d "/usr/share/nginx/html/admin-backup/$latest_backup" ] && [ "$(ls -A /usr/share/nginx/html/admin-backup/$latest_backup 2>/dev/null)" ]; then
echo "βœ… Found backup: $latest_backup. Restoring..."
sudo mkdir -p /usr/share/nginx/html/admin
sudo rm -rf /usr/share/nginx/html/admin/*
sudo cp -r /usr/share/nginx/html/admin-backup/$latest_backup/* /usr/share/nginx/html/admin/
fi
EOF
- name: SSH - Restart Backend with PM2
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF'
set -e
echo "πŸ”„ Restarting server..."
cd ~/CourseHub/server
npm install
pm2 delete server || true
pm2 start index.js --name server
pm2 save
EOF
- name: SSH - Test and Reload Nginx
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF'
set -e
echo "πŸ§ͺ Testing nginx configuration..."
sudo nginx -t
echo "♻️ Reloading nginx..."
sudo systemctl reload nginx
EOF
- name: Cleanup SSH Key
if: always()
run: rm -f private_key.pem