#!/usr/bin/env bash set -e # Determine Icon based on Status ICON="🚀" if [ "$STATUS" = "failure" ]; then ICON="❌" fi echo "" echo -e "${GREEN}╔════════════════════════════════════════╗${NC}" echo -e "${GREEN}║ 🚀 Deployment Notification System ║${NC}" echo -e "${GREEN}╚════════════════════════════════════════╝${NC}" echo "" # Function: Send to Ntfy (Modern Push Notification) send_ntfy() { echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${YELLOW}🔔 Ntfy Push Notification${NC}" echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" # Debug: Show environment variables echo -e " ${YELLOW}Debug Info:${NC}" echo -e " NTFY_URL: ${GREEN}${NTFY_URL:-'(not set)'}${NC}" echo -e " NTFY_TOPIC: ${GREEN}${NTFY_TOPIC:-'(not set)'}${NC}" echo -e " NTFY_USERNAME: ${GREEN}${NTFY_USER:-'(not set)'}${NC}" echo -e " NTFY_PASSWORD: ${GREEN}${NTFY_PASS:+'***set***'}${NTFY_PASS:-'(not set)'}${NC}" echo "" if [ -n "$NTFY_URL" ] && [ -n "$NTFY_TOPIC" ]; then echo -e " Server: ${GREEN}$NTFY_URL${NC}" echo -e " Topic: ${GREEN}$NTFY_TOPIC${NC}" echo "" local click_url="$GIT_URL/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" local auth_args="" local priority=4 local tags="rocket,deployment" # Adjust priority and tags based on status if [ "$STATUS" = "failure" ]; then priority=5 tags="x,warning,deployment" fi # Check for Basic Auth if [ -n "$NTFY_USER" ] && [ -n "$NTFY_PASS" ]; then auth_args="-u $NTFY_USER:$NTFY_PASS" echo -e " ${GREEN}✓${NC} Using Basic Authentication" else echo -e " ${YELLOW}⚠${NC} No authentication (public topic)" fi echo "" # Build rich message with metadata local rich_message=$(cat <&1) http_code=$(echo "$response" | tail -n1) response_body=$(echo "$response" | head -n -1) if [ "$http_code" = "200" ] || [ "$http_code" = "201" ]; then echo -e " ${GREEN}✓${NC} Notification sent successfully (HTTP $http_code)" else echo -e " ${RED}✗${NC} Failed to send notification (HTTP $http_code)" if [ -n "$response_body" ]; then echo -e " ${RED}Response:${NC} $response_body" fi fi echo "" else echo -e " ${RED}✗${NC} Skipping Ntfy - Missing required configuration" [ -z "$NTFY_URL" ] && echo -e " ${RED}•${NC} NTFY_URL is not set" [ -z "$NTFY_TOPIC" ] && echo -e " ${RED}•${NC} NTFY_TOPIC is not set" echo "" fi } RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # Function: Send to Gmail (Modern HTML Email) send_gmail() { if [ -n "$GMAIL_USER" ] && [ -n "$GMAIL_TO" ] && [ -n "$GMAIL_PASS" ]; then echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${YELLOW}📧 Gmail SMTP Email${NC}" echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e " From: ${GREEN}$GMAIL_USER${NC}" echo -e " To: ${GREEN}$GMAIL_TO${NC}" echo -e " SMTP: ${GREEN}smtp.gmail.com:587${NC}" echo "" # Determine status color and badge local status_color="#22c55e" local status_bg="#dcfce7" local status_text="SUCCESS" if [ "$STATUS" = "failure" ]; then status_color="#ef4444" status_bg="#fee2e2" status_text="FAILURE" fi # Parse structured message data local branch=$(echo "$MESSAGE" | grep -oP '^Branch:\s*\K.*' || echo "") local commit=$(echo "$MESSAGE" | grep -oP '^Commit:\s*\K.*' || echo "") local commit_msg=$(echo "$MESSAGE" | grep -oP '^Message:\s*\K.*' || echo "") local actor=$(echo "$MESSAGE" | grep -oP '^Actor:\s*\K.*' || echo "") # Shorten commit hash for display local commit_short="${commit:0:8}" # Build modern HTML email with inline CSS local html_body=$(cat < $TITLE

$ICON Deployment Notification

$status_text

${GITHUB_REPOSITORY:-Repository}

🌿 Branch
$branch
🔖 Commit
$commit_short
💬 Commit Message
$commit_msg
👤 Author
$actor
🔢 Run ID: ${GITHUB_RUN_ID:-N/A}
⏰ Timestamp: $(date -u +"%Y-%m-%d %H:%M:%S UTC")
📋 View Deployment Logs

🤖 Automated deployment notification from Act Runner

EOF ) # Create MIME email with proper headers local boundary="----=_Part_$(date +%s)_$(( RANDOM ))" local email_content=$(cat < Reply-To: $GMAIL_USER To: $GMAIL_TO Subject: $ICON $TITLE MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="$boundary" --$boundary Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit $ICON $TITLE Status: $STATUS Message: $MESSAGE Repository: ${GITHUB_REPOSITORY:-N/A} Run ID: ${GITHUB_RUN_ID:-N/A} Timestamp: $(date -u +"%Y-%m-%d %H:%M:%S UTC") View logs: $GIT_URL/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID} --$boundary Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit $html_body --$boundary-- EOF ) # Send email via SMTP echo -e " ${YELLOW}→${NC} Sending HTML email..." response=$(printf "%s" "$email_content" | curl --ssl-reqd \ --url "smtp://smtp.gmail.com:587" \ --user "$GMAIL_USER:$GMAIL_PASS" \ --mail-from "$GMAIL_USER" \ --mail-rcpt "$GMAIL_TO" \ --upload-file - \ --silent \ --show-error 2>&1) exit_code=$? if [ $exit_code -eq 0 ]; then echo -e " ${GREEN}✓${NC} Email sent successfully" else echo -e " ${RED}✗${NC} Failed to send email" echo -e " ${RED}Error:${NC} $response" fi echo "" fi } # Function: Send to Telegram (Modern Rich Message) send_telegram() { if [ -n "$TELEGRAM_BOT_TOKEN" ] && [ -n "$TELEGRAM_CHAT_ID" ]; then echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${YELLOW}✈️ Telegram Message${NC}" echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e " Chat ID: ${GREEN}$TELEGRAM_CHAT_ID${NC}" echo "" # Determine status emoji and formatting local status_emoji="✅" local status_text="SUCCESS" if [ "$STATUS" = "failure" ]; then status_emoji="❌" status_text="FAILURE" fi # Build rich Telegram message with MarkdownV2 formatting local telegram_message=$(cat <&1) # Check if message was sent successfully if echo "$response" | grep -q '"ok":true'; then echo -e " ${GREEN}✓${NC} Message sent successfully" else echo -e " ${RED}✗${NC} Failed to send message" # Try to extract error description error_desc=$(echo "$response" | grep -o '"description":"[^"]*"' | cut -d'"' -f4) if [ -n "$error_desc" ]; then echo -e " ${RED}Error:${NC} $error_desc" fi fi echo "" fi } # Execute in parallel send_gmail & PID_GMAIL=$! send_telegram & PID_TG=$! send_ntfy & PID_NTFY=$! # Wait for completion wait $PID_GMAIL wait $PID_TG wait $PID_NTFY echo "All notifications processed."