#!/usr/bin/env bash # TETRIG 릴리스 스크립트 # # scripts/release.sh [major|minor|patch] # 기본 patch # # 하는 일: # 1) app/gradle.properties 의 appVersionName 을 semver 로 올리고 appVersionCode 를 +1 # 2) 테스트 → 릴리스 APK/AAB 빌드 (keystore.properties 로 서명) # 3) 버전 커밋 + vX.Y.Z 태그 + push # 4) Gitea 릴리스 생성 후 APK/AAB 업로드 # # 필요 환경: # JAVA_HOME (JDK 17+), ANDROID_HOME, app/keystore.properties # GITEA_TOKEN (없으면 ~/.config/ejclaw/secrets.json 의 git.tkrmagid.kr 토큰 사용) set -euo pipefail BUMP="${1:-patch}" ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" PROPS="$ROOT/app/gradle.properties" GITEA_HOST="https://git.tkrmagid.kr" REPO="tkrmagid/tetrig" [ -f "$ROOT/app/keystore.properties" ] || { echo "app/keystore.properties 가 없습니다 (서명 불가)"; exit 1; } cur_name=$(grep -E '^appVersionName=' "$PROPS" | cut -d= -f2) cur_code=$(grep -E '^appVersionCode=' "$PROPS" | cut -d= -f2) IFS=. read -r MA MI PA <<< "$cur_name" case "$BUMP" in major) MA=$((MA+1)); MI=0; PA=0 ;; minor) MI=$((MI+1)); PA=0 ;; patch) PA=$((PA+1)) ;; *) echo "usage: $0 [major|minor|patch]"; exit 1 ;; esac new_name="$MA.$MI.$PA" new_code=$((cur_code+1)) echo "버전: $cur_name($cur_code) → $new_name($new_code)" sed -i "s/^appVersionName=.*/appVersionName=$new_name/" "$PROPS" sed -i "s/^appVersionCode=.*/appVersionCode=$new_code/" "$PROPS" cd "$ROOT/app" ./gradlew :composeApp:testDebugUnitTest :composeApp:assembleRelease :composeApp:bundleRelease \ -PappVersionName="$new_name" -PappVersionCode="$new_code" OUT="$ROOT/app/composeApp/build/outputs" APK="$OUT/apk/release/composeApp-release.apk" AAB="$OUT/bundle/release/composeApp-release.aab" [ -f "$APK" ] || { echo "APK 빌드 실패"; exit 1; } DIST="$ROOT/app/build/dist" mkdir -p "$DIST" cp "$APK" "$DIST/TETRIG-v$new_name.apk" cp "$AAB" "$DIST/TETRIG-v$new_name.aab" cd "$ROOT" git add app/gradle.properties git commit -m "release: v$new_name (versionCode $new_code)" git tag -a "v$new_name" -m "TETRIG v$new_name" TOKEN="${GITEA_TOKEN:-$(node -e 'console.log(require(process.env.HOME+"/.config/ejclaw/secrets.json").credentials["git.tkrmagid.kr"].token)' 2>/dev/null || true)}" [ -n "$TOKEN" ] || { echo "GITEA_TOKEN 이 없습니다"; exit 1; } git push "$GITEA_HOST/$REPO.git" HEAD:main --tags echo "Gitea 릴리스 생성..." REL_ID=$(curl -sS -X POST "$GITEA_HOST/api/v1/repos/$REPO/releases" \ -H "Authorization: token $TOKEN" -H "Content-Type: application/json" \ -d "{\"tag_name\":\"v$new_name\",\"name\":\"TETRIG v$new_name\",\"body\":\"versionCode $new_code\\n\\n안드로이드: TETRIG-v$new_name.apk 를 내려받아 설치하세요.\\nPlay Console 업로드: TETRIG-v$new_name.aab\",\"draft\":false,\"prerelease\":false}" \ | node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>{const j=JSON.parse(d);if(!j.id){console.error(d);process.exit(1)}console.log(j.id)})') for f in "TETRIG-v$new_name.apk" "TETRIG-v$new_name.aab"; do echo " 업로드: $f" curl -sS -X POST "$GITEA_HOST/api/v1/repos/$REPO/releases/$REL_ID/assets?name=$f" \ -H "Authorization: token $TOKEN" -F "attachment=@$DIST/$f" > /dev/null done echo "완료: $GITEA_HOST/$REPO/releases/tag/v$new_name"