Explorar el Código

chore: add one-shot GitHub repo creation + release push script

conexocasa hace 7 meses
padre
commit
7f4bf7529a
Se han modificado 1 ficheros con 213 adiciones y 0 borrados
  1. 213 0
      create_github_repo.sh

+ 213 - 0
create_github_repo.sh

@@ -0,0 +1,213 @@
+#!/usr/bin/env bash
+# =============================================================================
+# create_github_repo.sh
+# One-shot script to:
+#   1) Create the GitHub repository conexocasa/solar-of-things-ha (if missing)
+#   2) Push main branch + all tags (v2.1.0, v2.1.1)
+#   3) Create a DRAFT GitHub Release for v2.1.1 and upload solar-of-things-ha.zip
+#
+# Usage:
+#   export GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx
+#   bash create_github_repo.sh
+#
+# Requirements: git, curl, jq (installed by script if missing)
+# =============================================================================
+
+set -euo pipefail
+
+# ── Config ────────────────────────────────────────────────────────────────────
+GITHUB_USERNAME="conexocasa"
+GITHUB_EMAIL="bob@conexo.casa"
+REPO_NAME="solar-of-things-ha"
+REPO_DESC="Home Assistant custom integration for Solar of Things (Siseli) solar inverters — monitoring + control"
+RELEASE_TAG="v2.1.1"
+RELEASE_TITLE="v2.1.1 — HACS metadata, GitHub Actions, issue templates"
+ZIP_ASSET="solar-of-things-ha.zip"
+# ─────────────────────────────────────────────────────────────────────────────
+
+RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
+ok()   { echo -e "${GREEN}✓${NC} $*"; }
+warn() { echo -e "${YELLOW}⚠${NC}  $*"; }
+err()  { echo -e "${RED}✗${NC}  $*"; exit 1; }
+
+# ── Token ─────────────────────────────────────────────────────────────────────
+if [ -z "${GITHUB_TOKEN:-}" ]; then
+  echo -n "GitHub Personal Access Token (repo scope): "
+  read -s GITHUB_TOKEN
+  echo
+fi
+[ -z "$GITHUB_TOKEN" ] && err "GITHUB_TOKEN is required."
+
+API="https://api.github.com"
+AUTH_HEADER="Authorization: token $GITHUB_TOKEN"
+ACCEPT="Accept: application/vnd.github.v3+json"
+
+# ── Dependencies ──────────────────────────────────────────────────────────────
+if ! command -v jq &>/dev/null; then
+  warn "jq not found — installing…"
+  apt-get install -y -q jq 2>/dev/null || brew install jq 2>/dev/null || err "Install jq manually."
+fi
+
+# ── Git identity ──────────────────────────────────────────────────────────────
+git config --global user.email "$GITHUB_EMAIL"
+git config --global user.name  "$GITHUB_USERNAME"
+ok "Git identity set ($GITHUB_EMAIL)"
+
+# ── Step 1: Create repository (idempotent) ────────────────────────────────────
+echo ""
+echo "══════════════════════════════════════════════"
+echo " STEP 1 · Create GitHub repository"
+echo "══════════════════════════════════════════════"
+
+RESP=$(curl -s -o /tmp/gh_create.json -w "%{http_code}" \
+  -X POST "$API/user/repos" \
+  -H "$AUTH_HEADER" -H "$ACCEPT" \
+  -d "{
+    \"name\":\"$REPO_NAME\",
+    \"description\":\"$REPO_DESC\",
+    \"private\":false,
+    \"has_issues\":true,
+    \"has_projects\":false,
+    \"has_wiki\":false,
+    \"default_branch\":\"main\"
+  }")
+
+if [ "$RESP" = "201" ]; then
+  ok "Repository created: https://github.com/$GITHUB_USERNAME/$REPO_NAME"
+elif [ "$RESP" = "422" ]; then
+  warn "Repository already exists — continuing."
+else
+  cat /tmp/gh_create.json
+  err "Unexpected HTTP $RESP from repo creation."
+fi
+
+# ── Step 2: Push main + all tags ──────────────────────────────────────────────
+echo ""
+echo "══════════════════════════════════════════════"
+echo " STEP 2 · Push main branch + tags"
+echo "══════════════════════════════════════════════"
+
+REMOTE_URL="https://${GITHUB_TOKEN}@github.com/${GITHUB_USERNAME}/${REPO_NAME}.git"
+
+git remote remove origin 2>/dev/null || true
+git remote add origin "$REMOTE_URL"
+
+git branch -M main
+
+if git push origin main --force; then
+  ok "Pushed branch main"
+else
+  err "Failed to push main"
+fi
+
+if git push origin --tags --force; then
+  ok "Pushed all tags ($(git tag --list | tr '\n' ' '))"
+else
+  err "Failed to push tags"
+fi
+
+# Clean up token from remote URL
+git remote set-url origin "https://github.com/${GITHUB_USERNAME}/${REPO_NAME}.git"
+
+# ── Step 3: Create draft GitHub Release for RELEASE_TAG ───────────────────────
+echo ""
+echo "══════════════════════════════════════════════"
+echo " STEP 3 · Create draft release $RELEASE_TAG"
+echo "══════════════════════════════════════════════"
+
+# Extract changelog section for RELEASE_TAG
+VER="${RELEASE_TAG#v}"
+RELEASE_BODY=$(awk "/^## \[$VER\]/{flag=1; next} /^## \[/{flag=0} flag" CHANGELOG.md || true)
+if [ -z "$RELEASE_BODY" ]; then
+  RELEASE_BODY="See CHANGELOG.md for full details."
+fi
+RELEASE_BODY_JSON=$(jq -Rs . <<< "$RELEASE_BODY")
+
+# Delete existing draft for same tag if any
+EXISTING_ID=$(curl -s -H "$AUTH_HEADER" -H "$ACCEPT" \
+  "$API/repos/$GITHUB_USERNAME/$REPO_NAME/releases" \
+  | jq -r ".[] | select(.tag_name==\"$RELEASE_TAG\") | .id" | head -1)
+
+if [ -n "$EXISTING_ID" ]; then
+  warn "Deleting existing release id=$EXISTING_ID for $RELEASE_TAG"
+  curl -s -X DELETE "$API/repos/$GITHUB_USERNAME/$REPO_NAME/releases/$EXISTING_ID" \
+    -H "$AUTH_HEADER" -H "$ACCEPT" > /dev/null
+fi
+
+RELEASE_RESP=$(curl -s -X POST \
+  "$API/repos/$GITHUB_USERNAME/$REPO_NAME/releases" \
+  -H "$AUTH_HEADER" -H "$ACCEPT" \
+  -d "{
+    \"tag_name\":\"$RELEASE_TAG\",
+    \"target_commitish\":\"main\",
+    \"name\":\"$RELEASE_TITLE\",
+    \"body\":$RELEASE_BODY_JSON,
+    \"draft\":true,
+    \"prerelease\":false
+  }")
+
+RELEASE_ID=$(echo "$RELEASE_RESP" | jq -r '.id // empty')
+UPLOAD_URL=$(echo "$RELEASE_RESP" | jq -r '.upload_url // empty' | sed 's/{.*}//')
+
+if [ -z "$RELEASE_ID" ]; then
+  echo "$RELEASE_RESP"
+  err "Failed to create draft release."
+fi
+ok "Draft release created (id=$RELEASE_ID)"
+
+# ── Step 4: Upload ZIP asset ──────────────────────────────────────────────────
+echo ""
+echo "══════════════════════════════════════════════"
+echo " STEP 4 · Upload $ZIP_ASSET"
+echo "══════════════════════════════════════════════"
+
+# Locate the zip file (same dir as script, or outputs dir)
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+ZIP_PATH=""
+for candidate in \
+    "$SCRIPT_DIR/$ZIP_ASSET" \
+    "/mnt/user-data/outputs/$ZIP_ASSET" \
+    "$(pwd)/$ZIP_ASSET"; do
+  if [ -f "$candidate" ]; then
+    ZIP_PATH="$candidate"
+    break
+  fi
+done
+
+if [ -z "$ZIP_PATH" ]; then
+  warn "Could not find $ZIP_ASSET — skipping upload."
+  warn "To upload manually: attach '$ZIP_ASSET' on the draft release page:"
+  echo "  https://github.com/$GITHUB_USERNAME/$REPO_NAME/releases/edit/$RELEASE_ID"
+else
+  UPLOAD_RESP=$(curl -s -X POST \
+    "${UPLOAD_URL}?name=${ZIP_ASSET}&label=${ZIP_ASSET}" \
+    -H "$AUTH_HEADER" \
+    -H "Content-Type: application/zip" \
+    --data-binary @"$ZIP_PATH")
+  ASSET_URL=$(echo "$UPLOAD_RESP" | jq -r '.browser_download_url // empty')
+  if [ -n "$ASSET_URL" ]; then
+    ok "Asset uploaded: $ASSET_URL"
+  else
+    warn "Asset upload may have failed:"
+    echo "$UPLOAD_RESP" | jq '.' 2>/dev/null || echo "$UPLOAD_RESP"
+  fi
+fi
+
+# ── Done ──────────────────────────────────────────────────────────────────────
+echo ""
+echo "══════════════════════════════════════════════"
+echo " SUCCESS"
+echo "══════════════════════════════════════════════"
+echo ""
+echo "  Repository : https://github.com/$GITHUB_USERNAME/$REPO_NAME"
+echo "  Branch     : main"
+echo "  Tags       : $(git tag --list | tr '\n' ' ')"
+echo "  Draft release page:"
+echo "  https://github.com/$GITHUB_USERNAME/$REPO_NAME/releases/edit/$RELEASE_ID"
+echo ""
+echo "  Next steps:"
+echo "  1. Visit the draft release link above."
+echo "  2. Review release notes and attached ZIP."
+echo "  3. Click 'Publish release' when ready."
+echo "  4. For HACS: Settings → Devices & Services → Add Integration → Solar of Things"
+echo ""