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>
This commit is contained in:
parent
e59bd34ab5
commit
b5a86b40e0
343
deployment-status.sh
Executable file
343
deployment-status.sh
Executable file
@ -0,0 +1,343 @@
|
|||||||
|
#!/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 ""
|
||||||
Loading…
Reference in New Issue
Block a user