From b5a86b40e0a47a9eb267da60aa6f20ea5df57cc0 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 12 May 2026 20:40:53 +0000 Subject: [PATCH] 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> --- deployment-status.sh | 343 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 343 insertions(+) create mode 100755 deployment-status.sh diff --git a/deployment-status.sh b/deployment-status.sh new file mode 100755 index 0000000..5b0867a --- /dev/null +++ b/deployment-status.sh @@ -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 ""