From 38bb29b20b97ed3cf8fd6511df16553fed1d58bb Mon Sep 17 00:00:00 2001 From: Diego Perez <52579214+doprz@users.noreply.github.com> Date: Tue, 6 Jan 2026 12:39:34 -0600 Subject: [PATCH] feat(nix): build UTRP (#714) * feat(nix): build UTRP * feat(nix): set fixed rev and sha256 + update lock file * chore(nix): remove systems input * chore: format * chore(nix): add meta attribute * feat(nix): add doprz as a maintainer --- .gitignore | 7 ++++++- default.nix | 10 ++++++++++ flake.lock | 31 ----------------------------- flake.nix | 8 ++++---- nix/package.nix | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ nix/packages.nix | 40 +++++++++++++++++++++++++++++++++++++ shell.nix | 10 ++++------ vite.config.ts | 31 +++++++++++++++++++++++++++-- 8 files changed, 144 insertions(+), 44 deletions(-) create mode 100644 default.nix create mode 100644 nix/package.nix create mode 100644 nix/packages.nix diff --git a/.gitignore b/.gitignore index 770da4e8..8a86a447 100644 --- a/.gitignore +++ b/.gitignore @@ -212,4 +212,9 @@ package-lock.json storybook-static/ package/ -.direnv/ +# Nix +result +result-* + +# direnv +.direnv diff --git a/default.nix b/default.nix new file mode 100644 index 00000000..b1565619 --- /dev/null +++ b/default.nix @@ -0,0 +1,10 @@ +(import ( + let + rev = "v1.1.0"; + sha256 = "sha256:19d2z6xsvpxm184m41qrpi1bplilwipgnzv9jy17fgw421785q1m"; + in + fetchTarball { + inherit sha256; + url = "https://github.com/NixOS/flake-compat/archive/${rev}.tar.gz"; + } +) { src = ./.; }).defaultNix diff --git a/flake.lock b/flake.lock index 70ea5763..03c0c5d7 100644 --- a/flake.lock +++ b/flake.lock @@ -1,19 +1,5 @@ { "nodes": { - "flake-compat": { - "locked": { - "lastModified": 1733328505, - "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", - "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", - "revCount": 69, - "type": "tarball", - "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" - } - }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -81,28 +67,11 @@ }, "root": { "inputs": { - "flake-compat": "flake-compat", "flake-parts": "flake-parts", "nixpkgs": "nixpkgs", - "systems": "systems", "treefmt-nix": "treefmt-nix" } }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, "treefmt-nix": { "inputs": { "nixpkgs": "nixpkgs_2" diff --git a/flake.nix b/flake.nix index 3eaf517b..3b8a6360 100644 --- a/flake.nix +++ b/flake.nix @@ -1,17 +1,17 @@ { inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - systems.url = "github:nix-systems/default"; flake-parts.url = "github:hercules-ci/flake-parts"; - flake-compat.url = "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"; treefmt-nix.url = "github:numtide/treefmt-nix"; }; outputs = - inputs@{ flake-parts, systems, ... }: + inputs@{ flake-parts, ... }: flake-parts.lib.mkFlake { inherit inputs; } { - systems = import systems; + systems = inputs.nixpkgs.lib.systems.flakeExposed; + imports = [ + ./nix/packages.nix ./nix/devShells.nix ./nix/treefmt.nix ]; diff --git a/nix/package.nix b/nix/package.nix new file mode 100644 index 00000000..9e896d46 --- /dev/null +++ b/nix/package.nix @@ -0,0 +1,51 @@ +{ + stdenv, + lib, + nodejs, + pnpm_10, + git, + version ? "dev", + gitRev ? "unknown", + gitBranch ? "unknown", + buildScript ? "build", +}: + +stdenv.mkDerivation (finalAttrs: { + inherit version; + pname = "ut-registration-plus"; + + src = ../.; + + nativeBuildInputs = [ + nodejs + pnpm_10.configHook + git + ]; + + pnpmDeps = pnpm_10.fetchDeps { + inherit (finalAttrs) pname version src; + fetcherVersion = 2; + hash = "sha256-UqHymJWvlTV4glra/6DkxuCxbG5dpPkFcnvq3vuxsJ8="; + }; + + # Pass git info to the build + VITE_GIT_COMMIT = gitRev; + VITE_GIT_BRANCH = gitBranch; + + buildPhase = '' + pnpm run ${buildScript} + ''; + + installPhase = '' + mkdir -p $out + cp -r dist/* $out/ + ''; + + meta = { + description = "UT Registration Plus"; + homepage = "https://github.com/Longhorn-Developers/UT-Registration-Plus"; + license = lib.licenses.mit; + maintainers = lib.maintainers.doprz; + platforms = lib.platforms.unix; + }; +}) diff --git a/nix/packages.nix b/nix/packages.nix new file mode 100644 index 00000000..bc68bb65 --- /dev/null +++ b/nix/packages.nix @@ -0,0 +1,40 @@ +{ inputs, ... }: +{ + perSystem = + { pkgs, ... }: + let + packageJson = builtins.fromJSON (builtins.readFile ../package.json); + gitRev = inputs.self.shortRev or inputs.self.dirtyShortRev or "dev"; + gitBranch = if inputs.self ? ref then inputs.self.ref else "unknown"; + baseVersion = packageJson.version; + + commonArgs = { + inherit gitRev gitBranch; + }; + + # Prod variant + ut-registration-plus = pkgs.callPackage ./package.nix ( + commonArgs + // { + version = "${baseVersion}+git.${gitRev}"; + buildScript = "build"; + } + ); + + # Dev variant + ut-registration-plus-dev = pkgs.callPackage ./package.nix ( + commonArgs + // { + version = "${baseVersion}-dev+git.${gitRev}"; + buildScript = "build:dev"; + } + ); + in + { + packages = { + inherit ut-registration-plus ut-registration-plus-dev; + default = ut-registration-plus; + dev = ut-registration-plus-dev; + }; + }; +} diff --git a/shell.nix b/shell.nix index 459e1526..5dab565e 100644 --- a/shell.nix +++ b/shell.nix @@ -1,12 +1,10 @@ (import ( let - lock = builtins.fromJSON (builtins.readFile ./flake.lock); - nodeName = lock.nodes.root.inputs.flake-compat; + rev = "v1.1.0"; + sha256 = "sha256:19d2z6xsvpxm184m41qrpi1bplilwipgnzv9jy17fgw421785q1m"; in fetchTarball { - url = - lock.nodes.${nodeName}.locked.url - or "https://github.com/edolstra/flake-compat/archive/${lock.nodes.${nodeName}.locked.rev}.tar.gz"; - sha256 = lock.nodes.${nodeName}.locked.narHash; + inherit sha256; + url = "https://github.com/NixOS/flake-compat/archive/${rev}.tar.gz"; } ) { src = ./.; }).shellNix diff --git a/vite.config.ts b/vite.config.ts index 77e83991..673fca2c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -88,6 +88,31 @@ const fixManifestOptionsPage = (): Plugin => ({ }, }); +function getGitInfo() { + // Try environment variables first (for Nix builds) + if (process.env.VITE_GIT_BRANCH && process.env.VITE_GIT_COMMIT) { + return { + gitBranch: process.env.VITE_GIT_BRANCH, + gitCommit: process.env.VITE_GIT_COMMIT, + }; + } + + // Fall back to git commands (for local development) + try { + return { + gitBranch: execSync('git rev-parse --abbrev-ref HEAD').toString().trim(), + gitCommit: execSync('git rev-parse --short HEAD').toString().trim(), + }; + } catch { + return { + gitBranch: 'unknown', + gitCommit: 'unknown', + }; + } +} + +const gitInfo = getGitInfo(); + let config: ResolvedConfig; let server: ViteDevServer; @@ -180,12 +205,14 @@ export default defineConfig({ 'PROD', 'VITE_SENTRY_ENVIRONMENT', 'VITE_BETA_BUILD', + 'VITE_GIT_BRANCH', + 'VITE_GIT_COMMIT', ], includeTimestamp: true, includeBuildTime: true, customMetadata: { - gitBranch: () => execSync('git rev-parse --abbrev-ref HEAD').toString().trim(), - gitCommit: () => execSync('git rev-parse --short HEAD').toString().trim(), + gitBranch: () => gitInfo.gitBranch, + gitCommit: () => gitInfo.gitCommit, nodeVersion: () => process.version, }, }),