From 0997a952349289e5b19e97da83e85662a1c3943e Mon Sep 17 00:00:00 2001 From: Gabriel Arazas Date: Sat, 26 Oct 2024 18:35:21 +0800 Subject: [PATCH] devcontainers: init --- configs/flake-parts/dev.nix | 3 ++ devcontainers/default.nix | 7 +++++ devcontainers/js-backend.nix | 13 +++++++++ devcontainers/rust-backend.nix | 32 +++++++++++++++++++++ modules/flake-parts/default.nix | 1 + modules/flake-parts/devcontainers.nix | 40 +++++++++++++++++++++++++++ 6 files changed, 96 insertions(+) create mode 100644 devcontainers/default.nix create mode 100644 devcontainers/js-backend.nix create mode 100644 devcontainers/rust-backend.nix create mode 100644 modules/flake-parts/devcontainers.nix diff --git a/configs/flake-parts/dev.nix b/configs/flake-parts/dev.nix index 6b4d6dfa..7433fb5b 100644 --- a/configs/flake-parts/dev.nix +++ b/configs/flake-parts/dev.nix @@ -51,5 +51,8 @@ devPackages = { inherit (import ../../docs { inherit pkgs; }) website; }; + + # All of the typical devcontainers to be used. + devcontainers = import ../../devcontainers { inherit pkgs; }; }; } diff --git a/devcontainers/default.nix b/devcontainers/default.nix new file mode 100644 index 00000000..0413869f --- /dev/null +++ b/devcontainers/default.nix @@ -0,0 +1,7 @@ +{ pkgs ? import { } }: + +let inherit (pkgs) callPackage; +in { + rustBackend = callPackage ./rust-backend.nix { }; + jsBackend = callPackage ./js-backend.nix { }; +} diff --git a/devcontainers/js-backend.nix b/devcontainers/js-backend.nix new file mode 100644 index 00000000..fbc46d40 --- /dev/null +++ b/devcontainers/js-backend.nix @@ -0,0 +1,13 @@ +{ dockerTools, buildEnv, nodejs, bun, pnpm }: + +dockerTools.buildImage { + name = "js-backend"; + + copyToRoot = buildEnv { + name = "js-backend-root"; + paths = [ nodejs bun pnpm ]; + pathsToLink = [ "/bin" "/share" "/etc" "/lib" ]; + }; + + config.Cmd = [ "/bin/bash" ]; +} diff --git a/devcontainers/rust-backend.nix b/devcontainers/rust-backend.nix new file mode 100644 index 00000000..a88ec6ac --- /dev/null +++ b/devcontainers/rust-backend.nix @@ -0,0 +1,32 @@ +{ dockerTools, buildEnv, rustc, cargo, rust-bindgen, rust-analyzer, nodejs, bash +, meson, ninja, pkg-config }: + +dockerTools.buildImage { + name = "rust-backend"; + + copyToRoot = buildEnv { + name = "rust-backend-root"; + paths = [ + bash + cargo + rust-bindgen + rust-analyzer + rustc + nodejs + meson + ninja + pkg-config + ]; + pathsToLink = [ "/bin" "/etc" "/lib" "/share" ]; + }; + + runAsRoot = '' + mkdir -p /data + ''; + + config = { + Cmd = [ "/bin/bash" ]; + WorkingDir = "/data"; + Volumes."/data" = { }; + }; +} diff --git a/modules/flake-parts/default.nix b/modules/flake-parts/default.nix index 61af71fe..b7e4c172 100644 --- a/modules/flake-parts/default.nix +++ b/modules/flake-parts/default.nix @@ -8,6 +8,7 @@ imports = [ ./images.nix ./devpackages.nix + ./devcontainers.nix ./disko-configurations.nix ./deploy-rs-nodes.nix ./home-configurations.nix diff --git a/modules/flake-parts/devcontainers.nix b/modules/flake-parts/devcontainers.nix new file mode 100644 index 00000000..13c01195 --- /dev/null +++ b/modules/flake-parts/devcontainers.nix @@ -0,0 +1,40 @@ +{ config, lib, flake-parts-lib, ... }: + +let inherit (flake-parts-lib) mkSubmoduleOptions mkPerSystemOption; +in { + options = { + flake = mkSubmoduleOptions { + devContainers = lib.mkOption { + type = with lib.types; lazyAttrsOf (attrsOf package); + default = { }; + description = '' + An attribute set of per-system packages intended to be consumed for + development environments. + ''; + }; + }; + + perSystem = mkPerSystemOption { + options = { + devContainers = lib.mkOption { + type = with lib.types; attrsOf package; + default = { }; + description = '' + An attribute set of per-system packages intended to be consumed for + development environments. + ''; + }; + }; + }; + }; + + config = { + flake.devContainers = lib.mapAttrs (k: v: v.devContainers) + (lib.filterAttrs (k: v: v.devContainers != { }) config.allSystems); + + perInput = system: flake: + lib.optionalAttrs (flake ? devContainers.${system}) { + devContainers = flake.devContainers.${system}; + }; + }; +}