Skip to content

🏥 ci: add post-deploy health check to verify bot startup #19

🏥 ci: add post-deploy health check to verify bot startup

🏥 ci: add post-deploy health check to verify bot startup #19

Workflow file for this run

name: Deploy to Dev Server
on:
push:
branches: [main]
workflow_dispatch:
jobs:
checks:
uses: ./.github/workflows/python-checks.yml
build-and-push:
needs: checks
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: |
hendisantika/jvmid-bot:latest
hendisantika/jvmid-bot:${{ github.sha }}
hendisantika/jvmid-bot:${{ github.run_number }}
cache-from: type=gha
cache-to: type=gha,mode=max
deploy:
needs: build-and-push
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.DEV_SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
echo "${{ secrets.DEV_SSH_KNOWN_HOSTS }}" > ~/.ssh/known_hosts
chmod 644 ~/.ssh/known_hosts
- name: Create app directory on server
run: |
ssh deployer@103.31.204.189 'mkdir -p ~/jvmid-bot/data'
- name: Write .env file to server
run: |
ssh deployer@103.31.204.189 "echo '${{ vars.DEV_ENV_FILE }}' > ~/jvmid-bot/.env"
- name: Write groups.json to server
run: |
ssh deployer@103.31.204.189 "echo '${{ vars.DEV_GROUPS_JSON }}' > ~/jvmid-bot/groups.json"
- name: Copy docker-compose.prod.yml to server
run: |
scp docker-compose.prod.yml deployer@103.31.204.189:~/jvmid-bot/docker-compose.prod.yml
- name: Deploy on server
run: |
ssh deployer@103.31.204.189 "cd ~/jvmid-bot && export DOCKER_UID=\$(id -u) DOCKER_GID=\$(id -g) && IMAGE_TAG=${{ github.run_number }} docker compose -f docker-compose.prod.yml pull && IMAGE_TAG=${{ github.run_number }} docker compose -f docker-compose.prod.yml up -d && docker image prune -f && echo 'Deployment complete (tag: ${{ github.run_number }}). Running containers:' && docker ps --filter 'name=jvmid-bot'"
- name: Health check
run: |
echo "Waiting 15s for bot to start..."
sleep 15
ssh deployer@103.31.204.189 '
echo "=== Container Status ==="
docker ps --filter "name=jvmid-bot" --format "table {{.Names}}\t{{.Status}}\t{{.RunningFor}}"
echo ""
echo "=== Bot Startup Logs ==="
docker logs jvmid-bot --tail 30 2>&1
echo ""
echo "=== Health Checks ==="
# Check container is running
if docker ps --filter "name=jvmid-bot" --filter "status=running" -q | grep -q .; then
echo "✅ Container is running"
else
echo "❌ Container is NOT running"
docker logs jvmid-bot --tail 50 2>&1
exit 1
fi
# Check groups loaded from logs
GROUPS_LOADED=$(docker logs jvmid-bot 2>&1 | grep -c "Registered group" || true)
if [ "$GROUPS_LOADED" -ge 1 ]; then
echo "✅ $GROUPS_LOADED group(s) registered"
else
echo "❌ No groups registered - check groups.json and logs"
exit 1
fi
# Check no crash loops (container restarted)
RESTART_COUNT=$(docker inspect jvmid-bot --format="{{.RestartCount}}" 2>/dev/null || echo "0")
if [ "$RESTART_COUNT" -eq 0 ]; then
echo "✅ No restarts detected"
else
echo "⚠️ Container restarted $RESTART_COUNT time(s)"
fi
echo ""
echo "=== Deployment healthy ==="
'