headlamp, headlamp-server, headlamp-frontend: init at 0.41.0 (#504779)

This commit is contained in:
Sefa Eyeoglu
2026-05-04 18:34:06 +00:00
committed by GitHub
3 changed files with 220 additions and 0 deletions
@@ -0,0 +1,53 @@
{
buildNpmPackage,
headlamp-server,
}:
buildNpmPackage {
pname = "headlamp-frontend";
inherit (headlamp-server) version src;
strictDeps = true;
__structuredAttrs = true;
sourceRoot = "${headlamp-server.src.name}/frontend";
npmDepsHash = "sha256-cjar6j5Wzh5monp9YxrsrnGDxgjlT+YRFh5mgZcImKI=";
postPatch = ''
chmod -R u+w ../app
cp ${headlamp-server.src}/app/package.json ../app/package.json
substituteInPlace package.json --replace-fail '"prebuild": "npm run make-version",' ""
'';
preBuild = ''
cat > .env <<EOF
REACT_APP_HEADLAMP_VERSION=${headlamp-server.version}
REACT_APP_HEADLAMP_GIT_VERSION=v${headlamp-server.version}
REACT_APP_HEADLAMP_PRODUCT_NAME=Headlamp
REACT_APP_ENABLE_REACT_QUERY_DEVTOOLS=false
REACT_APP_HEADLAMP_SIDEBAR_DEFAULT_OPEN=true
EOF
'';
env = {
PUBLIC_URL = "./";
NODE_OPTIONS = "--max-old-space-size=8096";
};
installPhase = ''
runHook preInstall
cp -r build $out
runHook postInstall
'';
meta = {
inherit (headlamp-server.meta)
description
homepage
changelog
license
maintainers
;
};
}
@@ -0,0 +1,49 @@
{
lib,
buildGoModule,
fetchFromGitHub,
}:
buildGoModule rec {
pname = "headlamp-server";
version = "0.41.0";
strictDeps = true;
__structuredAttrs = true;
src = fetchFromGitHub {
owner = "kubernetes-sigs";
repo = "headlamp";
tag = "v${version}";
hash = "sha256-ZXyE4oPkwimnU2ArOiTCnLxzaI5z/7T/SHS9aqP2DGM=";
};
modRoot = "backend";
vendorHash = "sha256-JjfB93C97yTbUTUbs7wEB/iFtuRzHzFXGyRHDAec7X8=";
# Don't embed frontend - Electron serves it directly. This also prevents
# the server from auto-opening a browser window.
ldflags = [
"-s"
"-w"
"-X github.com/kubernetes-sigs/headlamp/backend/pkg/kubeconfig.Version=${version}"
"-X github.com/kubernetes-sigs/headlamp/backend/pkg/kubeconfig.AppName=Headlamp"
];
subPackages = [ "cmd" ];
postInstall = ''
mv $out/bin/cmd $out/bin/headlamp-server
'';
meta = {
description = "An easy-to-use and extensible Kubernetes web UI";
homepage = "https://headlamp.dev";
changelog = "https://github.com/kubernetes-sigs/headlamp/releases/tag/v${version}";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ dylanmtaylor ];
mainProgram = "headlamp-server";
};
}
+118
View File
@@ -0,0 +1,118 @@
{
buildNpmPackage,
headlamp-server,
headlamp-frontend,
electron,
makeWrapper,
makeDesktopItem,
copyDesktopItems,
}:
buildNpmPackage {
pname = "headlamp";
inherit (headlamp-server) version src;
strictDeps = true;
__structuredAttrs = true;
sourceRoot = "${headlamp-server.src.name}/app";
npmDepsHash = "sha256-FcV2ORs96Rj/OyCbBCBo/ZmcwvjDLPKkn0i4m+0gXIE=";
env.ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
postPatch = ''
chmod u+w ..
'';
npmBuildScript = "compile-electron";
nativeBuildInputs = [
makeWrapper
copyDesktopItems
];
desktopItems = [
(makeDesktopItem {
name = "headlamp";
desktopName = "Headlamp";
comment = "An easy-to-use and extensible Kubernetes web UI";
exec = "headlamp";
icon = "headlamp";
categories = [
"Network"
"System"
];
startupWMClass = "Headlamp";
})
];
installPhase = ''
runHook preInstall
# Electron app
install -Dt $out/lib/headlamp/app package.json
install -Dt $out/lib/headlamp/app/build build/main.js build/preload.js
# Production dependencies only
npm prune --omit=dev
rm -rf node_modules/.bin
cp -r node_modules $out/lib/headlamp/app/
# Resources directory (where process.resourcesPath should point)
mkdir -p $out/lib/headlamp/resources
cp -r ${headlamp-frontend} $out/lib/headlamp/resources/frontend
chmod -R u+w $out/lib/headlamp/resources/frontend
ln -s ${headlamp-server}/bin/headlamp-server $out/lib/headlamp/resources/headlamp-server
mkdir -p $out/lib/headlamp/resources/.plugins
cp ${headlamp-server.src}/app/app-build-manifest.json $out/lib/headlamp/resources/
# i18n locales
mkdir -p $out/lib/headlamp/resources/frontend/i18n
cp -r ${headlamp-server.src}/frontend/src/i18n/locales $out/lib/headlamp/resources/frontend/i18n/locales
# Entry point that sets process.resourcesPath before loading the real main
cat > $out/lib/headlamp/app/main.js <<ENTRY
const path = require('path');
const { app } = require('electron');
const resourcesPath = path.resolve(__dirname, '..', 'resources');
Object.defineProperty(process, 'resourcesPath', {
get: () => resourcesPath,
configurable: false,
});
app.setVersion('${headlamp-server.version}');
app.setName('Headlamp');
require('./build/main.js');
ENTRY
# Point package.json main at our wrapper
substituteInPlace $out/lib/headlamp/app/package.json \
--replace-fail '"main": "build/main.js"' '"main": "main.js"'
# Icons
for size in 16 32; do
mkdir -p $out/share/icons/hicolor/''${size}x''${size}/apps
cp ${headlamp-server.src}/frontend/public/favicon-''${size}x''${size}.png $out/share/icons/hicolor/''${size}x''${size}/apps/headlamp.png
done
mkdir -p $out/share/icons/hicolor/192x192/apps
cp ${headlamp-server.src}/frontend/public/android-chrome-192x192.png $out/share/icons/hicolor/192x192/apps/headlamp.png
mkdir -p $out/share/icons/hicolor/512x512/apps
cp ${headlamp-server.src}/frontend/public/android-chrome-512x512.png $out/share/icons/hicolor/512x512/apps/headlamp.png
# Wrapper
mkdir -p $out/bin
makeWrapper ${electron}/bin/electron $out/bin/headlamp \
--add-flags $out/lib/headlamp/app \
--prefix PATH : ${headlamp-server}/bin
runHook postInstall
'';
passthru = {
frontend = headlamp-frontend;
};
meta = headlamp-server.meta // {
mainProgram = "headlamp";
};
}