feat(12): nix installation of exercise

This commit is contained in:
efim 2023-06-28 12:42:59 +00:00
parent abf0c7262d
commit 2f1804a9fd
4 changed files with 114 additions and 0 deletions

View File

@ -0,0 +1,16 @@
.bsp/
.scala-build/
.metals/
.direnv
*/dist/
/11-single-price-grid-component/.bloop/
**/.bloop
**/project/project/
**/project/metals.sbt
**/project/.bloop
**/project/target/
**/target/
*/result
result

View File

@ -0,0 +1,90 @@
{ pkgs, lib, sbt-derivation }:
let
package = sbt-derivation.lib.mkSbtDerivation {
inherit pkgs;
# ...and the rest of the arguments
pname = "order-summary-component-app";
version = "0.0.1";
src = pkgs.nix-gitignore.gitignoreSource [ ] ./.;
nativeBuildInputs = [ pkgs.nodePackages.tailwindcss ];
buildPhase = ''
sbt assembly
tailwindcss -i ./src/input.css -o ./output.css
'';
# css path different from ordinary development,
# because .gitignore makes it unavailable during nix build
# anyway copied to correct place
installPhase = ''
mkdir -p $out/bin
cp target/scala-*/order-summary-component-assembly-*.jar $out/bin/order-summary-component.jar
mkdir -p $out/bin/dist
cp ./output.css $out/bin/dist/output.css
cp -r public $out/bin/public
'';
depsSha256 = "sha256-ADQB4qTl69ERlLAURrtR3fWa7PUdYjFLk5QdU5QgxRQ=";
};
module = { config, pkgs, ... }:
let cfg = config.services.orderSummaryComponent;
in {
options.services.orderSummaryComponent = {
enable = lib.mkEnableOption "My service";
port = lib.mkOption {
type = lib.types.int;
default = 8080;
description = "Port to listen on.";
};
host = lib.mkOption {
type = lib.types.str;
default = "localhost";
description = "Host to bind to.";
};
useNginx = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Whether to use Nginx to proxy requests.";
};
};
config = lib.mkIf cfg.enable {
users.groups.order-summary-component-group = { };
users.users.order-summary-component-user = {
isSystemUser = true;
group = "order-summary-component-group";
};
systemd.services.orderSummaryComponent =
let serverHost = if cfg.useNginx then "localhost" else cfg.host;
in {
description = "Exercise app Order Summary Component";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
startLimitIntervalSec = 30;
startLimitBurst = 10;
serviceConfig = {
ExecStart =
"${pkgs.jdk}/bin/java -jar ${package}/bin/order-summary-component.jar -p ${
toString cfg.port
} --host ${serverHost}";
WorkingDirectory = "${package}/bin";
Restart = "on-failure";
User = "order-summary-component-user";
Group = "order-summary-component-group";
};
};
services.nginx = lib.mkIf cfg.useNginx {
virtualHosts.${cfg.host} = {
locations."/".proxyPass = "http://127.0.0.1:${toString cfg.port}";
};
};
};
};
in {
package = package;
module = module;
}

View File

@ -1 +1,3 @@
addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.1")

View File

@ -15,6 +15,10 @@
inherit pkgs sbt-derivation; inherit pkgs sbt-derivation;
lib = pkgs.lib; lib = pkgs.lib;
}; };
order-summary = import ./12-order-summary-component-thymeleaf/default.nix {
inherit pkgs sbt-derivation;
lib = pkgs.lib;
};
in { in {
devShells.default = pkgs.mkShell { devShells.default = pkgs.mkShell {
buildInputs = [ buildInputs = [
@ -28,6 +32,8 @@
}; };
packages.price-grid-app = price-grid.package; packages.price-grid-app = price-grid.package;
nixosModules.price-grid-app = price-grid.module; nixosModules.price-grid-app = price-grid.module;
packages.order-summary = order-summary.package;
nixosModules.order-summary = order-summary.module;
}); });
# see https://serokell.io/blog/practical-nix-flakes # see https://serokell.io/blog/practical-nix-flakes
} }