Release Healer Man 0.1.3
This commit is contained in:
@@ -28,13 +28,34 @@ foreach ($secret in $requiredSecrets) {
|
||||
}
|
||||
|
||||
$projectRoot = Split-Path -Parent $PSScriptRoot
|
||||
$packageVersion = (Get-Content -LiteralPath (Join-Path $projectRoot 'package.json') -Raw | ConvertFrom-Json).version
|
||||
$releaseVersionPath = Join-Path $projectRoot 'release-version.json'
|
||||
if (-not (Test-Path -LiteralPath $releaseVersionPath)) {
|
||||
throw "Canonical release metadata is missing: $releaseVersionPath"
|
||||
}
|
||||
$releaseVersion = Get-Content -LiteralPath $releaseVersionPath -Raw | ConvertFrom-Json
|
||||
if ($packageVersion -ne $VersionName -or $releaseVersion.versionName -ne $VersionName) {
|
||||
throw "VersionName $VersionName does not match package.json and release-version.json."
|
||||
}
|
||||
if ([int]$releaseVersion.versionCode -ne $VersionCode) {
|
||||
throw "VersionCode $VersionCode does not match release-version.json ($($releaseVersion.versionCode))."
|
||||
}
|
||||
$env:ANDROID_VERSION_NAME = $VersionName
|
||||
$env:ANDROID_VERSION_CODE = [string]$VersionCode
|
||||
|
||||
Push-Location $projectRoot
|
||||
try {
|
||||
$initialGitStatus = & git status --porcelain
|
||||
if ($LASTEXITCODE -ne 0) { throw "Unable to inspect the Git working tree." }
|
||||
if ($initialGitStatus) { throw "APK publication requires a clean Git working tree." }
|
||||
|
||||
& npm run android:sync
|
||||
if ($LASTEXITCODE -ne 0) { throw "Android web build and Capacitor sync failed with exit code $LASTEXITCODE" }
|
||||
$postSyncGitStatus = & git status --porcelain --untracked-files=no
|
||||
if ($LASTEXITCODE -ne 0) { throw "Unable to inspect Android sync changes." }
|
||||
if ($postSyncGitStatus) {
|
||||
throw "Android sync changed tracked files. Review and commit them before publishing the APK."
|
||||
}
|
||||
& powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/runAndroidGradle.ps1 assembleRelease
|
||||
if ($LASTEXITCODE -ne 0) { throw "Android release build failed with exit code $LASTEXITCODE" }
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
@echo off
|
||||
setlocal
|
||||
cd /d "%~dp0.."
|
||||
where py >nul 2>&1
|
||||
if errorlevel 1 goto use_python
|
||||
py -3 scripts\release_manager.py %*
|
||||
exit /b %errorlevel%
|
||||
|
||||
:use_python
|
||||
python scripts\release_manager.py %*
|
||||
exit /b %errorlevel%
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,49 @@
|
||||
import unittest
|
||||
|
||||
import release_manager
|
||||
|
||||
|
||||
class VersionTests(unittest.TestCase):
|
||||
def test_bumps_each_semver_component(self):
|
||||
self.assertEqual(release_manager.bump_semver("0.1.2", "patch"), "0.1.3")
|
||||
self.assertEqual(release_manager.bump_semver("0.1.2", "minor"), "0.2.0")
|
||||
self.assertEqual(release_manager.bump_semver("0.1.2", "major"), "1.0.0")
|
||||
|
||||
def test_android_code_is_monotonic(self):
|
||||
self.assertEqual(release_manager.semantic_version_code("0.1.3"), 1003)
|
||||
self.assertEqual(release_manager.suggest_version_code("0.1.3", 5000), 5001)
|
||||
|
||||
def test_rejects_non_release_semver(self):
|
||||
with self.assertRaises(ValueError):
|
||||
release_manager.parse_semver("1.2")
|
||||
|
||||
|
||||
class SafetyTests(unittest.TestCase):
|
||||
def test_detects_outputs_and_secrets(self):
|
||||
paths = [
|
||||
"src/game/example.ts",
|
||||
"dist-android/assets/app.js",
|
||||
"android/app/release.apk",
|
||||
".env.production",
|
||||
"FINE.key.ts",
|
||||
"scripts/content/publish-content.mjs",
|
||||
"public/data/healer-man-loot.sqlite",
|
||||
]
|
||||
self.assertEqual(
|
||||
release_manager.find_dangerous_staged_paths(paths),
|
||||
[
|
||||
"dist-android/assets/app.js",
|
||||
"android/app/release.apk",
|
||||
".env.production",
|
||||
],
|
||||
)
|
||||
|
||||
def test_truenas_commands_pin_expected_commit(self):
|
||||
block = release_manager.generate_truenas_deploy_commands("abc123")
|
||||
self.assertIn("EXPECTED_COMMIT='abc123'", block)
|
||||
self.assertIn("pull --ff-only", block)
|
||||
self.assertIn('test "$ACTUAL_COMMIT" = "$EXPECTED_COMMIT"', block)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -8,7 +8,8 @@ $ErrorActionPreference = 'Stop'
|
||||
$projectRoot = Split-Path -Parent $PSScriptRoot
|
||||
$documentsRoot = Split-Path -Parent $projectRoot
|
||||
$wowRoot = Join-Path $documentsRoot 'wow335a'
|
||||
$jdkRoot = Join-Path $wowRoot 'dungeon-export-work\tools\temurin-21'
|
||||
$projectJdkRoot = Join-Path $projectRoot '.tools\temurin-21'
|
||||
$legacyJdkRoot = Join-Path $wowRoot 'dungeon-export-work\tools\temurin-21'
|
||||
$portableSdkRoot = Join-Path $wowRoot '.android-sdk'
|
||||
|
||||
$jdkHome = $null
|
||||
@@ -16,14 +17,17 @@ $configuredJavaHome = [Environment]::GetEnvironmentVariable('JAVA_HOME')
|
||||
if ($configuredJavaHome -and (Test-Path -LiteralPath (Join-Path $configuredJavaHome 'bin\java.exe'))) {
|
||||
$jdkHome = Get-Item -LiteralPath $configuredJavaHome
|
||||
} else {
|
||||
$jdkHome = Get-ChildItem -LiteralPath $jdkRoot -Directory -ErrorAction SilentlyContinue |
|
||||
Where-Object { Test-Path -LiteralPath (Join-Path $_.FullName 'bin\java.exe') } |
|
||||
$jdkHome = @($projectJdkRoot, $legacyJdkRoot) |
|
||||
ForEach-Object {
|
||||
Get-ChildItem -LiteralPath $_ -Directory -ErrorAction SilentlyContinue |
|
||||
Where-Object { Test-Path -LiteralPath (Join-Path $_.FullName 'bin\java.exe') }
|
||||
} |
|
||||
Sort-Object Name -Descending |
|
||||
Select-Object -First 1
|
||||
}
|
||||
|
||||
if (-not $jdkHome) {
|
||||
throw "Java 21 was not found. Set JAVA_HOME or install the portable JDK under $jdkRoot"
|
||||
throw "Java 21 was not found. Set JAVA_HOME or install the portable JDK under $projectJdkRoot"
|
||||
}
|
||||
|
||||
$configuredSdkRoot = [Environment]::GetEnvironmentVariable('ANDROID_SDK_ROOT')
|
||||
|
||||
Reference in New Issue
Block a user