Commit Graph
434 Commits
Author SHA1 Message Date
Thomas SharedInboxandClaude Sonnet 4.6 f60beaa199 fix: XmlNode.element is at proto field 1, not 2 — versionCode patch was silently skipping all elements
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 17:49:10 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 d9cde7cacf debug: dump manifest proto structure when versionCode not found
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 17:23:44 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 bb163542bb fix: add versionCode read-back verification and handle fixed-width wire types
- _parse now handles wire types 1 (fixed64) and 5 (fixed32) so it doesn't
  crash on unknown fields in the manifest proto
- _patch_prim patches both int_decimal_value (field 6) and int_hexadecimal_value
  (field 7) — AAPT2 may use either
- patch() reads versionCode before and after patching and exits with a clear
  error if the patch didn't take effect

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 17:11:20 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 8319002e0c fix: use publish-android task for Play Store deploy (stamps + signs + uploads)
The old workflow built with build-android-bundle (debug-signed) then uploaded
separately. publish-android stamps the versionCode, re-signs with the release
keystore, and uploads in one Dagger call.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 16:42:23 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 02e8c2200a fix: fail fast with clear error when keystore secrets are empty
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 14:17:41 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 8518715bcf ci: retrigger to verify Dagger cache hits
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 13:54:23 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 2d559d4947 feat: cache Android AAB build; stamp versionCode + resign after cache hit
BuildAndroidRelease() drops all params and builds with --build-number 1
(no keystore injected, Gradle uses debug signing). The command is now
stable across all commits — full Dagger cache hit whenever source is
unchanged.

Three new Dagger functions handle the post-cache steps:
- StampAndroidVersionCode(aab, versionCode): pure-stdlib Python patches
  the AAB's compiled manifest proto (android:versionCode resource ID
  0x0101021b) and strips META-INF/ to clear the old signature.
- SignAndroidBundle(aab, keystoreBase64, keystorePassword): decodes the
  base64 keystore secret and re-signs with jarsigner.
- PublishAndroid(ctx, playStoreConfig, keystoreBase64, keystorePassword):
  chains all three + UploadToPlayStore, computing time.Now().Unix() as
  the versionCode internally.

Taskfile: build-android-bundle simplified (no keystore params); publish-
android now calls publish-android in a single Dagger call instead of the
two-step build-then-upload.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 13:35:20 +02:00
Thomas GüttlerandClaude Sonnet 4.6 f6bb6aed82 ci: empty commit to verify Dagger cache
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 11:34:21 +02:00
Thomas GüttlerandClaude Sonnet 4.6 007e7b57f1 fix: revert CacheSharingModeLocked to fix deadlock in Check()
Locked exclusive cache access caused concurrent Dagger operations inside
Check() to deadlock waiting on each other, resulting in a 60-minute timeout.
Shared mode is correct here — cache volumes are pre-warmed so pub get is fast.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 11:19:41 +02:00
Thomas GüttlerandClaude Sonnet 4.6 0ea06e8634 fix: use CacheSharingModeLocked instead of dagger.Locked
dagger.Locked is not exported in this SDK version; the correct
constant is dagger.CacheSharingModeLocked.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 10:16:02 +02:00
Thomas GüttlerandClaude Sonnet 4.6 592efae934 perf: lock cache volumes and add --no-pub to fix Dagger cache misses
flutter pub get was not being cached by Dagger because the pub-cache
CacheVolume used Shared mode: concurrent writes from the check and
deploy-playstore jobs made the mount non-deterministic, causing a cache
miss on every run. Locked mode gives each operation exclusive access so
the output snapshot is stable and Dagger can cache subsequent steps.

Also add --no-pub to both flutter build commands: pub get already ran
explicitly in Setup(), so skipping it again inside the build step avoids
a duplicate network-touching operation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 09:45:39 +02:00
Thomas GüttlerandClaude Sonnet 4.6 9466f03936 perf: use commit timestamp as build number to enable Dagger cache hits
$(date +%s) changed every run, making the flutter build WithExec args
unique each time and busting the Dagger layer cache (500s build every run).

$(git log -1 --format=%ct HEAD) is stable for the same commit, so a
retry of a failed upload gets a full cache hit on the build step.
Still monotonically increasing across commits, satisfying Play Store.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 09:20:05 +02:00
Thomas Güttler b79ea77f69 ci: empty commit to measure cache performance 2026-05-18 09:06:56 +02:00
Thomas GüttlerandClaude Sonnet 4.6 ef8268a41e fix: rename duplicate build-android-bundle task to build-android-bundle-local
The old fvm-based task had the same name as the new Dagger-based one,
causing go-task to error immediately (1-second CI failure).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 08:37:18 +02:00
Thomas GüttlerandClaude Sonnet 4.6 8783bcf5f0 fix: unique build number and split build/upload steps
- Pass --build-number $(date +%s) to flutter build for both APK and AAB
  so each CI run gets a unique version code (fixes "already been used" error)
- Extract UploadToPlayStore(aab, playStoreConfig) as its own Dagger function
  so the build and upload are independently callable
- Add build-android-bundle task (exports AAB via dagger export) and
  upload-android-bundle task (calls UploadToPlayStore with the local file)
- CI deploy-playstore job now has two steps: Build Android Bundle and
  Upload to Play Store, so a failed upload can be retried without rebuilding
- deploy-apk also gets --build-number to avoid version code collisions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 08:18:33 +02:00
Thomas GüttlerandClaude Sonnet 4.6 484a183a19 fix: pass release keystore into Dagger Android builds
Both BuildAndroidApk and BuildAndroidRelease were using the debug
signing config because the keystore and password were never forwarded
into the Dagger container. Add setupKeystore() helper that decodes
ANDROID_KEYSTORE_BASE64 into android/app/upload-keystore.jks and
sets ANDROID_KEYSTORE_PASSWORD, then wire both secrets through
DeployApk, PublishAndroid, and the Taskfile/CI env blocks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 07:49:45 +02:00
Thomas GüttlerandClaude Sonnet 4.6 3c403369fb ci: verify keystore SHA1 before Play Store build
Decodes ANDROID_KEYSTORE_BASE64 and prints the SHA1 fingerprint via
keytool before invoking the Dagger build, to confirm which key is in
the secret vs. what the build actually uses.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 07:20:25 +02:00
Thomas Güttler 24cafd1a93 ci: retrigger to capture Play Store error with debug logging 2026-05-18 06:25:12 +02:00
Thomas Güttler 2cc6188a43 fix: log HTTP status and response body on Play Store upload failure
Without the response body we can't tell why Google Play rejects the
upload. Logs the status code and first 500 bytes of the response for
both the init POST and the upload PUT on each failed attempt. Also
moves the init call inside the try/except so init failures are retried.
2026-05-18 05:49:55 +02:00
Thomas Güttler 83654fb4c9 fix: re-initialize resumable upload URL on each retry attempt
The resumable upload URL returned by Google Play is session-specific and
expires after a failed attempt. Retrying with the same URL always fails.
Also broadens the caught exception from HTTPError to RequestException so
timeouts and connection errors are retried too.
2026-05-18 05:06:42 +02:00
Thomas Güttler 0733a4bf8a ci: trigger run after runner security fix 2026-05-17 22:58:11 +02:00
Thomas Güttler 21cc94110d Revert "ci: switch to codeberg-small runner to avoid workspace permission failure"
This reverts commit 32b465bd1a.
2026-05-17 22:50:18 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 32b465bd1a ci: switch to codeberg-small runner to avoid workspace permission failure
The ubuntu-latest pool now includes nodes that run Docker containers with
user namespace isolation, causing chown of the workspace to fail before
checkout can run. The codeberg-small label routes consistently to the
actions-tiny nodes (act-latest image, no user namespace restriction) where
Dagger CI succeeded previously.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:36:26 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 91ec75c82f ci: restore Dagger & Task installation steps for Docker-based runner
The ubuntu-latest runner uses Docker containers (ghcr.io/catthehacker/ubuntu:act-22.04)
which don't have task or dagger pre-installed. These steps were mistakenly removed when
switching from the dagger-dagger host runner back to ubuntu-latest.

Also adds DAGGER_NO_NAG=1 to all dagger-invoking steps.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:23:49 +02:00
Thomas SharedInbox c712199d0b feat: decrease dagger output size with -q and DAGGER_NO_NAG=1 (#124)
Add -q (quiet) flag to all dagger call invocations to suppress INFO-level
engine messages while keeping warnings and errors visible. Set DAGGER_NO_NAG=1
globally to suppress the Dagger Cloud tracing nag line. --progress=plain
is retained on all calls as required.
2026-05-17 22:15:25 +02:00
Thomas GüttlerandClaude Sonnet 4.6 5562f82f35 ci: rename runner label from dagger-dagger to ubuntu-latest
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:11:57 +02:00
Gemini CLI 6863e309cd ci: use sharedinbox-runner for GitHub Actions 2026-05-17 22:02:02 +02:00
Gemini CLI 896886e130 ci: trigger run for dagger-dagger switch 2026-05-17 22:00:13 +02:00
Gemini CLI 9f636a992d ci: switch to dagger-dagger runner and remove manual setup steps 2026-05-17 21:53:44 +02:00
Gemini CLI b76b05307a ci: install Dagger and Task to local bin to avoid sudo issues 2026-05-17 21:52:11 +02:00
Gemini CLI 0a121979f8 ci: use sudo for Dagger and Task installation on self-hosted runner 2026-05-17 21:51:27 +02:00
Gemini CLI a617af70d5 ci: use ubuntu-latest runner for Forgejo workflows 2026-05-17 21:50:00 +02:00
Gemini CLI 9a0cb93970 ci: switch back to codeberg-small and rely on Dagger NDK caching 2026-05-17 19:43:09 +02:00
Gemini CLI cd0a807cb2 ci: switch to codeberg-medium runner and fix fetch-depth for website build 2026-05-17 19:41:51 +02:00
Gemini CLI f93198c0ca ci: optimize Android NDK installation and switch to ubuntu-latest runner 2026-05-17 19:39:46 +02:00
Gemini CLI 146baa50ea fix: include website directory in Dagger source filter 2026-05-17 18:18:16 +02:00
Gemini CLI 06d1be05ee fix: increase CI timeouts and add missing mock checks in Dagger 2026-05-17 18:04:25 +02:00
Gemini CLI 22dcd4c293 fix: CI task installation path 2026-05-17 17:16:43 +02:00
Gemini CLI b8acf37c24 fix: CI Dagger syntax, missing deps, and Stalwart startup 2026-05-17 17:14:35 +02:00
Gemini CLI 52473d216d ci: centralize Dagger calls in Taskfile and enforce standards via pre-commit 2026-05-17 16:43:52 +02:00
Gemini CLI 1266fd6338 gitignore 2026-05-17 16:34:28 +02:00
Gemini CLI 8cbe8c01bb ci: use idiomatic Dagger service bindings for Stalwart
Refactor the CI pipeline to use WithServiceBinding for the Stalwart mail
server, replacing legacy shell scripts and manual port management.
Introduces pre-seeded data for the Stalwart service to avoid network
hits and improves headless UI testing with Xvfb.
2026-05-17 16:01:42 +02:00
GuettliBot2 e6fc65a345 fix(ci): run backend tests sequentially to prevent contention 2026-05-17 14:41:00 +02:00
GuettliBot2 982618c9fe fix(ci): pin Stalwart to v0.14.1 and fix local start script 2026-05-17 14:24:06 +02:00
GuettliBot2 a22a4d1015 ci: remove Nix dependency from workflows and refactor Dagger module for native source fetching 2026-05-17 13:20:26 +02:00
GuettliBot2 92778346d3 ci: remove Nix dependency and modernize Stalwart test setup with Dagger Services 2026-05-17 13:17:28 +02:00
GuettliBot2 34d28d8a56 ci: use codeberg-small runner labels instead of ubuntu-latest 2026-05-17 12:19:35 +02:00
GuettliBot2 ef28d25f77 ci: enforce strict Dagger probing using URL1/URL2 and migrate website.yml to Dagger 2026-05-17 11:52:38 +02:00
GuettliBot2 b2d4695112 ci: add remote Dagger server setup with port probing 2026-05-17 11:50:39 +02:00
GuettliBot2 73c1a09d47 ci: minor cleanup of self-hosted runner references 2026-05-17 11:38:27 +02:00