name: Update Demo Server on: release: types: [published] workflow_dispatch: inputs: tag: description: 'Release tag to deploy (e.g., v4.29.0)' required: true type: string jobs: update-demo: # Only run for stable releases (not pre-releases) or manual dispatch if: github.event_name == 'workflow_dispatch' || github.event.release.prerelease == false runs-on: ubuntu-latest steps: - name: Check release type run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then echo "Manual deployment triggered for: ${{ inputs.tag }}" else echo "Release: ${{ github.event.release.tag_name }}" echo "Prerelease: ${{ github.event.release.prerelease }}" echo "Updating demo server to latest stable release..." fi - name: Wait for release assets run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then TAG="${{ inputs.tag }}" else TAG="${{ github.event.release.tag_name }}" fi echo "Waiting for release assets to be available..." MAX_ATTEMPTS=30 ATTEMPT=0 while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do echo "Checking for assets (attempt $((ATTEMPT + 1))/$MAX_ATTEMPTS)..." # Check if checksums.txt and linux-amd64 tarball exist CHECKSUMS_STATUS=$(curl -sL -o /dev/null -w "%{http_code}" \ "https://github.com/rcourtman/Pulse/releases/download/${TAG}/checksums.txt") TARBALL_STATUS=$(curl -sL -o /dev/null -w "%{http_code}" \ "https://github.com/rcourtman/Pulse/releases/download/${TAG}/pulse-${TAG}-linux-amd64.tar.gz") echo "checksums.txt: $CHECKSUMS_STATUS, tarball: $TARBALL_STATUS" if [ "$CHECKSUMS_STATUS" = "200" ] && [ "$TARBALL_STATUS" = "200" ]; then echo "✅ Release assets are available!" exit 0 fi ATTEMPT=$((ATTEMPT + 1)) if [ $ATTEMPT -lt $MAX_ATTEMPTS ]; then echo "Assets not ready yet, waiting 10 seconds..." sleep 10 fi done echo "❌ Timeout waiting for release assets" exit 1 - name: Setup SSH run: | mkdir -p ~/.ssh echo "${{ secrets.DEMO_SERVER_SSH_KEY }}" > ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519 ssh-keyscan -H ${{ secrets.DEMO_SERVER_HOST }} >> ~/.ssh/known_hosts - name: Update demo server run: | ssh -i ~/.ssh/id_ed25519 ${{ secrets.DEMO_SERVER_USER }}@${{ secrets.DEMO_SERVER_HOST }} \ 'curl -fsSL https://raw.githubusercontent.com/rcourtman/Pulse/main/install.sh | sudo bash' - name: Verify update run: | # Wait a moment for service to restart sleep 5 # Check version endpoint VERSION=$(ssh -i ~/.ssh/id_ed25519 ${{ secrets.DEMO_SERVER_USER }}@${{ secrets.DEMO_SERVER_HOST }} \ "curl -s http://localhost:7655/api/version | jq -r .version") echo "Demo server is now running version: $VERSION" # Verify mock mode is active by authenticating and checking node count NODES=$(ssh -i ~/.ssh/id_ed25519 ${{ secrets.DEMO_SERVER_USER }}@${{ secrets.DEMO_SERVER_HOST }} \ 'curl -s -c /tmp/demo-cookies.txt http://localhost:7655/api/login -X POST -H "Content-Type: application/json" -d "{\"username\":\"demo\",\"password\":\"demo\"}" > /dev/null && curl -s -b /tmp/demo-cookies.txt http://localhost:7655/api/state | jq -r ".nodes | length" && rm -f /tmp/demo-cookies.txt') echo "Mock nodes detected: $NODES" if [ "$NODES" -ge 1 ]; then echo "✅ Demo server successfully updated and verified!" else echo "⚠️ Demo server updated but mock mode may not be active" exit 1 fi - name: Cleanup SSH key if: always() run: rm -f ~/.ssh/id_ed25519