#!/bin/bash # 部署通知脚本 - 支持 Telegram 和 Discord # 使用方法: ./notify.sh <message> [color] # status: success 或 failure # title: 通知标题 # message: 通知内容 # color: Discord 消息颜色(可选,默认根据 status 自动选择) set -e STATUS="$1" TITLE="$2" MESSAGE="$3" COLOR="${4:-}" # 根据状态设置默认值 if [ "$STATUS" = "success" ]; then EMOJI="✅" DEFAULT_COLOR="3066993" # 绿色 STATUS_TEXT="成功" elif [ "$STATUS" = "failure" ]; then EMOJI="❌" DEFAULT_COLOR="15158332" # 红色 STATUS_TEXT="失败" else EMOJI="ℹ️" DEFAULT_COLOR="3447003" # 蓝色 STATUS_TEXT="通知" fi COLOR="${COLOR:-$DEFAULT_COLOR}" # 获取 Git 信息 REPO="${GITEA_REPO:-unknown}" BRANCH="${GITEA_REF_NAME:-unknown}" COMMIT_SHA="${GITEA_SHA:-unknown}" COMMIT_SHORT="${COMMIT_SHA:0:7}" AUTHOR="${GITEA_ACTOR:-unknown}" WORKFLOW="${GITEA_WORKFLOW:-unknown}" RUN_NUMBER="${GITEA_RUN_NUMBER:-unknown}" RUN_URL="${GITEA_SERVER_URL:-}/${GITEA_REPO}/actions/runs/${GITEA_RUN_ID:-}" # ==================== Telegram 通知 ==================== send_telegram() { if [ -z "$TELEGRAM_BOT_TOKEN" ] || [ -z "$TELEGRAM_CHAT_ID" ]; then echo "⚠️ Telegram 配置缺失,跳过通知" return 0 fi local tg_message="${EMOJI} <b>${TITLE}</b> <b>状态:</b> ${STATUS_TEXT} <b>仓库:</b> ${REPO} <b>分支:</b> ${BRANCH} <b>提交:</b> <code>${COMMIT_SHORT}</code> <b>作者:</b> ${AUTHOR} <b>工作流:</b> ${WORKFLOW} #${RUN_NUMBER} ${MESSAGE} <a href=\"${RUN_URL}\">查看详情</a>" echo "📤 发送 Telegram 通知..." local response response=$(curl -s -X POST \ "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ -d "chat_id=${TELEGRAM_CHAT_ID}" \ -d "text=${tg_message}" \ -d "parse_mode=HTML" \ -d "disable_web_page_preview=true") if echo "$response" | grep -q '"ok":true'; then echo "✅ Telegram 通知发送成功" else echo "❌ Telegram 通知发送失败: $response" return 1 fi } # ==================== Discord 通知 ==================== send_discord() { if [ -z "$DISCORD_WEBHOOK_URL" ]; then echo "⚠️ Discord Webhook 配置缺失,跳过通知" return 0 fi echo "📤 发送 Discord 通知..." # 构建 Discord Embed JSON local discord_payload discord_payload=$(cat <<EOF { "embeds": [{ "title": "${EMOJI} ${TITLE}", "description": "${MESSAGE}", "color": ${COLOR}, "fields": [ { "name": "状态", "value": "${STATUS_TEXT}", "inline": true }, { "name": "仓库", "value": "${REPO}", "inline": true }, { "name": "分支", "value": "${BRANCH}", "inline": true }, { "name": "提交", "value": "\`${COMMIT_SHORT}\`", "inline": true }, { "name": "作者", "value": "${AUTHOR}", "inline": true }, { "name": "工作流", "value": "${WORKFLOW} #${RUN_NUMBER}", "inline": true } ], "footer": { "text": "Gitea Actions" }, "timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)", "url": "${RUN_URL}" }] } EOF ) local response response=$(curl -s -X POST \ "$DISCORD_WEBHOOK_URL" \ -H "Content-Type: application/json" \ -d "$discord_payload") if [ -z "$response" ] || echo "$response" | grep -q '"id"'; then echo "✅ Discord 通知发送成功" else echo "❌ Discord 通知发送失败: $response" return 1 fi } # ==================== 主流程 ==================== main() { echo "🔔 开始发送部署通知..." echo "状态: $STATUS" echo "标题: $TITLE" echo "消息: $MESSAGE" echo "" local failed=0 # 发送 Telegram 通知 if ! send_telegram; then failed=$((failed + 1)) fi echo "" # 发送 Discord 通知 if ! send_discord; then failed=$((failed + 1)) fi echo "" if [ $failed -eq 0 ]; then echo "✅ 所有通知发送完成" else echo "⚠️ 部分通知发送失败 ($failed 个)" # 不退出脚本,避免影响主流程 fi } main