nixlets/lib/default.nix

135 lines
3.8 KiB
Nix
Raw Normal View History

2024-03-06 10:23:25 +00:00
{
lib,
2024-11-24 17:19:17 +01:00
kubenix,
2024-03-06 10:23:25 +00:00
...
} @ attrs:
2024-05-08 17:09:17 +00:00
with lib; rec {
2024-03-06 10:23:25 +00:00
mkValues = file: {rawValues, ...} @ args:
(lib.evalModules {
specialArgs = {
2024-05-08 17:09:17 +00:00
utils = import ./utils.nix attrs;
2024-03-06 10:23:25 +00:00
};
modules = [
file
({...}: {
# pass through all args to the values.nix module
config =
rawValues
// {
_module.args = args;
};
})
];
})
.config;
2024-05-08 17:09:17 +00:00
# wraps mkNixletInner to allow passing either a path or an attrset
mkNixlet = arg:
mkNixletInner (
if (builtins.typeOf arg) == "set"
then arg
else
{path = arg;}
// (
if builtins.pathExists "${arg}/nixlet.nix"
then (import "${arg}/nixlet.nix")
else throw "Nixlet at '${arg}' does not contain nixlet.nix and mkNixlet was called with just a path"
)
);
mkNixletInner = {
path,
name,
version ? null,
description ? "",
defaultProject ? null,
...
}: let
# TODO: just like with the values check the args here with the options system?
in {
inherit name version description path;
render = {
system,
project ? defaultProject,
overrides ? ({...}: {}),
values ? {},
}:
assert lib.assertMsg (project != null) "No default project set, please pass a project to the render method"; let
# every nixlet gets "nixlet" as arg with some useful data about itself
nixletArg = {
inherit name project version description;
};
in
2024-11-24 17:19:17 +01:00
(kubenix.evalModules.${system} {
2024-05-08 17:09:17 +00:00
module = {kubenix, ...}: {
imports = with kubenix.modules; [
k8s
helm
docker
files
({...}: let
finalValues = mkValues "${path}/values.nix" {
rawValues = values;
nixlet = nixletArg;
};
in {
imports = [path];
_module.args.nixlet =
{
values = finalValues;
}
// nixletArg;
})
overrides
];
kubenix.project = project;
};
})
.config
.kubernetes
.resultYAML;
};
2024-03-06 10:23:25 +00:00
2024-05-08 17:09:17 +00:00
fetchNixlet = url: sha256: mkNixlet (builtins.fetchTarball {inherit url sha256;});
fetchNixletFromGitlab = {
project,
name,
version,
sha256,
}: let
projectEscaped = builtins.replaceStrings ["/"] ["%2F"] project;
in
fetchNixlet "https://gitlab.com/api/v4/projects/${projectEscaped}/packages/generic/${name}/${version}/${name}.tar.gz" sha256;
2024-03-06 10:23:25 +00:00
2024-05-08 17:09:17 +00:00
uploadNixletsToGitlab = {
pkgs,
projectId,
nixlets,
...
2024-03-06 10:23:25 +00:00
}:
2024-05-08 17:09:17 +00:00
pkgs.writeShellScriptBin "nixlets-upload" (
''
if [[ -z "$AUTH_HEADER" ]]; then
echo "Must provide AUTH_HEADER environment variable!" 1>&2
exit 1
fi
''
+ lib.concatStringsSep "\n" (
builtins.map (nixlet:
with nixlet; ''
URL="https://gitlab.com/api/v4/projects/${projectId}/packages/generic/${name}/${version}/${name}.tar.gz"
if ${pkgs.curl}/bin/curl --output /dev/null --silent --head --fail --header "$AUTH_HEADER" $URL; then
2024-05-08 17:09:17 +00:00
echo "> Skipped ${name}@${version} because it already exists in the Package Registry"
else
echo "> Uploading new version ${name}@${version}"
${pkgs.gnutar}/bin/tar -czf /tmp/${name}.tar.gz --mode='u+rwX' -C ${path} --transform 's/^\./\/${name}/' .
2024-05-08 17:09:17 +00:00
${pkgs.curl}/bin/curl --header "$AUTH_HEADER" --upload-file "/tmp/${name}.tar.gz" "$URL"; echo;
${pkgs.coreutils}/bin/rm -f /tmp/${nixlet.name}.tar.gz
echo "> Finished ${name}@${version}, see above"
fi
'')
nixlets
)
);
2024-03-06 10:23:25 +00:00
}