Merge pull request #138 from Coding-Club-IITG/aditya2 #98
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: 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 |