bytelyst-devops-tools/deployment-status.sh
root b5a86b40e0 feat(devops): add deployment status report script
Add comprehensive deployment status script that provides:
- Docker container status (backend/web)
- Deployed commit information from devops endpoint
- Git repository status (branch, commits, uncommitted changes)
- Health endpoint status (local and production)
- Recent deployment history (container creation times)
- Suggested actions based on current state

Usage: ./deployment-status.sh

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-12 20:40:53 +00:00

344 lines
16 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
set -euo pipefail
# ═══════════════════════════════════════════════════════════════════════
# ByteLyst Investment Trading - Deployment Status Report
# ═══════════════════════════════════════════════════════════════════════
# Usage: ./deployment-status.sh
#
# What it does:
# 1. Shows Docker container status
# 2. Shows deployed commit hashes from devops endpoint
# 3. Shows git log of recent commits
# 4. Shows health endpoint status
# 5. Shows recent deployment history
# 6. Provides suggested actions
# ═══════════════════════════════════════════════════════════════════════
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; BLUE='\033[0;34m'; NC='\033[0m'
log() { echo -e "${CYAN}[$(date +%H:%M:%S)]${NC} $*"; }
ok() { echo -e "${GREEN}[$(date +%H:%M:%S)] ✓${NC} $*"; }
warn() { echo -e "${YELLOW}[$(date +%H:%M:%S)] ⚠${NC} $*"; }
fail() { echo -e "${RED}[$(date +%H:%M:%S)] ✗${NC} $*"; }
info() { echo -e "${BLUE}[$(date +%H:%M:%S)] ${NC} $*"; }
# ── Configuration ────────────────────────────────────────────────────
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_DIR="${SCRIPT_DIR}/../learning_ai_invt_trdg"
BACKEND_URL="http://localhost:4025"
WEB_URL="http://localhost:3085"
API_ENDPOINT="https://api.bytelyst.com/invttrdg"
WEB_ENDPOINT="https://invttrdg.bytelyst.com"
# ── Header ─────────────────────────────────────────────────────────────
echo ""
echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${CYAN}${NC} ByteLyst Investment Trading - Deployment Status Report ${CYAN}${NC}"
echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════╝${NC}"
echo ""
info "Report generated at: $(date)"
echo ""
# ── Docker Container Status ─────────────────────────────────────────────
log "══════════════════════════════════════════════════════════════════════"
log "DOCKER CONTAINER STATUS"
log "══════════════════════════════════════════════════════════════════════"
echo ""
BACKEND_CONTAINER="invttrdg-backend"
WEB_CONTAINER="invttrdg-web"
# Check if containers exist
BACKEND_EXISTS=false
WEB_EXISTS=false
if docker ps -a --format '{{.Names}}' | grep -q "^${BACKEND_CONTAINER}$"; then
BACKEND_EXISTS=true
fi
if docker ps -a --format '{{.Names}}' | grep -q "^${WEB_CONTAINER}$"; then
WEB_EXISTS=true
fi
if [ "$BACKEND_EXISTS" = false ] && [ "$WEB_EXISTS" = false ]; then
fail "No containers found. Deployment may not be complete."
echo ""
else
# Backend container status
if [ "$BACKEND_EXISTS" = true ]; then
BACKEND_STATUS=$(docker inspect --format='{{.State.Status}}' "$BACKEND_CONTAINER" 2>/dev/null || echo "unknown")
BACKEND_RUNNING=$(docker inspect --format='{{.State.Running}}' "$BACKEND_CONTAINER" 2>/dev/null || echo "false")
BACKEND_CREATED=$(docker inspect --format='{{.Created}}' "$BACKEND_CONTAINER" 2>/dev/null || echo "unknown")
if [ "$BACKEND_RUNNING" = "true" ]; then
ok "Backend container: $BACKEND_CONTAINER"
info " Status: Running"
info " Created: $BACKEND_CREATED"
else
warn "Backend container: $BACKEND_CONTAINER"
info " Status: $BACKEND_STATUS (not running)"
info " Created: $BACKEND_CREATED"
fi
else
warn "Backend container not found: $BACKEND_CONTAINER"
fi
echo ""
# Web container status
if [ "$WEB_EXISTS" = true ]; then
WEB_STATUS=$(docker inspect --format='{{.State.Status}}' "$WEB_CONTAINER" 2>/dev/null || echo "unknown")
WEB_RUNNING=$(docker inspect --format='{{.State.Running}}' "$WEB_CONTAINER" 2>/dev/null || echo "false")
WEB_CREATED=$(docker inspect --format='{{.Created}}' "$WEB_CONTAINER" 2>/dev/null || echo "unknown")
if [ "$WEB_RUNNING" = "true" ]; then
ok "Web container: $WEB_CONTAINER"
info " Status: Running"
info " Created: $WEB_CREATED"
else
warn "Web container: $WEB_CONTAINER"
info " Status: $WEB_STATUS (not running)"
info " Created: $WEB_CREATED"
fi
else
warn "Web container not found: $WEB_CONTAINER"
fi
echo ""
fi
# ── Deployed Commit Information ──────────────────────────────────────────
log "══════════════════════════════════════════════════════════════════════"
log "DEPLOYED COMMIT INFORMATION"
log "══════════════════════════════════════════════════════════════════════"
echo ""
if [ "$BACKEND_EXISTS" = true ] && [ "$BACKEND_RUNNING" = "true" ]; then
DEVOPS_RESPONSE=$(curl -s "$BACKEND_URL/api/devops/version" 2>/dev/null || echo "{}")
if [ "$DEVOPS_RESPONSE" != "{}" ] && [ -n "$DEVOPS_RESPONSE" ]; then
if command -v jq &> /dev/null; then
DEPLOYED_COMMIT_SHA=$(echo "$DEVOPS_RESPONSE" | jq -r '.commitSha // empty')
DEPLOYED_COMMIT_SHA_FULL=$(echo "$DEVOPS_RESPONSE" | jq -r '.commitShaFull // empty')
DEPLOYED_BRANCH=$(echo "$DEVOPS_RESPONSE" | jq -r '.branch // empty')
DEPLOYED_BUILT_AT=$(echo "$DEVOPS_RESPONSE" | jq -r '.builtAt // empty')
DEPLOYED_AUTHOR=$(echo "$DEVOPS_RESPONSE" | jq -r '.commitAuthor // empty')
DEPLOYED_MESSAGE=$(echo "$DEVOPS_RESPONSE" | jq -r '.commitMessage // empty')
DEPLOYED_IMAGE=$(echo "$DEVOPS_RESPONSE" | jq -r '.dockerImage // empty')
ok "Backend deployment info:"
info " Commit SHA: ${DEPLOYED_COMMIT_SHA}"
info " Commit SHA (full): ${DEPLOYED_COMMIT_SHA_FULL}"
info " Branch: ${DEPLOYED_BRANCH}"
info " Built at: ${DEPLOYED_BUILT_AT}"
info " Author: ${DEPLOYED_AUTHOR}"
info " Message: ${DEPLOYED_MESSAGE}"
info " Docker image: ${DEPLOYED_IMAGE}"
else
warn "jq not installed, showing raw response:"
echo "$DEVOPS_RESPONSE"
fi
else
warn "Could not retrieve deployment info from devops endpoint"
fi
else
warn "Backend container not running, cannot retrieve deployment info"
fi
echo ""
# ── Git Repository Status ───────────────────────────────────────────────
log "══════════════════════════════════════════════════════════════════════"
log "GIT REPOSITORY STATUS"
log "══════════════════════════════════════════════════════════════════════"
echo ""
if [ -d "$REPO_DIR" ]; then
cd "$REPO_DIR"
# Current branch
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")
info "Current branch: $CURRENT_BRANCH"
# Latest commit
LATEST_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
LATEST_AUTHOR=$(git log -1 --pretty=format:'%an' 2>/dev/null || echo "unknown")
LATEST_MESSAGE=$(git log -1 --pretty=format:'%s' 2>/dev/null | head -c 200 || echo "unknown")
LATEST_DATE=$(git log -1 --pretty=format:'%ai' 2>/dev/null || echo "unknown")
info "Latest commit: $LATEST_COMMIT"
info " Author: $LATEST_AUTHOR"
info " Date: $LATEST_DATE"
info " Message: $LATEST_MESSAGE"
echo ""
# Compare deployed vs latest
if [ -n "${DEPLOYED_COMMIT_SHA:-}" ] && [ "$DEPLOYED_COMMIT_SHA" != "unknown" ]; then
if [ "$DEPLOYED_COMMIT_SHA" = "$LATEST_COMMIT" ]; then
ok "Deployed commit matches latest commit in repository"
else
warn "Deployed commit ($DEPLOYED_COMMIT_SHA) differs from latest commit ($LATEST_COMMIT)"
info " Consider running deployment script to update"
fi
fi
echo ""
# Recent commits
log "Recent commits (last 5):"
git log --oneline -5 2>/dev/null || warn "Could not retrieve commit history"
echo ""
# Uncommitted changes
if ! git diff-index --quiet HEAD -- 2>/dev/null; then
warn "Uncommitted changes detected"
git diff --stat 2>/dev/null || true
else
ok "No uncommitted changes"
fi
echo ""
# Unpushed commits
LOCAL_COMMIT=$(git rev-parse @ 2>/dev/null || echo "")
REMOTE_COMMIT=$(git rev-parse '@{u}' 2>/dev/null || echo "")
if [ -n "$REMOTE_COMMIT" ] && [ "$LOCAL_COMMIT" != "$REMOTE_COMMIT" ]; then
warn "Unpushed commits detected"
info " Local: $LOCAL_COMMIT"
info " Remote: $REMOTE_COMMIT"
else
ok "All commits are pushed"
fi
else
warn "Repository directory not found: $REPO_DIR"
fi
echo ""
# ── Health Endpoint Status ───────────────────────────────────────────────
log "══════════════════════════════════════════════════════════════════════"
log "HEALTH ENDPOINT STATUS"
log "══════════════════════════════════════════════════════════════════════"
echo ""
# Backend health
if curl -sf "$BACKEND_URL/health/live" > /dev/null 2>&1; then
ok "Backend health endpoint: $BACKEND_URL/health/live"
HEALTH_RESPONSE=$(curl -s "$BACKEND_URL/health/live" 2>/dev/null || echo "{}")
if command -v jq &> /dev/null; then
echo "$HEALTH_RESPONSE" | jq '.' 2>/dev/null || echo "$HEALTH_RESPONSE"
else
echo "$HEALTH_RESPONSE"
fi
else
fail "Backend health endpoint not responding: $BACKEND_URL/health/live"
fi
echo ""
# Web health
if curl -sf "$WEB_URL" > /dev/null 2>&1; then
ok "Web frontend: $WEB_URL"
CONTENT_TYPE=$(curl -sI "$WEB_URL" | grep -i content-type || echo "")
if echo "$CONTENT_TYPE" | grep -qi "text/html"; then
info " Content type: HTML"
else
warn " Content type: $CONTENT_TYPE"
fi
else
fail "Web frontend not responding: $WEB_URL"
fi
echo ""
# Production endpoints
log "Production endpoints:"
if curl -sf "$API_ENDPOINT/health/live" > /dev/null 2>&1; then
ok " API endpoint: $API_ENDPOINT"
else
warn " API endpoint not accessible: $API_ENDPOINT"
fi
if curl -sf "$WEB_ENDPOINT" > /dev/null 2>&1; then
ok " Web endpoint: $WEB_ENDPOINT"
else
warn " Web endpoint not accessible: $WEB_ENDPOINT"
fi
echo ""
# ── Recent Deployment History ───────────────────────────────────────────
log "══════════════════════════════════════════════════════════════════════"
log "RECENT DEPLOYMENT HISTORY"
log "══════════════════════════════════════════════════════════════════════"
echo ""
if [ "$BACKEND_EXISTS" = true ] || [ "$WEB_EXISTS" = true ]; then
info "Container creation times:"
if [ "$BACKEND_EXISTS" = true ]; then
BACKEND_CREATED=$(docker inspect --format='{{.Created}}' "$BACKEND_CONTAINER" 2>/dev/null || echo "unknown")
info " Backend: $BACKEND_CREATED"
fi
if [ "$WEB_EXISTS" = true ]; then
WEB_CREATED=$(docker inspect --format='{{.Created}}' "$WEB_CONTAINER" 2>/dev/null || echo "unknown")
info " Web: $WEB_CREATED"
fi
else
info "No containers found, no deployment history available"
fi
echo ""
# ── Suggested Actions ───────────────────────────────────────────────────
log "══════════════════════════════════════════════════════════════════════"
log "SUGGESTED ACTIONS"
log "══════════════════════════════════════════════════════════════════════"
echo ""
ACTIONS=()
if [ "$BACKEND_EXISTS" = false ] || [ "$WEB_EXISTS" = false ]; then
ACTIONS+=("• Run deployment script: ./deploy-invttrdg.sh")
fi
if [ "$BACKEND_EXISTS" = true ] && [ "$BACKEND_RUNNING" = false ]; then
ACTIONS+=("• Start backend container: docker start invttrdg-backend")
fi
if [ "$WEB_EXISTS" = true ] && [ "$WEB_RUNNING" = false ]; then
ACTIONS+=("• Start web container: docker start invttrdg-web")
fi
if [ -n "${DEPLOYED_COMMIT_SHA:-}" ] && [ -n "${LATEST_COMMIT:-}" ] && [ "$DEPLOYED_COMMIT_SHA" != "$LATEST_COMMIT" ]; then
ACTIONS+=("• Deploy latest commit: ./deploy-invttrdg.sh")
fi
if [ -d "$REPO_DIR" ]; then
cd "$REPO_DIR"
if ! git diff-index --quiet HEAD -- 2>/dev/null; then
ACTIONS+=("• Commit or stash uncommitted changes in $REPO_DIR")
fi
LOCAL_COMMIT=$(git rev-parse @ 2>/dev/null || echo "")
REMOTE_COMMIT=$(git rev-parse '@{u}' 2>/dev/null || echo "")
if [ -n "$REMOTE_COMMIT" ] && [ "$LOCAL_COMMIT" != "$REMOTE_COMMIT" ]; then
ACTIONS+=("• Push unpushed commits: cd $REPO_DIR && git push")
fi
fi
if ! curl -sf "$BACKEND_URL/health/live" > /dev/null 2>&1; then
ACTIONS+=("• Check backend logs: docker logs invttrdg-backend")
fi
if ! curl -sf "$WEB_URL" > /dev/null 2>&1; then
ACTIONS+=("• Check web logs: docker logs invttrdg-web")
fi
if [ ${#ACTIONS[@]} -eq 0 ]; then
ok "No immediate actions required. Deployment appears healthy."
else
warn "Recommended actions:"
for action in "${ACTIONS[@]}"; do
echo " $action"
done
fi
echo ""
# ── Footer ──────────────────────────────────────────────────────────────
log "══════════════════════════════════════════════════════════════════════"
ok "Deployment status report completed"
log "══════════════════════════════════════════════════════════════════════"
echo ""