wp-woocommerce-pay/.forgejo/workflows/auto-label.yml
feibisi 9165def697
Some checks failed
gitleaks 密钥泄露扫描 / gitleaks (push) Waiting to run
feicode/ai-security No obvious risky pattern in latest diff
WordPress 插件 CI / ci (push) Has been cancelled
ci: 添加 auto-label.yml workflow
2026-02-17 05:28:40 +00:00

119 lines
4.6 KiB
YAML

name: Auto Label
on:
pull_request:
types: [opened, synchronize]
jobs:
auto-label:
if: github.repository != 'WenPai-org/ci-workflows'
runs-on: linux-arm64
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: 自动打标签
env:
FORGEJO_TOKEN: ${{ secrets.RELEASE_TOKEN }}
GITHUB_REPOSITORY: ${{ github.repository }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
API_BASE="${GITHUB_SERVER_URL:-https://feicode.com}/api/v1"
OWNER="${GITHUB_REPOSITORY%/*}"
REPO="${GITHUB_REPOSITORY#*/}"
LABELS=""
# 获取 PR 变更文件
FILES=$(curl -s -H "Authorization: token $FORGEJO_TOKEN" \
"$API_BASE/repos/$OWNER/$REPO/pulls/$PR_NUMBER/files" | \
python3 -c "import json,sys; [print(f['filename']) for f in json.load(sys.stdin)]" 2>/dev/null)
# 根据文件类型打标签
echo "$FILES" | grep -qE '\.php$' && LABELS="$LABELS,php"
echo "$FILES" | grep -qE '\.(js|ts|tsx|jsx)$' && LABELS="$LABELS,frontend"
echo "$FILES" | grep -qE '\.(css|scss|less)$' && LABELS="$LABELS,style"
echo "$FILES" | grep -qE '\.go$' && LABELS="$LABELS,go"
echo "$FILES" | grep -qE '\.(yml|yaml)$' && LABELS="$LABELS,ci/cd"
echo "$FILES" | grep -qE '(composer\.|package\.json|go\.mod)' && LABELS="$LABELS,dependencies"
echo "$FILES" | grep -qE '\.(md|txt|rst)$' && LABELS="$LABELS,documentation"
echo "$FILES" | grep -qE '(Dockerfile|docker-compose)' && LABELS="$LABELS,docker"
# 根据 PR 大小打标签
ADDITIONS=$(curl -s -H "Authorization: token $FORGEJO_TOKEN" \
"$API_BASE/repos/$OWNER/$REPO/pulls/$PR_NUMBER" | \
python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('additions',0)+d.get('deletions',0))" 2>/dev/null)
if [ "$ADDITIONS" -lt 10 ] 2>/dev/null; then
LABELS="$LABELS,size/S"
elif [ "$ADDITIONS" -lt 100 ] 2>/dev/null; then
LABELS="$LABELS,size/M"
elif [ "$ADDITIONS" -lt 500 ] 2>/dev/null; then
LABELS="$LABELS,size/L"
else
LABELS="$LABELS,size/XL"
fi
# 去掉开头逗号
LABELS="${LABELS#,}"
if [ -z "$LABELS" ]; then
echo "无需添加标签"
exit 0
fi
echo "添加标签: $LABELS"
# 确保标签存在,不存在则创建
IFS=',' read -ra LABEL_ARRAY <<< "$LABELS"
LABEL_IDS="["
for LABEL in "${LABEL_ARRAY[@]}"; do
# 查找标签
LABEL_ID=$(curl -s -H "Authorization: token $FORGEJO_TOKEN" \
"$API_BASE/repos/$OWNER/$REPO/labels?limit=50" | \
python3 -c "
import json,sys
labels=json.load(sys.stdin)
for l in labels:
if l['name']=='$LABEL':
print(l['id'])
break
" 2>/dev/null)
# 标签不存在则创建
if [ -z "$LABEL_ID" ]; then
# 根据标签类型选颜色
case "$LABEL" in
php) COLOR="#4F5D95" ;;
frontend) COLOR="#f1e05a" ;;
go) COLOR="#00ADD8" ;;
ci/cd) COLOR="#0075ca" ;;
dependencies) COLOR="#0366d6" ;;
documentation) COLOR="#0075ca" ;;
docker) COLOR="#0db7ed" ;;
style) COLOR="#e34c26" ;;
size/S) COLOR="#009900" ;;
size/M) COLOR="#FFCC00" ;;
size/L) COLOR="#FF6600" ;;
size/XL) COLOR="#CC0000" ;;
*) COLOR="#ededed" ;;
esac
LABEL_ID=$(curl -s -X POST -H "Authorization: token $FORGEJO_TOKEN" \
"$API_BASE/repos/$OWNER/$REPO/labels" \
-H "Content-Type: application/json" \
-d "{\"name\":\"$LABEL\",\"color\":\"$COLOR\"}" | \
python3 -c "import json,sys; print(json.load(sys.stdin).get('id',''))" 2>/dev/null)
fi
[ -n "$LABEL_ID" ] && LABEL_IDS="$LABEL_IDS$LABEL_ID,"
done
LABEL_IDS="${LABEL_IDS%,}]"
# 添加标签到 PR
curl -s -X POST -H "Authorization: token $FORGEJO_TOKEN" \
"$API_BASE/repos/$OWNER/$REPO/issues/$PR_NUMBER/labels" \
-H "Content-Type: application/json" \
-d "{\"labels\":$LABEL_IDS}" > /dev/null
echo "标签添加完成"