#!/bin/bash setup_gitea_webhook() { show_banner "配置 Gitea Webhook" local webhook_url="${JENKINS_URL}/generic-webhook-trigger/invoke?token=${WEBHOOK_TOKEN}" log_info "Webhook URL: ${webhook_url}" check_existing_webhook create_webhook "$webhook_url" test_webhook_delivery } check_existing_webhook() { log_info "检查现有 Webhook..." local webhooks=$(gitea_api_call "GET" "/repos/${REPO_OWNER}/${REPO_NAME}/hooks") if [ -n "$webhooks" ] && [ "$webhooks" != "[]" ]; then local existing_count=$(echo "$webhooks" | jq 'length') log_warning "发现 ${existing_count} 个现有 Webhook" echo "$webhooks" | jq -r '.[] | "\(.id) | \(.url)"' | while IFS='|' read -r hook_id hook_url; do log_info " [ID: $hook_id] $hook_url" done read -p "是否删除所有旧 Webhook 并重新创建?(y/N): " delete_old if [[ "$delete_old" =~ ^[Yy]$ ]]; then echo "$webhooks" | jq -r '.[].id' | while read hook_id; do gitea_api_call "DELETE" "/repos/${REPO_OWNER}/${REPO_NAME}/hooks/${hook_id}" > /dev/null log_info " 已删除 Webhook #${hook_id}" done log_success "旧 Webhook 已清理" fi else log_success "没有发现冲突的 Webhook" fi } create_webhook() { local webhook_url="$1" log_info "创建新 Webhook..." local payload="{ \"type\": \"gitea\", \"config\": { \"url\": \"${webhook_url}\", \"content_type\": \"json\", \"secret\": \"\", \"http_method\": \"post\", \"max_builds\": 0, \"active\": true, \"events\": [ \"push\" ], \"branch_filter\": \"main,develop\" } }" local result=$(gitea_api_call "POST" "/repos/${REPO_OWNER}/${REPO_NAME}/hooks" "$payload") local hook_id=$(echo "$result" | jq -r '.id // empty') if [ -n "$hook_id" ]; then log_success "Webhook 创建成功 (ID: ${hook_id})" log_info "触发事件: Push Events (main, develop 分支)" log_info "目标 URL: ${webhook_url}" else log_error "Webhook 创建失败!" log_error "响应: $result" exit 1 fi } test_webhook_delivery() { show_banner "测试 Webhook 连通性" log_info "发送测试请求到 Gitea..." local webhooks=$(gitea_api_call "GET" "/repos/${REPO_OWNER}/${REPO_NAME}/hooks") local latest_hook_id=$(echo "$webhooks" | jq -r '.[-1].id') if [ -z "$latest_hook_id" ] || [ "$latest_hook_id" = "null" ]; then log_error "未找到可用的 Webhook ID" return 1 fi log_info "测试 Webhook #${latest_hook_id}..." local test_result=$(gitea_api_CALL "POST" "/repos/${REPO_OWNER}/${REPO_NAME}/hooks/${latest_hook_id}/tests") sleep 3 log_info "检查 Jenkins 是否收到触发..." local jenkins_jobs=$(jenkins_api_call "GET" "/job/${JOB_NAME}/api/json?tree=lastBuild[number,url,result]" 2>/dev/null) if [ -n "$jenkins_jobs" ]; then local last_build=$(echo "$jenkins_jobs" | jq '.lastBuild.number // 0') log_success "Jenkins 已收到 Webhook 触发(最新构建: #${last_build})" else log_warning "无法确认 Jenkins 是否收到触发(可能需要等待几秒)" log_info "请手动访问: ${JENKINS_URL}/job/${JOB_NAME}/" fi } show_webhook_status() { echo "" log_info "当前 Gitea Webhook 列表:" echo "─────────────────────────────────────" local webhooks=$(gitea_api_call "GET" "/repos/${REPO_OWNER}/${REPO_NAME}/hooks") if [ -n "$webhooks" ] && [ "$webhooks" != "[]" ]; then echo "$webhooks" | jq -r '.[] | "📌 [#\(.id)] \(.type) → \(.config.url)\n 状态: \(if .active then "✅ 激活" else "❌ 停用" end)\n 事件: \(.config.events | join(", "))\n 分支过滤: \(.config.branch_filter // "无")\n"' else log_info "(无 Webhook)" fi echo "" }