| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- #!/bin/bash
- # Lark (飞书) 通知模块
- # 提供 Lark Webhook 通知功能
- #
- # ⚠️ 重要提示:
- # 所有配置项必须从 Jenkinsfile 的 environment 部分传入
- # 此脚本不包含任何硬编码配置,确保配置集中管理
- #
- # 必需的环境变量:
- # - LARK_WEBHOOK_URL: Lark Webhook URL(必须在 Jenkinsfile 中设置)
- # 验证必需的环境变量
- if [ -z "${LARK_WEBHOOK_URL}" ]; then
- echo "错误: LARK_WEBHOOK_URL 环境变量未设置" >&2
- echo "请确保在 Jenkinsfile 的 environment 部分设置了 LARK_WEBHOOK_URL" >&2
- exit 1
- fi
- # 发送 Lark 消息的函数
- send_lark_message() {
- local title="$1"
- local content="$2"
- # 根据标题判断颜色(成功=绿色,失败=红色,其他=蓝色)
- local color="blue"
- if echo "$title" | grep -q "✅\|成功"; then
- color="green"
- elif echo "$title" | grep -q "❌\|失败"; then
- color="red"
- fi
- # 转义 JSON 特殊字符(简化版,只处理必要的转义)
- local escaped_title=$(echo "$title" | sed 's/"/\\"/g')
- local escaped_content=$(echo "$content" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g')
- # 构建 JSON payload(使用测试脚本中验证过的格式)
- local payload="{
- \"msg_type\": \"interactive\",
- \"card\": {
- \"header\": {
- \"title\": {
- \"tag\": \"plain_text\",
- \"content\": \"${escaped_title}\"
- },
- \"template\": \"${color}\"
- },
- \"elements\": [
- {
- \"tag\": \"div\",
- \"text\": {
- \"tag\": \"lark_md\",
- \"content\": \"${escaped_content}\"
- }
- }
- ]
- }
- }"
- # 发送到 Lark(记录响应)
- local response=$(curl -s -X POST "${LARK_WEBHOOK_URL}" \
- -H "Content-Type: application/json" \
- -d "$payload")
- # 检查是否成功
- if echo "$response" | grep -q '"code":0'; then
- if type -t log_message >/dev/null 2>&1; then
- log_message "✓ Lark 通知发送成功"
- fi
- else
- if type -t log_message >/dev/null 2>&1; then
- log_message "✗ Lark 通知发送失败: $response"
- fi
- fi
- }
- # 发送修复通知到 Lark 的函数
- send_lark_fix_notification() {
- local project_name="$1"
- local build_time="$2"
- local commit_hash="$3"
- local fix_count="$4"
- local fix_list="$5"
- local branch="$6"
- local env="$7"
- local title="🔧 ${project_name} - 发现 ${fix_count} 个修复"
- # 转义 Markdown 特殊字符
- local escaped_fixes=$(echo "$fix_list" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g')
- local content="**构建时间:** ${build_time}
- **分支:** ${branch}
- **环境:** ${env}
- **提交:** ${commit_hash}
- **修复数量:** ${fix_count}
- ---
- **修复内容:**
- ${escaped_fixes}
- ---
- ✅ 构建成功并已部署"
- log_message "发送 Lark 通知: ${title}"
- send_lark_message "$title" "$content"
- }
- # 发送版本发布通知(带 Bug 链接)
- send_release_notification_with_bugs() {
- local previous_tag="$1"
- local current_tag="$2"
- local bug_count="$3"
- local bug_list="$4" # 格式: bug_id|bug_title|zentao_url (每行一个)
- local code_changes="$5" # 格式: type|commit_message (每行一个)
- # 构建已解决 Bug 链接列表
- local bug_section=""
- if [ ${bug_count} -gt 0 ] && [ -n "$bug_list" ]; then
- bug_section="\\n\\n**已解决Bug** (${bug_count}个):\\n"
- while IFS='|' read -r bug_id bug_title bug_url; do
- if [ -n "$bug_id" ] && [ -n "$bug_url" ]; then
- # 使用 Markdown 链接格式
- bug_section="${bug_section}• [#${bug_id} ${bug_title}](${bug_url})\\n"
- fi
- done <<<"$bug_list"
- fi
- # 构建代码更改列表
- local changes_section=""
- if [ -n "$code_changes" ]; then
- changes_section="\\n\\n**代码更改:**\\n"
- while IFS='|' read -r change_type change_message; do
- if [ -n "$change_type" ] && [ -n "$change_message" ]; then
- changes_section="${changes_section}• ${change_type}: ${change_message}\\n"
- fi
- done <<<"$code_changes"
- fi
- # 构建完整消息内容
- local content="**版本:** ${previous_tag} → ${current_tag}${bug_section}${changes_section}"
- # 发送飞书卡片通知
- curl -s -X POST "${LARK_WEBHOOK_URL}" \
- -H "Content-Type: application/json" \
- -d "{
- \"msg_type\": \"interactive\",
- \"card\": {
- \"header\": {
- \"title\": {
- \"tag\": \"plain_text\",
- \"content\": \"🚀 pwtk管端端版本发布\"
- },
- \"template\": \"blue\"
- },
- \"elements\": [
- {
- \"tag\": \"div\",
- \"text\": {
- \"tag\": \"lark_md\",
- \"content\": \"${content}\"
- }
- }
- ]
- }
- }" >/dev/null
- if type -t log_message >/dev/null 2>&1; then
- log_message "✓ 版本发布通知已发送 (Bug: ${bug_count})"
- fi
- }
|