Add pinned Docker APK builds and release signing #13
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fm/wolfskin-4-build"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Outcome
make apkbuilds clean, signed default-flavor release APKs entirely inside Docker, including the real upstream native codec extensions. No host Java/SDK is required.Closes justinzeus/wolfskin#4
Changes
wolfskin-gradle; run the committed wrapper with--no-daemon, host UID/GID, and four workers. Support linked worktrees by mounting Git metadata read-only.local.properties/release.signing.confighook. Load the dedicated GitHub Packages token inside the container, never in Docker command arguments. Escrow location is overridable withWOLFSKIN_SECRETS_DIR.make release-tag: create lightweight UTCpwolfskin-YYYY_MM_DD[_N]markers locally so upstream's tag-count versionCode increases. It never pushes a tag or publishes a release.docker/README.md. All upstream Gradle source, version catalog, and.github/workflowsremain untouched.Clean signed build proof
At pushed HEAD
3094fc8cf09e8dfa1f9d48e1524a92410bec4fe9,make apkranclean assembleDefaultReleasesuccessfully: 6m26s Gradle / 6m30.174s wall, all 70 tasks executed. It produced armeabi-v7a, arm64-v8a, x86_64, and universal APKs.sha256:b9d8c758e8d909734d7527c70cc208107396bac13392e1b4366a12732742a012sha256:c4b096368df9d8e03d9c383b5c29a72bf1a8c333a4b5ac1ca7f296481c1560c7sha256:dbfd085220ae632a0830166e443747d1ee89e9038d92e3b48c3e5e9d8292b9a7apksigner verify --verbose --print-certspassed on all four APKs, with v1/v2/v3 signatures and RSA 4096. Every APK certificate SHA-256 matcheskeytool -list -von the escrowedwolfskinalias:The new PKCS12 key was generated inside the image, with 36,500-day validity (through 2126-09-28), independently of wolfskin-android. The escrow directory is 0700 and its keystore, password properties, token, and README are 0600. No secret is committed or included here.
aapt2 dump badgingreports the following on every release APK:The full human release name from Git is
v1.0.9-2-g3094fc8c; upstream removes the leadingvin the APK versionName. No project release marker was created or pushed during this task.Native codec proof
Dependency insight on
defaultReleaseRuntimeClasspathresolveswholphin-mpv,decoder-ffmpeg, anddecoder-av1to 0.2.4, exactly as the unchanged upstream catalog specifies. No stub project participates in the release assembly.APK ZIP inspection and ELF-header checks confirm real shared objects with the correct CPU architecture in each split and in the universal APK. Uncompressed sizes:
libdav1dJNI.sois also a real ELF shared object for all three ABIs.Additional checks and limits
make apk-debugpassed without secrets and generated all four default debug APKs; those deliberately use upstream's stub and are not playback-complete.make testpassed: 382 tests, zero failures, zero skips. Test runtime 1m12.73s; Gradle 2m44s. Upstream exposes notestDefaultReleaseUnitTest; the target uses the closest existingtestDefaultDebugUnitTestwithout changing test configuration.apksigneremits upstream META-INF v1 metadata warnings; v2/v3 verification succeeds. APK byte reproducibility is not claimed because upstream embeds a build timestamp./tmpscratch remains. Full logs and ELF proof are under/root/fm-home/data/wolfskin-4-build/.AI-assisted implementation and validation.
Security and code review: pass (reviewed SHA
3094fc8cf09e8dfa1f9d48e1524a92410bec4fe9)Security: pass. Code: pass. No blocking findings.
Evidence from a fresh clean
make apkon this head (BUILD SUCCESSFUL in 5m09s, signer SHA-2565cd708ff…c1fcb5a0on all four APKs, versionCode 53 / versionName1.0.9-2-g3094fc8c, reallibmpv/libffmpegJNI/libdav1dJNIin the splits):ghp_prefix. Zero matches in the build log, the whole worktree includingapp/buildand the APKs, thewolfskin-gradlevolume, the committed tree, anddocker saveof the build image.docker historyand the image env are clean.psargv and not in the container.Config.Envor.Args. The escrow,local.propertiesand the Git common dir are mountedrw=false.make apkwith a missing escrow fails beforedocker run.make apk-debugsucceeds withWOLFSKIN_SECRETS_DIRpointed at a nonexistent path.release-tag.shonly creates a new local tag (no-f, no push or remote path). A scratch-repo test confirmed it skips existing tags (_1,_2) and refuses a dirty tree.Makefileanddocker/*are added; no upstream source, catalog or workflow changes.Non-blocking notes:
local.propertiesmountpoint in the checkout after a release build (gitignored, no secret)./proc/<pid>/environ, which only the building user (root on tank) can read. This is upstream's hook.export X=$(cat …)masks acatfailure (docker/gradle.sh:28). The host-side-scheck covers this.Pkg.Revisionis absent (docker/Dockerfile:15-17).git/unzip. Upstream's wrapper has nodistributionSha256Sum. Both are inherited or minor.3094fc8cf0to19adf54c23