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 릴리스 자동화
78 lines
3.2 KiB
Bash
Executable File
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"
|