mirror of
https://github.com/alibaba/higress.git
synced 2026-02-06 15:10:54 +08:00
274 lines
7.6 KiB
Bash
Executable File
274 lines
7.6 KiB
Bash
Executable File
#!/bin/bash
|
||
# Higress Daily Report Generator
|
||
# Generates daily report for alibaba/higress repository
|
||
|
||
# set -e # 临时禁用以调试
|
||
|
||
REPO="alibaba/higress"
|
||
CHANNEL="1465549185632702591"
|
||
DATE=$(date +"%Y-%m-%d")
|
||
REPORT_DIR="/root/clawd/reports"
|
||
TRACKING_DIR="/root/clawd/memory"
|
||
RECORD_FILE="${TRACKING_DIR}/higress-issue-process-record.md"
|
||
|
||
mkdir -p "$REPORT_DIR" "$TRACKING_DIR"
|
||
|
||
echo "=== Higress Daily Report - $DATE ==="
|
||
|
||
# Get yesterday's date
|
||
YESTERDAY=$(date -d "yesterday" +"%Y-%m-%d" 2>/dev/null || date -v-1d +"%Y-%m-%d")
|
||
|
||
echo "Fetching issues created on $YESTERDAY..."
|
||
|
||
# Fetch issues created yesterday
|
||
ISSUES=$(gh search issues --repo "${REPO}" --state open --created "${YESTERDAY}..${YESTERDAY}" --json number,title,labels,author,url,body,state --limit 50 2>/dev/null)
|
||
|
||
if [ -z "$ISSUES" ]; then
|
||
ISSUES_COUNT=0
|
||
else
|
||
ISSUES_COUNT=$(echo "$ISSUES" | jq 'length' 2>/dev/null || echo "0")
|
||
fi
|
||
|
||
# Fetch PRs created yesterday
|
||
PRS=$(gh search prs --repo "${REPO}" --state open --created "${YESTERDAY}..${YESTERDAY}" --json number,title,labels,author,url,reviewDecision,additions,deletions,body,state --limit 50 2>/dev/null)
|
||
|
||
if [ -z "$PRS" ]; then
|
||
PRS_COUNT=0
|
||
else
|
||
PRS_COUNT=$(echo "$PRS" | jq 'length' 2>/dev/null || echo "0")
|
||
fi
|
||
|
||
echo "Found: $ISSUES_COUNT issues, $PRS_COUNT PRs"
|
||
|
||
# Build report
|
||
REPORT="📊 **Higress 项目每日报告 - ${DATE}**
|
||
|
||
**📋 概览**
|
||
- 统计时间: ${YESTERDAY} 全天
|
||
- 新增 Issues: **${ISSUES_COUNT}** 个
|
||
- 新增 PRs: **${PRS_COUNT}** 个
|
||
|
||
---
|
||
|
||
"
|
||
|
||
# Process issues
|
||
if [ "$ISSUES_COUNT" -gt 0 ]; then
|
||
REPORT="${REPORT}**📌 Issues 详情**
|
||
|
||
"
|
||
|
||
# Use a temporary file to avoid subshell variable scoping issues
|
||
ISSUE_DETAILS=$(mktemp)
|
||
|
||
echo "$ISSUES" | jq -r '.[] | @json' | while IFS= read -r ISSUE; do
|
||
NUM=$(echo "$ISSUE" | jq -r '.number')
|
||
TITLE=$(echo "$ISSUE" | jq -r '.title')
|
||
URL=$(echo "$ISSUE" | jq -r '.url')
|
||
AUTHOR=$(echo "$ISSUE" | jq -r '.author.login')
|
||
BODY=$(echo "$ISSUE" | jq -r '.body // ""')
|
||
LABELS=$(echo "$ISSUE" | jq -r '.labels[]?.name // ""' | head -1)
|
||
|
||
# Determine emoji
|
||
EMOJI="📝"
|
||
echo "$LABELS" | grep -q "priority/high" && EMOJI="🔴"
|
||
echo "$LABELS" | grep -q "type/bug" && EMOJI="🐛"
|
||
echo "$LABELS" | grep -q "type/enhancement" && EMOJI="✨"
|
||
|
||
# Extract content
|
||
CONTENT=$(echo "$BODY" | head -n 8 | sed 's/```.*```//g' | sed 's/`//g' | tr '\n' ' ' | head -c 300)
|
||
|
||
if [ -z "$CONTENT" ]; then
|
||
CONTENT="无详细描述"
|
||
fi
|
||
|
||
if [ ${#CONTENT} -eq 300 ]; then
|
||
CONTENT="${CONTENT}..."
|
||
fi
|
||
|
||
# Append to temporary file
|
||
echo "${EMOJI} **[#${NUM}](${URL})**: ${TITLE}
|
||
👤 @${AUTHOR}
|
||
📝 ${CONTENT}
|
||
" >> "$ISSUE_DETAILS"
|
||
done
|
||
|
||
# Read from temp file and append to REPORT
|
||
REPORT="${REPORT}$(cat $ISSUE_DETAILS)"
|
||
|
||
rm -f "$ISSUE_DETAILS"
|
||
fi
|
||
|
||
REPORT="${REPORT}
|
||
---
|
||
|
||
"
|
||
|
||
# Process PRs
|
||
if [ "$PRS_COUNT" -gt 0 ]; then
|
||
REPORT="${REPORT}**🔀 PRs 详情**
|
||
|
||
"
|
||
|
||
# Use a temporary file to avoid subshell variable scoping issues
|
||
PR_DETAILS=$(mktemp)
|
||
|
||
echo "$PRS" | jq -r '.[] | @json' | while IFS= read -r PR; do
|
||
NUM=$(echo "$PR" | jq -r '.number')
|
||
TITLE=$(echo "$PR" | jq -r '.title')
|
||
URL=$(echo "$PR" | jq -r '.url')
|
||
AUTHOR=$(echo "$PR" | jq -r '.author.login')
|
||
ADDITIONS=$(echo "$PR" | jq -r '.additions')
|
||
DELETIONS=$(echo "$PR" | jq -r '.deletions')
|
||
REVIEW=$(echo "$PR" | jq -r '.reviewDecision // "pending"')
|
||
BODY=$(echo "$PR" | jq -r '.body // ""')
|
||
|
||
# Determine status
|
||
STATUS="👀"
|
||
[ "$REVIEW" = "APPROVED" ] && STATUS="✅"
|
||
[ "$REVIEW" = "CHANGES_REQUESTED" ] && STATUS="🔄"
|
||
|
||
# Calculate size
|
||
TOTAL=$((ADDITIONS + DELETIONS))
|
||
SIZE="M"
|
||
[ $TOTAL -lt 100 ] && SIZE="XS"
|
||
[ $TOTAL -lt 500 ] && SIZE="S"
|
||
[ $TOTAL -lt 1000 ] && SIZE="M"
|
||
[ $TOTAL -lt 5000 ] && SIZE="L"
|
||
[ $TOTAL -ge 5000 ] && SIZE="XL"
|
||
|
||
# Extract content
|
||
CONTENT=$(echo "$BODY" | head -n 8 | sed 's/```.*```//g' | sed 's/`//g' | tr '\n' ' ' | head -c 300)
|
||
|
||
if [ -z "$CONTENT" ]; then
|
||
CONTENT="无详细描述"
|
||
fi
|
||
|
||
if [ ${#CONTENT} -eq 300 ]; then
|
||
CONTENT="${CONTENT}..."
|
||
fi
|
||
|
||
# Append to temporary file
|
||
echo "${STATUS} **[#${NUM}](${URL})**: ${TITLE} ${SIZE}
|
||
👤 @${AUTHOR} | ${STATUS} | 变更: +${ADDITIONS}/-${DELETIONS}
|
||
📝 ${CONTENT}
|
||
" >> "$PR_DETAILS"
|
||
done
|
||
|
||
# Read from temp file and append to REPORT
|
||
REPORT="${REPORT}$(cat $PR_DETAILS)"
|
||
|
||
rm -f "$PR_DETAILS"
|
||
fi
|
||
|
||
# Check for new comments on tracked issues
|
||
TRACKING_FILE="${TRACKING_DIR}/higress-issue-tracking.json"
|
||
|
||
echo ""
|
||
echo "Checking for new comments on tracked issues..."
|
||
|
||
# Load previous tracking data
|
||
if [ -f "$TRACKING_FILE" ]; then
|
||
PREV_TRACKING=$(cat "$TRACKING_FILE")
|
||
PREV_ISSUES=$(echo "$PREV_TRACKING" | jq -r '.issues[]?.number // empty' 2>/dev/null)
|
||
|
||
if [ -n "$PREV_ISSUES" ]; then
|
||
REPORT="${REPORT}**🔔 Issue跟进(新评论)**"
|
||
|
||
HAS_NEW_COMMENTS=false
|
||
|
||
for issue_num in $PREV_ISSUES; do
|
||
# Get current comment count
|
||
CURRENT_INFO=$(gh issue view "$issue_num" --repo "$REPO" --json number,title,state,comments,url 2>/dev/null)
|
||
if [ -n "$CURRENT_INFO" ]; then
|
||
CURRENT_COUNT=$(echo "$CURRENT_INFO" | jq '.comments | length')
|
||
CURRENT_TITLE=$(echo "$CURRENT_INFO" | jq -r '.title')
|
||
CURRENT_STATE=$(echo "$CURRENT_INFO" | jq -r '.state')
|
||
ISSUE_URL=$(echo "$CURRENT_INFO" | jq -r '.url')
|
||
PREV_COUNT=$(echo "$PREV_TRACKING" | jq -r ".issues[] | select(.number == $issue_num) | .comment_count // 0")
|
||
|
||
if [ -z "$PREV_COUNT" ]; then
|
||
PREV_COUNT=0
|
||
fi
|
||
|
||
NEW_COMMENTS=$((CURRENT_COUNT - PREV_COUNT))
|
||
|
||
if [ "$NEW_COMMENTS" -gt 0 ]; then
|
||
HAS_NEW_COMMENTS=true
|
||
REPORT="${REPORT}
|
||
|
||
• [#${issue_num}](${ISSUE_URL}) ${CURRENT_TITLE}
|
||
📬 +${NEW_COMMENTS}条新评论(总计: ${CURRENT_COUNT}) | 状态: ${CURRENT_STATE}"
|
||
fi
|
||
fi
|
||
done
|
||
|
||
if [ "$HAS_NEW_COMMENTS" = false ]; then
|
||
REPORT="${REPORT}
|
||
|
||
• 暂无新评论"
|
||
fi
|
||
|
||
REPORT="${REPORT}
|
||
|
||
---
|
||
"
|
||
fi
|
||
fi
|
||
|
||
# Save current tracking data for tomorrow
|
||
echo "Saving issue tracking data for follow-up..."
|
||
|
||
if [ -z "$ISSUES" ]; then
|
||
TRACKING_DATA='{"date":"'"$DATE"'","issues":[]}'
|
||
else
|
||
TRACKING_DATA=$(echo "$ISSUES" | jq '{
|
||
date: "'"$DATE"'",
|
||
issues: [.[] | {
|
||
number: .number,
|
||
title: .title,
|
||
state: .state,
|
||
comment_count: 0,
|
||
url: .url
|
||
}]
|
||
}')
|
||
fi
|
||
|
||
echo "$TRACKING_DATA" > "$TRACKING_FILE"
|
||
echo "Tracking data saved to $TRACKING_FILE"
|
||
|
||
# Save report to file
|
||
REPORT_FILE="${REPORT_DIR}/report_${DATE}.md"
|
||
echo "$REPORT" > "$REPORT_FILE"
|
||
echo "Report saved to $REPORT_FILE"
|
||
|
||
# Follow-up reminder
|
||
FOLLOWUP_ISSUES=$(echo "$PREV_TRACKING" | jq -r '[.issues[] | select(.comment_count > 0 or .state == "open")] | "#\(.number) [\(.title)]"' 2>/dev/null || echo "")
|
||
|
||
if [ -n "$FOLLOWUP_ISSUES" ]; then
|
||
REPORT="${REPORT}
|
||
|
||
**📌 需要跟进的Issues**
|
||
|
||
以下Issues需要跟进处理:
|
||
${FOLLOWUP_ISSUES}
|
||
|
||
---
|
||
|
||
"
|
||
fi
|
||
|
||
# Footer
|
||
REPORT="${REPORT}
|
||
---
|
||
📅 生成时间: $(date +"%Y-%m-%d %H:%M:%S %Z")
|
||
🔗 项目: https://github.com/${REPO}
|
||
🤖 本报告由 AI 辅助生成,所有链接均可点击跳转
|
||
"
|
||
|
||
# Send report
|
||
echo "Sending report to Discord..."
|
||
echo "$REPORT" | /root/.nvm/versions/node/v24.13.0/bin/clawdbot message send --channel discord -t "$CHANNEL" -m "$(cat -)"
|
||
|
||
echo "Done!"
|