1{2 description = "NixOS cluster configuration management";34 inputs = {5 nixpkgs.url = "github:nixos/nixpkgs/release-26.05";6 rust-overlay = {7 url = "github:oxalica/rust-overlay";8 inputs.nixpkgs.follows = "nixpkgs";9 };10 flake-parts = {11 url = "github:hercules-ci/flake-parts";12 inputs.nixpkgs-lib.follows = "nixpkgs";13 };14 crane.url = "github:ipetkov/crane";15 shelly.url = "github:CertainLach/shelly";16 fleet-tf = {17 url = "github:CertainLach/fleet-tf";18 inputs.nixpkgs.follows = "nixpkgs";19 inputs.shelly.follows = "shelly";20 inputs.flake-parts.follows = "flake-parts";21 };22 treefmt-nix = {23 url = "github:numtide/treefmt-nix";24 inputs.nixpkgs.follows = "nixpkgs";25 };26 # DeterminateSystem's nix fork is controversial, but I don't mind it,27 # and it has lazy-trees support which is useful for fleet.28 nix = {29 url = "github:deltarocks/nix/fleet";30 inputs.nixpkgs.follows = "nixpkgs";31 inputs.flake-parts.follows = "flake-parts";32 };33 };34 outputs =35 inputs:36 inputs.flake-parts.lib.mkFlake37 {38 inherit inputs;39 }40 {41 imports = [ inputs.shelly.flakeModule ];42 flake = rec {43 lib =44 (import ./lib {45 inherit (inputs.nixpkgs) lib;46 })47 // {48 fleetConfiguration = throw "function-based interface is deprecated, use flake-parts syntax instead";49 };50 flakeModules.default = import ./lib/flakePart.nix {51 inherit (inputs) crane;52 };53 flakeModule = flakeModules.default;5455 flakeModules.fleet-tf = ./modules/extras/tf.nix;5657 # Used to test nix-eval bindings58 testData = {59 testObj = {60 v = "Hello";61 };62 testString = "hello";63 testPrimop = op: "PREFIX_" + (op "body" "_SUFFIX");64 };6566 # To be used with https://github.com/NixOS/nix/pull/889267 # schemas =68 # let69 # inherit (inputs.nixpkgs.lib) mapAttrs;70 # in71 # {72 # fleetConfigurations = {73 # version = 1;74 # doc = ''75 # The `fleetConfigurations` flake output defines fleet cluster configurations.76 # '';77 # inventory = output: {78 # children = mapAttrs (configName: cluster: {79 # what = "fleet cluster configuration";80 #81 # children = mapAttrs (hostName: host: {82 # what = "host [${host.system}]";83 # }) cluster.config.hosts;84 # # It is possible to implement this inventory right now, but I want to85 # # get rid of `fleet.nix` file in the future.86 # # children.secrets = { };87 # }) output;88 # };89 # };90 # };91 };92 # Supported and tested list of deployment targets.93 systems = [94 "x86_64-linux"95 "aarch64-linux"96 "armv7l-linux"97 "armv6l-linux"98 ];99 perSystem =100 {101 config,102 system,103 pkgs,104 self,105 inputs',106 ...107 }:108 let109 inherit (lib.attrsets) mapAttrs';110 inherit (lib.lists) elem;111 # Can also be built for darwin, through it is not usual to deploy nixos systems from macos machines.112 # I have no hardware for such testing, thus only adding machines I actually have and use.113 #114 # It is not possible to deploy any host from armv6/armv7 hardware, and I don't think it even makes sense.115 deployerSystems = [116 "aarch64-linux"117 "x86_64-linux"118 ];119 deployerSystem = elem system deployerSystems;120 lib = pkgs.lib;121 rust = (pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml).override {122 enableLibsecret = false;123 };124 craneLib = (inputs.crane.mkLib pkgs).overrideToolchain rust;125 treefmt = (inputs.treefmt-nix.lib.evalModule pkgs ./treefmt.nix).config.build;126 in127 {128 _module.args.pkgs = import inputs.nixpkgs {129 inherit system;130 overlays = [131 inputs.rust-overlay.overlays.default132 ];133 };134 # Reference fleet package should be built with nightly rust, specified in rust-toolchain.toml.135 packages = lib.mkIf deployerSystem (136 let137 packages = pkgs.callPackages ./pkgs {138 inherit craneLib inputs;139 };140 in141 packages // { default = packages.fleet; }142 );143 # fleet-install-secrets will not be built normally, because they are not ran directly by user most of the time.144 # checks there build packages for default nixpkgs rustPlatform packages.145 checks =146 let147 nixpkgsCraneLib = inputs.crane.mkLib pkgs;148 packages = pkgs.callPackages ./pkgs {149 craneLib = nixpkgsCraneLib;150 inherit inputs;151 };152 prefixAttrs =153 prefix: attrs:154 mapAttrs' (name: value: {155 name = "${prefix}${name}";156 value = value.overrideAttrs (prev: {157 pname = "${prefix}${prev.pname}";158 });159 }) attrs;160 in161 # fleet-install-secrets is installed to remote systems, thus needs to work162 # with rust in nixpkgs.163 (prefixAttrs "nixpkgs-" {164 inherit (packages) fleet-install-secrets;165 })166 // {167 formatting = treefmt.check self;168 };169 # TODO: It should be possible to move lib.mkIf to default attribute, instead of disabling the whole170 # devShells block, yet nix flake check fails here, due to no default shell found. It is nix or flake-parts bug?171 shelly.shells.default = lib.mkIf deployerSystem {172 factory = craneLib.devShell;173 packages = with pkgs; [174 rust175176 pkg-config177 openssl178 rustPlatform.bindgenHook179 inputs'.nix.packages.nix-expr-c180 inputs'.nix.packages.nix-flake-c181 inputs'.nix.packages.nix-fetchers-c182 inputs'.nix.packages.nix-store-c183 inputs'.nix.packages.nix184185 (rage.overrideAttrs { cargoFeatures = [ "plugin" ]; })186 ];187 environment.PROTOC = "${pkgs.protobuf}/bin/protoc";188 };189 formatter = treefmt.wrapper;190 };191 };192}difftreelog
source
flake.nix6.8 KiBsourcehistory