Fix OAuth login - Update servlets to use application.properties inste… #11
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 to Oracle Cloud | |
| on: | |
| push: | |
| branches: [ main ] | |
| workflow_dispatch: | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v3 | |
| - name: Set up JDK 21 | |
| uses: actions/setup-java@v3 | |
| with: | |
| java-version: '21' | |
| distribution: 'temurin' | |
| cache: maven | |
| - name: Build with Maven | |
| run: mvn clean package -DskipTests | |
| - name: Deploy to Oracle Cloud | |
| env: | |
| PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} | |
| HOST: ${{ secrets.HOST }} | |
| USER: ${{ secrets.USER }} | |
| run: | | |
| set -euo pipefail | |
| # Create SSH directory | |
| mkdir -p ~/.ssh | |
| # Add private key safely | |
| printf '%s\n' "$PRIVATE_KEY" > ~/.ssh/deploy_key | |
| chmod 600 ~/.ssh/deploy_key | |
| # Add host to known_hosts | |
| ssh-keyscan -H $HOST >> ~/.ssh/known_hosts | |
| # Ensure WAR exists | |
| if [ ! -f target/clippr.war ]; then | |
| echo "WAR not found: target/clippr.war" | |
| exit 1 | |
| fi | |
| echo "WAR file found, size: $(du -h target/clippr.war | cut -f1)" | |
| # Copy WAR file to server | |
| echo "Uploading WAR file to server..." | |
| scp -i ~/.ssh/deploy_key target/clippr.war $USER@$HOST:/tmp/clippr.war | |
| echo "Upload complete" | |
| # Deploy on server | |
| echo "Deploying application..." | |
| ssh -i ~/.ssh/deploy_key $USER@$HOST << 'ENDSSH' | |
| set -euo pipefail | |
| echo "Stopping Tomcat..." | |
| sudo systemctl stop tomcat || true | |
| sleep 3 | |
| # Backup current deployment | |
| if [ -f /opt/tomcat/webapps/ROOT.war ]; then | |
| echo "Backing up previous deployment..." | |
| sudo cp /opt/tomcat/webapps/ROOT.war /opt/tomcat/webapps/ROOT.war.backup.$(date +%Y%m%d_%H%M%S) | |
| fi | |
| # Remove old deployment completely | |
| echo "Cleaning old deployment..." | |
| sudo rm -rf /opt/tomcat/webapps/ROOT | |
| sudo rm -f /opt/tomcat/webapps/ROOT.war | |
| # Clean Tomcat work directory (important!) | |
| sudo rm -rf /opt/tomcat/work/Catalina/localhost/ROOT | |
| # Deploy new WAR as ROOT.war | |
| echo "Deploying new WAR file as ROOT..." | |
| sudo cp /tmp/clippr.war /opt/tomcat/webapps/ROOT.war | |
| sudo chown tomcat:tomcat /opt/tomcat/webapps/ROOT.war | |
| # Clean up temp | |
| rm /tmp/clippr.war | |
| # Start Tomcat | |
| echo "Starting Tomcat..." | |
| sudo systemctl start tomcat | |
| # Wait for Tomcat to start | |
| echo "Waiting for Tomcat to start..." | |
| sleep 10 | |
| # Check Tomcat status | |
| if sudo systemctl is-active --quiet tomcat; then | |
| echo "Tomcat is running" | |
| else | |
| echo "Tomcat failed to start" | |
| sudo systemctl status tomcat --no-pager | |
| exit 1 | |
| fi | |
| ENDSSH | |
| echo "Deployment commands completed" | |
| - name: Verify Deployment | |
| env: | |
| HOST: ${{ secrets.HOST }} | |
| USER: ${{ secrets.USER }} | |
| PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} | |
| run: | | |
| set -euo pipefail | |
| echo "Verifying deployment..." | |
| # SSH Key Setup | |
| mkdir -p ~/.ssh | |
| printf '%s\n' "$PRIVATE_KEY" > ~/.ssh/deploy_key | |
| chmod 600 ~/.ssh/deploy_key | |
| ssh-keyscan -H $HOST >> ~/.ssh/known_hosts | |
| # Use a temporary file to capture the remote script's output (including the successful messages) | |
| REMOTE_OUTPUT=$(mktemp) | |
| # Execute SSH command: | |
| # -qT: Quiet mode to suppress MOTD/banner; Disable pseudo-terminal. | |
| # 2>&1 | tee ${REMOTE_OUTPUT}: Pipes ALL output (stdout and stderr) to both the console AND the temp file. | |
| ssh -qT -i ~/.ssh/deploy_key $USER@$HOST 2>&1 | tee ${REMOTE_OUTPUT} << 'ENDSSH' | |
| set -euo pipefail | |
| echo "Waiting for application to deploy (this can take up to 2 minutes)..." | |
| MAX_WAIT=120 # 2 minutes total | |
| ELAPSED=0 | |
| while [ $ELAPSED -lt $MAX_WAIT ]; do | |
| # Check multiple indicators of successful deployment | |
| # 1. Check if WAR file exists | |
| if [ ! -f /opt/tomcat/webapps/ROOT.war ]; then | |
| echo "ROOT.war file missing from webapps!" | |
| exit 1 | |
| fi | |
| # 2. Check if directory was exploded OR if application is responding | |
| # We use 2>/dev/null here to suppress the error from ls if ROOT doesn't exist yet | |
| if sudo ls -d /opt/tomcat/webapps/ROOT 2>/dev/null; then | |
| echo "Application directory found (ROOT)" | |
| # 3. Check if application is actually responding | |
| if curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/ | grep -q "200\|302"; then | |
| echo "Application is responding at root context!" | |
| echo "Deployment verified successfully!" | |
| exit 0 | |
| else | |
| echo "Directory exists but app not responding yet, waiting..." | |
| fi | |
| else | |
| echo "Waiting for ROOT.war to explode... ($ELAPSED/${MAX_WAIT}s)" | |
| fi | |
| sleep 5 | |
| ELAPSED=$((ELAPSED + 5)) | |
| done | |
| # Timeout reached | |
| echo "Deployment verification timed out after ${MAX_WAIT} seconds" | |
| echo "" | |
| echo "Diagnostic information:" | |
| echo "--- Tomcat Status ---" | |
| sudo systemctl status tomcat --no-pager || true | |
| echo "" | |
| echo "--- Webapps Directory ---" | |
| sudo ls -lah /opt/tomcat/webapps/ || true | |
| echo "" | |
| echo "--- Recent Tomcat Logs ---" | |
| sudo tail -50 /opt/tomcat/logs/catalina.out || true | |
| exit 1 | |
| ENDSSH | |
| # Capture the exit status of the SSH command immediately | |
| STATUS=$? | |
| # Clean up the temp file (the tee command above already printed the output) | |
| # rm ${REMOTE_OUTPUT} # This line is often unnecessary if tee is used correctly, removed for simplicity | |
| # Now, evaluate the clean exit status | |
| if [ $STATUS -eq 0 ]; then | |
| echo "Verification PASSED - Application deployed successfully!" | |
| else | |
| echo "Verification FAILED: Remote check returned exit code ${STATUS}." | |
| exit 1 # Fail the job if verification fails | |
| fi |