From cb479820268180c8b293f5279af5158ba6aad3bf Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Mon, 26 Jan 2026 15:54:15 +0100 Subject: [PATCH] Add Nix configuration files and script for Flutter version management --- .envrc | 4 ++ .github/workflows/android.yaml | 64 +++++-------------- .gitignore | 2 + flake.lock | 78 +++++++++++++++++++++++ flake.nix | 109 +++++++++++++++++++++++++++++++++ update-flutter-nix.sh | 54 ++++++++++++++++ 6 files changed, 263 insertions(+), 48 deletions(-) create mode 100644 .envrc create mode 100644 flake.lock create mode 100644 flake.nix create mode 100755 update-flutter-nix.sh diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..f9abeb0 --- /dev/null +++ b/.envrc @@ -0,0 +1,4 @@ +# When nix is available, use the flake for environment management +if command -v nix &> /dev/null; then + use flake +fi \ No newline at end of file diff --git a/.github/workflows/android.yaml b/.github/workflows/android.yaml index 3147927..561417c 100644 --- a/.github/workflows/android.yaml +++ b/.github/workflows/android.yaml @@ -3,57 +3,25 @@ name: Android on: - pull_request: - branches: - - master push: - branches: - - master - + pull_request: + jobs: - build: - runs-on: macos-latest - + runs-on: ubuntu-latest + container: + image: docker.io/nixos/nix:latest + steps: - - name: Checkout code - uses: actions/checkout@v3 + - name: Checkout code + uses: actions/checkout@v3 - - name: Setup Java - uses: actions/setup-java@v3 - with: - distribution: 'temurin' - java-version: '17' + - name: Collect Translation Files + run: | + cd lib/l10n + nix --extra-experimental-features 'nix-command flakes' develop --command python3 collect_translations.py + cd ../.. - - name: Setup FVM - id: fvm-config-action - uses: kuhnroyal/flutter-fvm-config-action@v2 - - - uses: subosito/flutter-action@v2 - with: - flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }} - channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }} - cache: false - cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" - cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" - pub-cache-key: "flutter-pub:os:-:channel:-:version:-:arch:-:hash:" - pub-cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" - - - run: flutter --version - - - name: Setup Gradle - uses: gradle/gradle-build-action@v2.4.2 - with: - gradle-version: 8.7 - - - name: Collect Translation Files - run: | - cd lib/l10n - python3 collect_translations.py - - - name: Build for Android - run: | - dart pub global activate fvm - fvm install - fvm flutter pub get - fvm flutter build apk --debug + - name: Build Debug APK + run: | + nix --extra-experimental-features 'nix-command flakes' develop --command flutter build apk --debug diff --git a/.gitignore b/.gitignore index 8effbf9..88fb8f9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,10 @@ .DS_Store .atom/ .buildlog/ +.direnv .history .svn/ +flake.nix.bak coverage/* diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..e8752c2 --- /dev/null +++ b/flake.lock @@ -0,0 +1,78 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1769170682, + "narHash": "sha256-oMmN1lVQU0F0W2k6OI3bgdzp2YOHWYUAw79qzDSjenU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c5296fdd05cfa2c187990dd909864da9658df755", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-flutter": { + "locked": { + "lastModified": 1751285371, + "narHash": "sha256-/hDU+2AUeFFu5qGHO/UyFMc4UG/x5Cw5uXO36KGTk6c=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b9c03fbbaf84d85bb28eee530c7e9edc4021ca1b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b9c03fbbaf84d85bb28eee530c7e9edc4021ca1b", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "nixpkgs-flutter": "nixpkgs-flutter" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..e921027 --- /dev/null +++ b/flake.nix @@ -0,0 +1,109 @@ +{ + description = "InvenTree App Development Environment"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + nixpkgs-flutter.url = "github:NixOS/nixpkgs/b9c03fbbaf84d85bb28eee530c7e9edc4021ca1b"; + }; + + outputs = + { + self, + nixpkgs, + flake-utils, + nixpkgs-flutter, + }: + flake-utils.lib.eachDefaultSystem ( + system: + let + pkgs = import nixpkgs { + inherit system; + config = { + allowUnfree = true; + android_sdk.accept_license = true; + }; + overlays = [ + (final: prev: { + flutter-pkg = import (self.inputs.nixpkgs-flutter) { inherit system; }; + }) + ]; + }; + + androidSdk = + (pkgs.androidenv.composeAndroidPackages { + platformVersions = [ + "35" + "34" + ]; + buildToolsVersions = [ + "35.0.0" + "34.0.0" + ]; + includeNDK = true; + ndkVersions = [ "26.1.10909125" ]; + cmakeVersions = [ "3.22.1" ]; + }).androidsdk; + + linuxOptionals = with pkgs; [ + gtk3 + glib + pcre + libepoxy + libxkbcommon + dbus + at-spi2-core + file + ]; + + fvmScript = '' + case "$1" in + use) + echo "✓ Using Flutter from Nix ($(flutter --version | head -n1))" + exit 0 + ;; + flutter) + shift + exec flutter "$@" + ;; + *) + echo "fvm wrapper: command '$1' not implemented (using Nix-managed Flutter)" >&2 + exit 1 + ;; + esac + ''; + fvm-wrapper = pkgs.writeShellScriptBin "fvm" fvmScript; + in + { + devShells.default = pkgs.mkShell { + buildInputs = + with pkgs; + [ + flutter-pkg.flutter + fvm-wrapper + jdk17 + android-tools + gradle + python3 + python3Packages.invoke + jq + git + curl + unzip + which + ] + ++ lib.optionals stdenv.isLinux linuxOptionals; + + shellHook = '' + export ANDROID_HOME="${androidSdk}/libexec/android-sdk" + export ANDROID_SDK_ROOT="$ANDROID_HOME" + export PATH="$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools/bin:$PATH" + export JAVA_HOME="${pkgs.jdk17}" + export GRADLE_OPTS="-Dorg.gradle.project.android.aapt2FromMavenOverride=$ANDROID_HOME/build-tools/35.0.0/aapt2" + ''; + + LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath (with pkgs; linuxOptionals); + }; + } + ); +} diff --git a/update-flutter-nix.sh b/update-flutter-nix.sh new file mode 100755 index 0000000..53e97be --- /dev/null +++ b/update-flutter-nix.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +# This script adjusts flake.nix to use the flutter version +# pinned in .fvmrc. It fetches the appropriate commit hash. + +set -e + +for cmd in jq curl sed nix; do + command -v $cmd >/dev/null 2>&1 || { echo "Error: $cmd is not installed!"; exit 1; } +done + +if [ ! -f .fvmrc ]; then + echo ".fvmrc file not found!" + exit 1 +fi + +FLUTTER_VERSION=$(jq -r .flutter .fvmrc) +echo "Requested Flutter version: $FLUTTER_VERSION" + +API_URL="https://search.devbox.sh/v2/pkg?name=flutter" +RELEASES_JSON=$(curl -s "$API_URL") + +ALL_VERSIONS=$(echo "$RELEASES_JSON" | jq -r '.releases[].version' | sort -V) + +FOUND_VERSION=$(echo "$ALL_VERSIONS" | awk -v v="$FLUTTER_VERSION" '$0 >= v { print; exit }') + +if [ -z "$FOUND_VERSION" ]; then + echo "Error: No matching Flutter version found." + exit 1 +fi + +if [ "$FOUND_VERSION" != "$FLUTTER_VERSION" ]; then + echo "Note: Exact version not found, using version $FOUND_VERSION instead." +fi + +COMMIT=$(echo "$RELEASES_JSON" | jq -r --arg v "$FOUND_VERSION" '.releases[] | select(.version==$v) | .platforms[] | select(.system=="x86_64-linux") | .commit_hash' | head -n 1) + +if [ -z "$COMMIT" ] || [ "$COMMIT" == "null" ]; then + echo "Error: No commit hash found for version $FOUND_VERSION and platform x86_64-linux." + exit 1 +fi + +echo "Found commit: $COMMIT (Version: $FOUND_VERSION)" + + +sed -i.bak "s|nixpkgs-flutter.url = \"github:NixOS/nixpkgs/[a-f0-9]*\";|nixpkgs-flutter.url = \"github:NixOS/nixpkgs/$COMMIT\";|" flake.nix + +nix flake update nixpkgs-flutter + +if command -v direnv >/dev/null 2>&1; then + direnv reload +fi + +echo "Success! flake.nix now uses the commit for Flutter $FLUTTER_VERSION (or higher)."