From 038cb51ba468e0ea40d44f9bbe83c6cf843ecbed Mon Sep 17 00:00:00 2001 From: Arnie Date: Fri, 12 Jun 2026 20:44:28 +0200 Subject: [PATCH] Update build process --- .gitea/workflows/build.yaml | 2 ++ CLAUDE.md | 14 ++++---- flake.nix | 71 ++++++++++++++++++++++++++++--------- 3 files changed, 65 insertions(+), 22 deletions(-) diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index df33911..233f3a6 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -15,6 +15,8 @@ jobs: - uses: actions/checkout@v5 with: fetch-depth: 0 + - name: Check runner arch + run: uname -m - name: Unit tests run: nix develop --command gradle --no-daemon :app:test - name: Build release APKs diff --git a/CLAUDE.md b/CLAUDE.md index 676b760..6ce3bed 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,8 +13,8 @@ Build toolchain: AGP 9.2.1, Gradle 9 (nixpkgs 26.05), build-tools 36, compileSdk This is a lab project (`lab` skill conventions apply) EXCEPT: - No container image, no helm chart, no /livez//readyz — artifact is an APK. -- No `nix build`: gradle needs network for Maven deps. The flake is a dev - shell only. All builds run as `nix develop --command gradle ...`. +- No `nix build`: gradle needs network for Maven deps. Builds run via devshell + or `nix run` (see Commands below). - Agents cannot run nix/gradle/adb here — ask the user to run commands and report output. @@ -29,11 +29,13 @@ post-25.11). No file rewriting; `gradle.properties` stays untouched. ## Commands (user-run, from repo root, direnv activates devshell) -- Tests: `gradle --no-daemon :app:test` -- All APKs: `gradle --no-daemon :app:assembleRelease` +- Tests: `gradle --no-daemon :app:test` +- All APKs: `gradle --no-daemon :app:assembleRelease` → `app/build/outputs/apk//release/-release.apk` -- Single APK: `gradle --no-daemon :app:assembleWeatherRelease` -- Deploy all: `tv-deploy` — connects, installs all flavor APKs, disconnects +- Single APK: `gradle --no-daemon :app:assembleWeatherRelease` +- Build + deploy: `nix run` or `tv-deploy` (after manual build) +- Build only: `nix run .#build` +- Deploy only: `nix run .#deploy` or `tv-deploy` (in devshell) (bump `versionCode` in app/build.gradle.kts first for upgrades) - Fresh install: `adb connect $TV_IP:5555 && adb uninstall cz.c3c.webviewkiosk. && adb install app/build/outputs/apk//release/-release.apk` diff --git a/flake.nix b/flake.nix index a05e810..42bb79b 100644 --- a/flake.nix +++ b/flake.nix @@ -2,10 +2,11 @@ # android-webview-kiosk — Android TV fullscreen WebView kiosk showing a # hardcoded Grafana dashboard, remote-launched via Sony Bravia IP control. # - # Deviation from lab Go template: this flake provides a DEV SHELL ONLY. - # Gradle fetches Maven deps from the network, so the APK is built impurely: - # nix develop --command gradle :app:assembleRelease - # There is no `nix build` output and no container/push pipeline. + # Deviation from lab Go template: APK is built impurely (Gradle fetches Maven + # deps from the network). No `nix build` output; use nix run instead: + # nix run — build all APKs then deploy to TV + # nix run .#build — build only + # nix run .#deploy — deploy already-built APKs to TV description = "Android TV fullscreen WebView kiosk for the Grafana house dashboard"; inputs = { @@ -19,7 +20,7 @@ nixpkgs, flake-utils, }: - flake-utils.lib.eachDefaultSystem ( + flake-utils.lib.eachSystem [ "x86_64-linux" ] ( system: let pkgs = import nixpkgs { @@ -44,16 +45,62 @@ fonts = with pkgs; [ noto-fonts dejavu_fonts freefont_ttf ]; - tvDeploy = pkgs.writeShellScriptBin "tv-deploy" '' - set -euo pipefail + gradleEnv = { + ANDROID_HOME = sdkRoot; + ANDROID_SDK_ROOT = sdkRoot; + JAVA_HOME = "${pkgs.jdk21}"; + GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${sdkRoot}/build-tools/${buildToolsVersion}/aapt2"; + FONTCONFIG_FILE = pkgs.makeFontsConf { fontDirectories = fonts; }; + }; + + deployScript = '' trap 'adb disconnect "$TV_IP:5555"' EXIT adb connect "$TV_IP:5555" for apk in app/build/outputs/apk/*/release/*.apk; do adb install -r "$apk" done ''; + + exportGradleEnv = '' + export ANDROID_HOME="${sdkRoot}" + export ANDROID_SDK_ROOT="${sdkRoot}" + export JAVA_HOME="${pkgs.jdk21}" + export GRADLE_OPTS="${gradleEnv.GRADLE_OPTS}" + export FONTCONFIG_FILE="${gradleEnv.FONTCONFIG_FILE}" + ''; + + tvDeploy = pkgs.writeShellApplication { + name = "tv-deploy"; + runtimeInputs = [ pkgs.android-tools ]; + text = deployScript; + }; + + buildApp = pkgs.writeShellApplication { + name = "build"; + runtimeInputs = [ androidSdk pkgs.jdk21 pkgs.gradle_9 ]; + text = '' + ${exportGradleEnv} + gradle --no-daemon :app:assembleRelease + ''; + }; + + buildAndDeploy = pkgs.writeShellApplication { + name = "build-and-deploy"; + runtimeInputs = [ androidSdk pkgs.jdk21 pkgs.gradle_9 pkgs.android-tools ]; + text = '' + ${exportGradleEnv} + gradle --no-daemon :app:assembleRelease + ${deployScript} + ''; + }; in { + apps = { + default = { type = "app"; program = "${buildAndDeploy}/bin/build-and-deploy"; }; + build = { type = "app"; program = "${buildApp}/bin/build"; }; + deploy = { type = "app"; program = "${tvDeploy}/bin/tv-deploy"; }; + }; + devShells.default = pkgs.mkShell { packages = [ androidSdk @@ -64,15 +111,7 @@ tvDeploy ] ++ fonts; - ANDROID_HOME = sdkRoot; - ANDROID_SDK_ROOT = sdkRoot; - JAVA_HOME = "${pkgs.jdk21}"; - # NixOS gotcha: AGP downloads a dynamically-linked aapt2 from Maven - # that can't run on NixOS. Set android.aapt2FromMavenOverride via - # GRADLE_OPTS so AGP uses the SDK's aapt2 instead. Works since - # nixpkgs PR #449037 (merged post-25.11, present in 26.05+). - GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${sdkRoot}/build-tools/${buildToolsVersion}/aapt2"; - FONTCONFIG_FILE = pkgs.makeFontsConf { fontDirectories = fonts; }; + inherit (gradleEnv) ANDROID_HOME ANDROID_SDK_ROOT JAVA_HOME GRADLE_OPTS FONTCONFIG_FILE; }; }