included Sparkle

This commit is contained in:
Micha
2025-11-22 18:56:55 +01:00
parent db1f15f981
commit dc710d53aa
15 changed files with 579 additions and 28 deletions

View File

@@ -7,12 +7,17 @@ ARTIFACTS_DIR="$ROOT_DIR/dist"
SCHEME="iKeyMon"
PROJECT="iKeyMon.xcodeproj"
CREDENTIALS_FILE="$ROOT_DIR/.signing.env"
VERSION_FILE="$ROOT_DIR/version.json"
if [[ -f "$CREDENTIALS_FILE" ]]; then
set -a
# shellcheck disable=SC1090
source "$CREDENTIALS_FILE"
set +a
fi
"$ROOT_DIR/scripts/sync_version.sh"
rm -rf "$BUILD_DIR" "$ARTIFACTS_DIR"
mkdir -p "$ARTIFACTS_DIR"
@@ -51,14 +56,13 @@ ln -s /Applications "$STAGING_DIR/Applications"
mkdir -p "$STAGING_DIR/.background"
cp "$ROOT_DIR/Assets/dmg_background.png" "$STAGING_DIR/.background/background.png"
VERSION=$(xcodebuild \
-project "$ROOT_DIR/$PROJECT" \
-scheme "$SCHEME" \
-configuration Release \
-showBuildSettings | awk '/MARKETING_VERSION/ {print $3; exit}')
if [[ -z "$VERSION" ]]; then
VERSION="dev"
fi
VERSION="$(python3 - <<'PY' "$VERSION_FILE"
import json, sys
with open(sys.argv[1], "r", encoding="utf-8") as handle:
data = json.load(handle)
print(data.get("marketing_version", "dev"))
PY
)"
ZIP_NAME="iKeyMon-${VERSION}.zip"
pushd "$(dirname "$APP_PATH")" >/dev/null
zip -r "$ARTIFACTS_DIR/$ZIP_NAME" "$(basename "$APP_PATH")"
@@ -80,6 +84,12 @@ else
fi
rm -rf "$STAGING_DIR"
if [[ -n "${GITEA_TOKEN:-}" && -n "${GITEA_OWNER:-}" && -n "${GITEA_REPO:-}" ]]; then
"$ROOT_DIR/scripts/publish_release.sh" "$VERSION" "$ARTIFACTS_DIR/$ZIP_NAME" "$ARTIFACTS_DIR/$DMG_NAME"
else
echo " Skipping Gitea release publishing (GITEA_* variables not fully set)."
fi
echo "✅ Build complete. Artifacts:"
echo " - $ARTIFACTS_DIR/$ZIP_NAME"
echo " - $ARTIFACTS_DIR/$DMG_NAME"

81
scripts/publish_release.sh Executable file
View File

@@ -0,0 +1,81 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
VERSION="$1"
ZIP_PATH="$2"
DMG_PATH="$3"
: "${GITEA_TOKEN:?Set GITEA_TOKEN in .signing.env}"
: "${GITEA_OWNER:?Set GITEA_OWNER in .signing.env}"
: "${GITEA_REPO:?Set GITEA_REPO in .signing.env}"
TARGET_COMMIT="${GITEA_TARGET_COMMIT:-$(git -C "$ROOT_DIR" rev-parse HEAD)}"
API_BASE="${GITEA_API_BASE:-https://git.24unix.net/api/v1}"
API_BASE="${API_BASE%/}"
RELEASE_TAG="v${VERSION}"
API_URL="${API_BASE}/repos/${GITEA_OWNER}/${GITEA_REPO}"
if ! command -v jq >/dev/null 2>&1; then
echo "❌ jq is required to parse Gitea responses." >&2
exit 1
fi
PRERELEASE_FLAG="${GITEA_PRERELEASE:-true}"
create_payload="$(jq -n \
--arg tag "$RELEASE_TAG" \
--arg name "iKeyMon ${VERSION}" \
--arg target "$TARGET_COMMIT" \
--argjson prerelease "$PRERELEASE_FLAG" \
'{ tag_name: $tag, name: $name, target_commitish: $target, draft: false, prerelease: $prerelease }')"
response_file="$(mktemp)"
http_code=$(curl -sS -w "%{http_code}" -o "$response_file" \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/json" \
-X POST \
-d "$create_payload" \
"${API_URL}/releases")
if [[ "$http_code" == "201" ]]; then
echo "✅ Created release ${RELEASE_TAG}"
elif [[ "$http_code" == "409" ]]; then
echo " Release ${RELEASE_TAG} already exists, fetching existing ID."
else
echo "❌ Failed to create release (HTTP ${http_code}):"
cat "$response_file"
rm -f "$response_file"
exit 1
fi
if [[ "$http_code" == "409" ]]; then
curl -sS \
-H "Authorization: token ${GITEA_TOKEN}" \
"${API_URL}/releases/tags/${RELEASE_TAG}" >"$response_file"
fi
release_id=$(jq -r '.id' "$response_file")
rm -f "$response_file"
if [[ -z "$release_id" || "$release_id" == "null" ]]; then
echo "❌ Could not determine release ID for ${RELEASE_TAG}"
exit 1
fi
upload_asset() {
local file="$1"
local filename
filename="$(basename "$file")"
echo "⬆️ Uploading ${filename}"
curl -sS \
-H "Authorization: token ${GITEA_TOKEN}" \
-F "attachment=@${file}" \
"${API_URL}/releases/${release_id}/assets" >/dev/null
}
upload_asset "$ZIP_PATH"
upload_asset "$DMG_PATH"
echo "🎉 Release ${RELEASE_TAG} assets uploaded."

56
scripts/sync_version.sh Executable file
View File

@@ -0,0 +1,56 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
VERSION_FILE="$ROOT_DIR/version.json"
PROJECT_FILE="$ROOT_DIR/iKeyMon.xcodeproj/project.pbxproj"
if [[ ! -f "$VERSION_FILE" ]]; then
echo "❌ version.json not found at $VERSION_FILE" >&2
exit 1
fi
if ! command -v jq >/dev/null 2>&1; then
echo "❌ jq is required but not found in PATH" >&2
exit 1
fi
MARKETING_VERSION="$(jq -r '.marketing_version // empty' "$VERSION_FILE")"
if [[ -z "$MARKETING_VERSION" ]]; then
echo "❌ marketing_version missing in $VERSION_FILE" >&2
exit 1
fi
if [[ ! "$MARKETING_VERSION" =~ ^[0-9]{2}\.[0-9]+\.[0-9]+$ ]]; then
echo "❌ marketing_version '$MARKETING_VERSION' must follow YY.major.minor (e.g. 26.1.2)" >&2
exit 1
fi
BUILD_NUMBER="${BUILD_NUMBER:-$(git -C "$ROOT_DIR" rev-list --count HEAD)}"
if [[ -z "$BUILD_NUMBER" ]]; then
echo "❌ Unable to derive BUILD_NUMBER" >&2
exit 1
fi
update_setting() {
local key="$1"
local value="$2"
local tmp
tmp="$(mktemp)"
LC_ALL=C sed -E "s/(${key}[[:space:]]*=[[:space:]]*)[^;]+;/\\1${value};/g" "$PROJECT_FILE" >"$tmp"
if cmp -s "$tmp" "$PROJECT_FILE"; then
if ! grep -q "${key} = ${value};" "$PROJECT_FILE"; then
rm -f "$tmp"
echo "❌ Failed to update ${key} in $PROJECT_FILE" >&2
exit 1
fi
rm -f "$tmp"
return
fi
mv "$tmp" "$PROJECT_FILE"
}
update_setting "MARKETING_VERSION" "$MARKETING_VERSION"
update_setting "CURRENT_PROJECT_VERSION" "$BUILD_NUMBER"
echo "✅ Synced marketing version $MARKETING_VERSION and build $BUILD_NUMBER into Xcode project."