114 lines
3.5 KiB
Bash
Executable File
114 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Gitea adapter を使う場合に Webhook を登録するスクリプト
|
|
#
|
|
# 使い方:
|
|
# ./scripts/setup-repo.sh owner/repo
|
|
# ./scripts/setup-repo.sh owner/repo http://orchestrator-host:9877
|
|
#
|
|
# 環境変数:
|
|
# GITEA_URL Gitea の URL(デフォルト: config.yaml から取得)
|
|
# GITEA_API_TOKEN Gitea API トークン(必須)
|
|
# GITEA_WEBHOOK_SECRET Webhook シークレット(必須)
|
|
# ORCHESTRATOR_URL Orchestrator の URL(引数でも指定可)
|
|
#
|
|
set -euo pipefail
|
|
|
|
REPO="${1:-}"
|
|
ORCHESTRATOR_URL="${2:-${ORCHESTRATOR_URL:-}}"
|
|
|
|
if [ -z "$REPO" ]; then
|
|
echo "Usage: $0 <owner/repo> [orchestrator-url]"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 myorg/myrepo"
|
|
echo " $0 myorg/myrepo http://10.0.0.10:9877"
|
|
echo ""
|
|
echo "Environment variables:"
|
|
echo " GITEA_API_TOKEN (required) Gitea API token"
|
|
echo " GITEA_WEBHOOK_SECRET (required) Webhook secret"
|
|
echo " GITEA_URL Gitea URL (default: from config.yaml)"
|
|
echo " ORCHESTRATOR_URL Orchestrator URL (default: http://localhost:9876)"
|
|
exit 1
|
|
fi
|
|
|
|
# config.yaml から GITEA_URL を取得(未設定の場合)
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
|
|
|
if [ -z "${GITEA_URL:-}" ] && [ -f "$PROJECT_DIR/config.yaml" ]; then
|
|
GITEA_URL=$(grep -E '^\s*url:' "$PROJECT_DIR/config.yaml" | head -1 | sed 's/.*url:\s*//' | tr -d '"' | tr -d "'")
|
|
fi
|
|
GITEA_URL="${GITEA_URL:-https://localhost:3000}"
|
|
|
|
if [ -z "${GITEA_API_TOKEN:-}" ]; then
|
|
echo "Error: GITEA_API_TOKEN is not set"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "${GITEA_WEBHOOK_SECRET:-}" ]; then
|
|
echo "Error: GITEA_WEBHOOK_SECRET is not set"
|
|
exit 1
|
|
fi
|
|
|
|
ORCHESTRATOR_URL="${ORCHESTRATOR_URL:-http://localhost:9876}"
|
|
WEBHOOK_URL="${ORCHESTRATOR_URL}/webhook"
|
|
|
|
echo "Setting up MAESTRO Gitea webhook..."
|
|
echo " Gitea: $GITEA_URL"
|
|
echo " Repository: $REPO"
|
|
echo " Webhook URL: $WEBHOOK_URL"
|
|
echo ""
|
|
|
|
# 既存の webhook を確認
|
|
EXISTING=$(curl -sf \
|
|
-H "Authorization: token ${GITEA_API_TOKEN}" \
|
|
"${GITEA_URL}/api/v1/repos/${REPO}/hooks" 2>/dev/null || echo "[]")
|
|
|
|
# 同じ URL の webhook が既にあるかチェック
|
|
if echo "$EXISTING" | python3 -c "
|
|
import sys, json
|
|
hooks = json.load(sys.stdin)
|
|
for h in hooks:
|
|
if h.get('config', {}).get('url', '') == '${WEBHOOK_URL}':
|
|
print(h['id'])
|
|
sys.exit(0)
|
|
sys.exit(1)
|
|
" 2>/dev/null; then
|
|
echo "Webhook already exists for this URL. Skipping creation."
|
|
exit 0
|
|
fi
|
|
|
|
# Webhook 作成
|
|
RESPONSE=$(curl -sf -X POST \
|
|
-H "Authorization: token ${GITEA_API_TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
"${GITEA_URL}/api/v1/repos/${REPO}/hooks" \
|
|
-d "{
|
|
\"type\": \"gitea\",
|
|
\"active\": true,
|
|
\"events\": [\"issues\", \"issue_comment\"],
|
|
\"config\": {
|
|
\"url\": \"${WEBHOOK_URL}\",
|
|
\"content_type\": \"json\",
|
|
\"secret\": \"${GITEA_WEBHOOK_SECRET}\"
|
|
}
|
|
}")
|
|
|
|
HOOK_ID=$(echo "$RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])" 2>/dev/null || echo "unknown")
|
|
echo "Webhook created (ID: ${HOOK_ID})"
|
|
|
|
# ヘルスチェック
|
|
echo ""
|
|
echo -n "Checking orchestrator health... "
|
|
if curl -sf "${ORCHESTRATOR_URL}/health" > /dev/null 2>&1; then
|
|
echo "OK"
|
|
else
|
|
echo "WARN: orchestrator not reachable at ${ORCHESTRATOR_URL}"
|
|
echo " Make sure the orchestrator is running and accessible from Gitea."
|
|
fi
|
|
|
|
echo ""
|
|
echo "Done! Create an issue on ${GITEA_URL}/${REPO} to test."
|
|
echo "If you run in local mode, this script is not needed."
|