diff --git a/scripts/sync-gitea-webhooks.sh b/scripts/sync-gitea-webhooks.sh new file mode 100755 index 0000000..ebd61de --- /dev/null +++ b/scripts/sync-gitea-webhooks.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +set -euo pipefail + +CONFIG_FILE="/opt/appfactory/config/appfactory.env" + +if [ ! -f "$CONFIG_FILE" ]; then + echo "Missing config file: $CONFIG_FILE" + exit 1 +fi + +source "$CONFIG_FILE" + +if [ -z "${GITEA_URL:-}" ] || [ -z "${GITEA_ORG:-}" ] || [ -z "${GITEA_TOKEN:-}" ] || [ -z "${WEBHOOK_INTERNAL_URL:-}" ] || [ -z "${WEBHOOK_SECRET:-}" ]; then + echo "Missing required config values." + echo "Required: GITEA_URL, GITEA_ORG, GITEA_TOKEN, WEBHOOK_INTERNAL_URL, WEBHOOK_SECRET" + exit 1 +fi + +echo "Syncing Gitea webhooks" +echo "Org: $GITEA_ORG" +echo "URL: $WEBHOOK_INTERNAL_URL" +echo "" + +repos_json="$(curl -sS \ + "$GITEA_URL/api/v1/orgs/$GITEA_ORG/repos?limit=1000" \ + -H "Authorization: token $GITEA_TOKEN")" + +repo_names="$(echo "$repos_json" | jq -r '.[].name')" + +if [ -z "$repo_names" ]; then + echo "No repositories found." + exit 0 +fi + +for repo in $repo_names; do + echo "Repository: $repo" + + hooks_json="$(curl -sS \ + "$GITEA_URL/api/v1/repos/$GITEA_ORG/$repo/hooks" \ + -H "Authorization: token $GITEA_TOKEN")" + + hook_id="$(echo "$hooks_json" | jq -r \ + --arg url "$WEBHOOK_INTERNAL_URL" \ + '.[] | select(.type == "gitea") | select(.config.url == $url) | .id' \ + | head -n 1)" + + payload="$(jq -n \ + --arg url "$WEBHOOK_INTERNAL_URL" \ + --arg secret "$WEBHOOK_SECRET" \ + '{ + type: "gitea", + active: true, + events: ["push"], + config: { + url: $url, + content_type: "json", + secret: $secret + } + }')" + + if [ -n "$hook_id" ] && [ "$hook_id" != "null" ]; then + echo " Updating hook ID: $hook_id" + + curl -sS -X PATCH \ + "$GITEA_URL/api/v1/repos/$GITEA_ORG/$repo/hooks/$hook_id" \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d "$payload" >/dev/null + else + echo " Creating hook" + + curl -sS -X POST \ + "$GITEA_URL/api/v1/repos/$GITEA_ORG/$repo/hooks" \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d "$payload" >/dev/null + fi +done + +echo "" +echo "DONE"