#!/usr/bin/env bash set -e # Determine Icon based on Status ICON="🚀" if [ "$STATUS" = "failure" ]; then ICON="❌" fi # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' 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}" if [ -n "$NTFY_URL" ] && [ -n "$NTFY_TOPIC" ]; then local click_url="$GIT_URL/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" local auth_args="" # Check for Basic Auth if [ -n "$NTFY_USERNAME" ] && [ -n "$NTFY_PASSWORD" ]; then echo -e " Server: ${GREEN}$NTFY_URL${NC}" echo -e " Topic: ${GREEN}$NTFY_TOPIC${NC}" echo -e " Auth: ${GREEN}Basic Auth${NC}" auth_args="-u $NTFY_USERNAME:$NTFY_PASSWORD" fi echo -e " ${YELLOW}→${NC} Sending push notification..." echo -e " ${YELLOW}→${NC} Target: $NTFY_URL/$NTFY_TOPIC" echo -e " ${YELLOW}→${NC} Click URL: $click_url" echo -e " ${YELLOW}→${NC} Message: $MESSAGE" echo -e "" if curl -s $auth_args -X POST "$NTFY_URL/$NTFY_TOPIC" \ -H "Title: $ICON $TITLE" \ -H "Priority: 4" \ -H "Click: $click_url" \ -H "Actions: view, Open Logs, $click_url" \ -d "$MESSAGE"; then echo -e " ${GREEN}✓${NC} Sent successfully" else echo -e " ${RED}✗${NC} Failed to send notification" fi echo "" fi } # 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."