161 lines
6.2 KiB
YAML
161 lines
6.2 KiB
YAML
name: Batch Label Issues
|
||
|
||
on:
|
||
workflow_dispatch:
|
||
inputs:
|
||
mode:
|
||
description: '标签模式'
|
||
required: true
|
||
type: choice
|
||
options:
|
||
- 'recent' # 最近 20 个 issue
|
||
- 'open' # 所有打开的 issue
|
||
- 'unlabeled' # 只处理没有标签的 issue
|
||
- 'all' # 所有 issue(慎用)
|
||
default: 'recent'
|
||
|
||
skip_labeled:
|
||
description: '跳过已有标签的 issue'
|
||
required: false
|
||
type: boolean
|
||
default: true
|
||
|
||
permissions:
|
||
issues: write
|
||
contents: read
|
||
|
||
jobs:
|
||
batch-label:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- name: Checkout
|
||
uses: actions/checkout@v4
|
||
|
||
- name: Setup Node.js
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '20.x'
|
||
|
||
- name: Batch Label Issues
|
||
env:
|
||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
run: |
|
||
MODE="${{ github.event.inputs.mode }}"
|
||
SKIP_LABELED="${{ github.event.inputs.skip_labeled }}"
|
||
|
||
echo "📊 开始批量打标签..."
|
||
echo "模式: $MODE"
|
||
echo "跳过已标签: $SKIP_LABELED"
|
||
|
||
# 获取 issue 列表
|
||
if [ "$MODE" = "recent" ]; then
|
||
echo "📋 获取最近 20 个 issue..."
|
||
ISSUES=$(gh issue list --limit 20 --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
||
elif [ "$MODE" = "open" ]; then
|
||
echo "📋 获取所有打开的 issue..."
|
||
ISSUES=$(gh issue list --state open --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
||
elif [ "$MODE" = "unlabeled" ]; then
|
||
echo "📋 获取没有标签的 issue..."
|
||
ISSUES=$(gh issue list --state all --json number,labels,title,body --jq '.[] | select(.labels | length == 0) | {number, labels: [.labels[].name], title, body}')
|
||
else
|
||
echo "📋 获取所有 issue(限制 100 个)..."
|
||
ISSUES=$(gh issue list --state all --limit 100 --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
||
fi
|
||
|
||
# 临时文件
|
||
echo "$ISSUES" > /tmp/issues.json
|
||
|
||
# 处理每个 issue
|
||
cat /tmp/issues.json | jq -c '.' | while read -r issue; do
|
||
ISSUE_NUM=$(echo "$issue" | jq -r '.number')
|
||
EXISTING_LABELS=$(echo "$issue" | jq -r '.labels | join(",")')
|
||
TITLE=$(echo "$issue" | jq -r '.title')
|
||
BODY=$(echo "$issue" | jq -r '.body')
|
||
|
||
echo ""
|
||
echo "🔍 处理 Issue #$ISSUE_NUM: $TITLE"
|
||
echo " 现有标签: $EXISTING_LABELS"
|
||
|
||
# 跳过已有标签的 issue
|
||
if [ "$SKIP_LABELED" = "true" ] && [ ! -z "$EXISTING_LABELS" ]; then
|
||
echo " ⏭️ 跳过(已有标签)"
|
||
continue
|
||
fi
|
||
|
||
# 分析内容并打标签
|
||
LABELS_TO_ADD=""
|
||
|
||
# 检测 bug
|
||
if echo "$TITLE $BODY" | grep -iE "(bug|错误|崩溃|crash|error|exception|问题|fix)" > /dev/null; then
|
||
LABELS_TO_ADD="$LABELS_TO_ADD bug"
|
||
echo " 🐛 检测到: bug"
|
||
fi
|
||
|
||
# 检测 feature request
|
||
if echo "$TITLE $BODY" | grep -iE "(feature|功能|enhancement|improve|优化|建议|新增|添加|add)" > /dev/null; then
|
||
LABELS_TO_ADD="$LABELS_TO_ADD enhancement"
|
||
echo " ✨ 检测到: enhancement"
|
||
fi
|
||
|
||
# 检测 question
|
||
if echo "$TITLE $BODY" | grep -iE "(question|疑问|how to|如何|怎么|为什么|why|咨询|\?|?)" > /dev/null; then
|
||
LABELS_TO_ADD="$LABELS_TO_ADD question"
|
||
echo " ❓ 检测到: question"
|
||
fi
|
||
|
||
# 检测 documentation
|
||
if echo "$TITLE $BODY" | grep -iE "(doc|文档|readme|guide|tutorial|教程|说明)" > /dev/null; then
|
||
LABELS_TO_ADD="$LABELS_TO_ADD documentation"
|
||
echo " 📖 检测到: documentation"
|
||
fi
|
||
|
||
# 检测 performance
|
||
if echo "$TITLE $BODY" | grep -iE "(performance|性能|slow|慢|lag|卡顿|optimize|优化)" > /dev/null; then
|
||
LABELS_TO_ADD="$LABELS_TO_ADD performance"
|
||
echo " ⚡ 检测到: performance"
|
||
fi
|
||
|
||
# 检测 core
|
||
if echo "$TITLE $BODY" | grep -iE "(@esengine/ecs-framework|packages/core|core package|核心包)" > /dev/null; then
|
||
LABELS_TO_ADD="$LABELS_TO_ADD core"
|
||
echo " 🎯 检测到: core"
|
||
fi
|
||
|
||
# 检测 editor
|
||
if echo "$TITLE $BODY" | grep -iE "(editor|编辑器|tauri)" > /dev/null; then
|
||
LABELS_TO_ADD="$LABELS_TO_ADD editor"
|
||
echo " 🎨 检测到: editor"
|
||
fi
|
||
|
||
# 检测 network
|
||
if echo "$TITLE $BODY" | grep -iE "(network|网络|multiplayer|多人|同步)" > /dev/null; then
|
||
LABELS_TO_ADD="$LABELS_TO_ADD network"
|
||
echo " 🌐 检测到: network"
|
||
fi
|
||
|
||
# 检测 help wanted
|
||
if echo "$TITLE $BODY" | grep -iE "(help wanted|需要帮助|求助)" > /dev/null; then
|
||
LABELS_TO_ADD="$LABELS_TO_ADD help wanted"
|
||
echo " 🆘 检测到: help wanted"
|
||
fi
|
||
|
||
# 添加标签
|
||
if [ ! -z "$LABELS_TO_ADD" ]; then
|
||
echo " ✅ 添加标签: $LABELS_TO_ADD"
|
||
for label in $LABELS_TO_ADD; do
|
||
gh issue edit $ISSUE_NUM --add-label "$label" 2>&1 | grep -v "already exists" || true
|
||
done
|
||
echo " 💬 添加说明评论..."
|
||
gh issue comment $ISSUE_NUM --body $'🤖 自动标签系统检测到此 issue 并添加了相关标签。如有误判,请告知维护者。\n\n🤖 Auto-labeling system detected and labeled this issue. Please let maintainers know if this is incorrect.' || true
|
||
else
|
||
echo " ℹ️ 未检测到明确类型"
|
||
fi
|
||
|
||
# 避免 API 限制
|
||
sleep 1
|
||
done
|
||
|
||
echo ""
|
||
echo "✅ 批量标签完成!"
|
||
echo "查看结果: https://github.com/${{ github.repository }}/issues"
|