diff --git a/.github/workflows/deploy-express-backend.yml b/.github/workflows/deploy-express-backend.yml index 0b312a26e..a489c9713 100644 --- a/.github/workflows/deploy-express-backend.yml +++ b/.github/workflows/deploy-express-backend.yml @@ -80,15 +80,15 @@ jobs: echo "Installing production dependencies on server..." # Install deps for workspace packages first - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com "cd /home/skuilder/dist/express-backend/$newversion/workspace/common && source ~/.nvm/nvm.sh && NODE_ENV=production yarn install --production --immutable" - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com "cd /home/skuilder/dist/express-backend/$newversion/workspace/db && source ~/.nvm/nvm.sh && NODE_ENV=production yarn install --production --immutable" + ssh ${{ secrets.DO_USERNAME }}@eduquilt.com "cd /home/skuilder/dist/express-backend/$newversion/workspace/common && source ~/.nvm/nvm.sh && NODE_ENV=production yarn install --immutable" + ssh ${{ secrets.DO_USERNAME }}@eduquilt.com "cd /home/skuilder/dist/express-backend/$newversion/workspace/db && source ~/.nvm/nvm.sh && NODE_ENV=production yarn install --immutable" # Create a modified package.json with file: references for workspace deps echo "Creating package.json with resolved workspace paths..." ssh ${{ secrets.DO_USERNAME }}@eduquilt.com "cd /home/skuilder/dist/express-backend/$newversion && cat package.json | jq '.dependencies[\"@vue-skuilder/common\"] = \"file:./workspace/common\" | .dependencies[\"@vue-skuilder/db\"] = \"file:./workspace/db\"' > package.json.tmp && mv package.json.tmp package.json" # Install express package dependencies - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com "cd /home/skuilder/dist/express-backend/$newversion && source ~/.nvm/nvm.sh && NODE_ENV=production yarn install --production --immutable" + ssh ${{ secrets.DO_USERNAME }}@eduquilt.com "cd /home/skuilder/dist/express-backend/$newversion && source ~/.nvm/nvm.sh && NODE_ENV=production yarn install --immutable" echo "Setting symlink to new version..." ssh ${{ secrets.DO_USERNAME }}@eduquilt.com ln -sfn /home/skuilder/dist/express-backend/$newversion /home/skuilder/express-backend diff --git a/.github/workflows/deprecated-deploy-caddyfile.yml b/.github/workflows/deprecated-deploy-caddyfile.yml deleted file mode 100644 index 7db0fbc69..000000000 --- a/.github/workflows/deprecated-deploy-caddyfile.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: deploy-caddyfile -on: - pull_request: - branches: - - deploy - paths: - - '.deployment/Caddyfile' -jobs: - deploy_caddyfile: - runs-on: ubuntu-latest - steps: - - name: Check out repository code - uses: actions/checkout@v2 - - name: auth step - uses: shimataro/ssh-key-action@v2 - with: - key: ${{ secrets.DO_SSH_KEY }} - name: id_rsa - known_hosts: ${{ secrets.KNOWN_HOSTS }} - - run: | - echo "deploying updated Caddyfile in place of prior" - scp .deployment/Caddyfile ${{ secrets.DO_USERNAME }}@eduquilt.com:~/Caddyfile - echo "reloading the caddyfile" - ssh -t ${{ secrets.DO_USERNAME }}@eduquilt.com 'curl localhost:2019/load \ - -X POST \ - -H "Content-Type: text/caddyfile" \ - --data-binary @Caddyfile' diff --git a/.github/workflows/deprecated-deploy-express-serverside.yml b/.github/workflows/deprecated-deploy-express-serverside.yml deleted file mode 100644 index 99f63cf0e..000000000 --- a/.github/workflows/deprecated-deploy-express-serverside.yml +++ /dev/null @@ -1,109 +0,0 @@ -name: deploy-express-serverside -on: - workflow_dispatch: - inputs: - reason: - description: 'Reason for deploying Express API' - required: true - default: 'Manual trigger' - -jobs: - deploy-express: - runs-on: ubuntu-latest - steps: - - name: Trigger server-side deployment - run: | - echo "🚀 Triggering server-side deployment..." - echo "Reason: ${{ github.event.inputs.reason || 'Push to master' }}" - echo "Commit: ${{ github.sha }}" - echo "Branch: ${{ github.ref_name }}" - - - name: Configure SSH key - uses: shimataro/ssh-key-action@v2 - with: - key: ${{ secrets.DO_SSH_KEY }} - name: id_rsa - known_hosts: ${{ secrets.KNOWN_HOSTS }} - - - name: Execute deployment on server - run: | - echo "Connecting to server and executing deployment..." - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com << 'EOF' - set -e - - # Log deployment start - echo "=== Deployment started at $(date) ===" - echo "Triggered by: ${{ github.event.inputs.reason || 'Push to master' }}" - echo "Commit: ${{ github.sha }}" - echo "Branch: ${{ github.ref_name }}" - - # Change to deployment script directory - cd /home/skuilder - - # Execute the deployment script - echo "${{ secrets.SUDO_PASSWORD }}" | sudo -S ./deploy-express-minimal-downtime.sh - - echo "=== Deployment completed at $(date) ===" - EOF - - - name: Verify deployment - run: | - echo "Verifying Express API deployment..." - max_retries=3 - retry_count=0 - while [ $retry_count -lt $max_retries ]; do - response=$(curl -sS https://eduquilt.com/express) - if [[ $? -ne 0 ]]; then - echo "Error: Failed to fetch https://eduquilt.com/express" - retry_count=$((retry_count+1)) - if [ $retry_count -lt $max_retries ]; then - echo "Retrying in 5 seconds... (Attempt $retry_count of $max_retries)" - sleep 5 - continue - else - exit 1 - fi - fi - - if echo "$response" | grep -q "${{ github.SHA }}"; then - echo "Success. Current version found in production" - - # Log deployment success - echo "✅ Express API deployed successfully with version ${{ github.SHA }}" - echo "✅ Deployment triggered by: ${{ github.event.inputs.reason || 'Push to master' }}" - echo "✅ Deployment timestamp: $(date -u)" - - exit 0 - else - echo "Current version not found in production. Retrying..." - retry_count=$((retry_count+1)) - if [ $retry_count -lt $max_retries ]; then - echo "Retrying in 5 seconds... (Attempt $retry_count of $max_retries)" - sleep 5 - else - echo "Error! Max retries reached. Current version not reported by production." - echo "Response received:" - echo "$response" - exit 1 - fi - fi - done - - - name: Deployment failure cleanup - if: failure() - run: | - echo "🔄 Deployment failed. Checking for rollback options..." - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com << 'EOF' - cd /home/skuilder - echo "Available builds for potential rollback:" - ./manage-deployment.sh list - - echo "Current service status:" - ./manage-deployment.sh status - - echo "Recent service logs:" - ./manage-deployment.sh logs 20 || true - EOF - - echo "💡 To rollback manually, SSH to server and run:" - echo " ./manage-deployment.sh rollback " diff --git a/.github/workflows/deprecated-deploy-express-service-file.yml b/.github/workflows/deprecated-deploy-express-service-file.yml deleted file mode 100644 index 9c7c58f60..000000000 --- a/.github/workflows/deprecated-deploy-express-service-file.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: deploy-service-file -on: - pull_request: - branches: - - deploy - paths: - - '.deployment/eqExpress.service' -jobs: - deploy_service_file: - runs-on: ubuntu-latest - steps: - - name: Check out repository code - uses: actions/checkout@v2 - - name: auth step - uses: shimataro/ssh-key-action@v2 - with: - key: ${{ secrets.DO_SSH_KEY }} - name: id_rsa - known_hosts: ${{ secrets.KNOWN_HOSTS }} - - run: | - echo "deploying updated eqExpress.service file in place of prior" - scp .deployment/eqExpress.service ${{ secrets.DO_USERNAME }}@eduquilt.com:~/eqExpress.service - echo "restarting the service" - ssh -t ${{ secrets.DO_USERNAME }}@eduquilt.com 'echo ${{ secrets.DO_PASSWORD }} | sudo -S systemctl restart eqExpress' diff --git a/.github/workflows/deprecated-deploy-express.yml b/.github/workflows/deprecated-deploy-express.yml deleted file mode 100644 index 450baee23..000000000 --- a/.github/workflows/deprecated-deploy-express.yml +++ /dev/null @@ -1,167 +0,0 @@ -name: deploy-express -on: - workflow_dispatch: - inputs: - reason: - description: 'Reason for deploying Express API' - required: true - default: 'Manual trigger' -jobs: - deploy-express: - runs-on: ubuntu-latest - steps: - - run: echo "🎉 The job was triggered by a ${{ github.event_name }} on commit ${{ github.SHA }}" - - name: Check out repository code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 18 - cache: 'yarn' - - name: Enable Corepack - run: corepack enable - - - name: Configure SSH key - uses: shimataro/ssh-key-action@v2 - with: - key: ${{ secrets.DO_SSH_KEY }} - name: id_rsa - known_hosts: ${{ secrets.KNOWN_HOSTS }} - - - name: Install dependencies - run: yarn install - - - name: Install jq (for JSON manipulation) - run: sudo apt-get update && sudo apt-get install -y jq - - - name: Build workspace dependencies - run: | - # Build common package if it exists - if [ -d "./packages/common" ]; then - echo "Building @vue-skuilder/common package..." - cd ./packages/common - yarn build - cd ../.. - fi - - # Build db package if it exists - if [ -d "./packages/db" ]; then - echo "Building @vue-skuilder/db package..." - cd ./packages/db - yarn build - cd ../.. - fi - - - name: Build Express API - run: | - cd ./packages/express - yarn build - - - name: Deploy and run - run: | - - # Create necessary directories - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com mkdir -p /home/skuilder/dist/express/${{github.sha}} - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com mkdir -p /home/skuilder/dist/express/${{github.sha}}/assets - - # Copy build artifacts and dependencies - rsync -rl ./packages/express/dist/ ${{ secrets.DO_USERNAME }}@eduquilt.com:/home/skuilder/dist/express/${{github.sha}} - rsync -rl ./packages/express/assets/ ${{ secrets.DO_USERNAME }}@eduquilt.com:/home/skuilder/dist/express/${{github.sha}}/assets - rsync -rl ./packages/express/package.json ${{ secrets.DO_USERNAME }}@eduquilt.com:/home/skuilder/dist/express/${{github.sha}} - - # Handle workspace dependencies by copying them to the server - if [ -d "./packages/common" ]; then - echo "Copying @vue-skuilder/common package..." - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com mkdir -p /home/skuilder/dist/common/dist - rsync -rl ./packages/common/dist/ ${{ secrets.DO_USERNAME }}@eduquilt.com:/home/skuilder/dist/common/dist - rsync -rl ./packages/common/package.json ${{ secrets.DO_USERNAME }}@eduquilt.com:/home/skuilder/dist/common/ - fi - - if [ -d "./packages/db" ]; then - echo "Copying @vue-skuilder/db package..." - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com mkdir -p /home/skuilder/dist/db/dist - rsync -rl ./packages/db/dist/ ${{ secrets.DO_USERNAME }}@eduquilt.com:/home/skuilder/dist/db/dist - rsync -rl ./packages/db/package.json ${{ secrets.DO_USERNAME }}@eduquilt.com:/home/skuilder/dist/db/ - fi - - # Create package.json with absolute paths instead of workspace references - echo "Creating package.json with resolved dependency paths..." - cat ./packages/express/package.json | jq '.dependencies["@vue-skuilder/common"] = "file:/home/skuilder/dist/common" | .dependencies["@vue-skuilder/db"] = "file:/home/skuilder/dist/db"' > ./packages/express/temp-package.json - # Upload the modified package.json - rsync -rl ./packages/express/temp-package.json ${{ secrets.DO_USERNAME }}@eduquilt.com:/home/skuilder/dist/express/${{github.sha}}/package.json - - # First install dependencies for common and db packages - if [ -d "./packages/common" ]; then - echo "Installing dependencies for common package..." - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com "cd /home/skuilder/dist/common && source ~/.nvm/nvm.sh && NODE_ENV=production yarn install --no-immutable" - fi - - if [ -d "./packages/db" ]; then - echo "Installing dependencies for db package..." - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com "cd /home/skuilder/dist/db && source ~/.nvm/nvm.sh && NODE_ENV=production yarn install --no-immutable" - fi - - # Now install dependencies for express app - echo "Installing dependencies for Express app..." - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com "cd /home/skuilder/dist/express/${{github.sha}} && source ~/.nvm/nvm.sh && NODE_ENV=production yarn install --no-immutable" - - # Update symlink to new version - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com ln -sfn /home/skuilder/dist/express/${{github.SHA}} /home/skuilder/api - - # Update environment variables - ssh ${{ secrets.DO_USERNAME }}@eduquilt.com rm -f /home/skuilder/.env.development.local - ssh -t ${{ secrets.DO_USERNAME }}@eduquilt.com 'echo VERSION=${{ github.SHA }} >> /home/skuilder/.env.development.local' - ssh -t ${{ secrets.DO_USERNAME }}@eduquilt.com 'echo COUCHDB_ADMIN=${{ secrets.COUCHDB_ADMIN }} >> /home/skuilder/.env.development.local' - ssh -t ${{ secrets.DO_USERNAME }}@eduquilt.com 'echo COUCHDB_PASSWORD=${{ secrets.COUCHDB_PASSWORD }} >> /home/skuilder/.env.development.local' - ssh -t ${{ secrets.DO_USERNAME }}@eduquilt.com 'echo COUCHDB_PROTOCOL=${{ secrets.COUCHDB_PROTOCOL }} >> /home/skuilder/.env.development.local' - ssh -t ${{ secrets.DO_USERNAME }}@eduquilt.com 'echo COUCHDB_SERVER=${{ secrets.COUCHDB_SERVER }} >> /home/skuilder/.env.development.local' - - # Restart service - echo "Restarting Express service..." - ssh -t ${{ secrets.DO_USERNAME }}@eduquilt.com 'echo ${{ secrets.DO_PASSWORD }} | sudo -S systemctl restart eqExpress' - - echo "Waiting for service to start..." - sleep 10s - - name: Verify deployment - run: | - echo "Verifying Express API deployment..." - max_retries=3 - retry_count=0 - while [ $retry_count -lt $max_retries ]; do - response=$(curl -sS https://eduquilt.com/express) - if [[ $? -ne 0 ]]; then - echo "Error: Failed to fetch https://eduquilt.com/express" - retry_count=$((retry_count+1)) - if [ $retry_count -lt $max_retries ]; then - echo "Retrying in 5 seconds... (Attempt $retry_count of $max_retries)" - sleep 5 - continue - else - exit 1 - fi - fi - - if echo "$response" | grep -q "${{ github.SHA }}"; then - echo "Success. Current version found in production" - - # Log deployment success - echo "✅ Express API deployed successfully with version ${{ github.SHA }}" - echo "✅ Deployment triggered by: ${{ github.event.inputs.reason }}" - echo "✅ Deployment timestamp: $(date -u)" - - exit 0 - else - echo "Current version not found in production. Retrying..." - retry_count=$((retry_count+1)) - if [ $retry_count -lt $max_retries ]; then - echo "Retrying in 5 seconds... (Attempt $retry_count of $max_retries)" - sleep 5 - else - echo "Error! Max retries reached. Current version not reported by production." - echo "Response received:" - echo "$response" - exit 1 - fi - fi - done