build: guard local gradle runs against exhausting the box

The devshell `gradle` now serialises local builds with flock and runs
them under `nice` with capped workers, so several agents building at
once queue instead of piling up daemons and compile workers and taking
the machine down. With CI/GITHUB_ACTIONS set it execs Gradle directly,
leaving CI untouched. Also shorten the Gradle daemon idle timeout so
idle daemons are reaped sooner.
This commit is contained in:
austinried
2026-10-09 07:42:05 +00:00
parent 5f138bde6a
commit 336fd9c49f
3 changed files with 11 additions and 1 deletions
+1
View File
@@ -14,6 +14,7 @@ Everything comes from the Nix flake devshell; do not install toolchains by hand.
- The default devshell provides JDK 21, Gradle 9, the Android SDK (platform 37, build-tools 37.0.0, platform-tools 37.0.1) and nushell.
- The integration harness needs real servers, so it lives in a separate `nix develop .#integration` shell (navidrome, gonic, lms, php, Nextcloud with the Music app, sqlite). Keeping them out of the default shell avoids pulling that closure into everyday builds.
- Build with the devshell `gradle`, not `./gradlew`. CI uses the nix Gradle pinned by `flake.lock`; the wrapper is kept only for people without Nix.
- The devshell `gradle` is a wrapper: outside CI it takes a lock (`flock /tmp/subtracks-gradle.lock`) and runs under `nice` with capped workers, so several agents building at once queue instead of exhausting the box. With `CI`/`GITHUB_ACTIONS` set (i.e. CI) it execs Gradle directly, unchanged.
## Commands
+9 -1
View File
@@ -40,9 +40,17 @@
};
androidSdk = android.androidsdk;
gradle_wrapper = pkgs.writeShellScriptBin "gradle" ''
if [ -n "''${CI:-}''${GITHUB_ACTIONS:-}" ]; then
exec ${pkgs.gradle_9}/bin/gradle "$@"
fi
exec ${pkgs.util-linux}/bin/flock /tmp/subtracks-gradle.lock \
${pkgs.coreutils}/bin/nice -n 10 ${pkgs.gradle_9}/bin/gradle --max-workers=4 "$@"
'';
basePackages = [
pkgs.jdk21
pkgs.gradle_9
gradle_wrapper
pkgs.git
pkgs.curl
pkgs.unzip
+1
View File
@@ -3,6 +3,7 @@ org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configuration-cache=true
org.gradle.configuration-cache.problems=warn
org.gradle.daemon.idletimeout=600000
android.useAndroidX=true
android.nonTransitiveRClass=true