Files
tetrig/scripts/release.sh
tkrmagid cbd0f62319 Kotlin Multiplatform 네이티브 앱으로 전환 (Android + iOS 공용 코드)
TWA 래퍼를 걷어내고 Compose Multiplatform 으로 다시 만들었다. 엔진·UI·모드
전부 commonMain 한 벌이라 Android 와 iOS 가 같은 코드를 쓴다.

- engine/: 웹 JS 엔진을 Kotlin 으로 이식 (SRS+180 킥, 7-bag, T-spin, B2B,
  콤보, All Clear, 점수·레벨). commonTest 28개 통과
- game/: 모드 규칙 + 중력/락딜레이/DAS/ARR 타이밍
- ui/: 네오브루탈 컴포넌트, 메인/솔로시트/인게임/결과/설정
- ui/Responsive.kt: 고정 해상도를 버리고 가용 크기에서 셀 크기·배율 계산.
  폰 세로, 플립 초세로, 플립 커버(소형), 폴드 펼침, 태블릿/아이패드 가로 대응
- androidMain: resizeableActivity + configChanges 로 접기/펴기·회전 시 재시작 없음
- iosMain + iosApp/: MainViewController + SwiftUI 껍데기 + XcodeGen 설정
  (실제 iOS 빌드는 macOS + Xcode 필요)
- scripts/release.sh: 버전 상승 → 테스트 → 서명 빌드 → 태그 → Gitea 릴리스 자동화
2026-09-23 10:37:17 +09:00

78 lines
3.2 KiB
Bash
Executable File

#!/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"