refactor how nix derivations are organized and built

This commit is contained in:
Brian Picciano 2021-08-08 07:57:45 -06:00
parent 0197d9cd49
commit 6feffc568a
8 changed files with 167 additions and 174 deletions

View File

@ -1,4 +1,25 @@
install: all:
nix-build -A install nix-build -A entrypoint --arg baseConfig '(import ./config.nix) // { staticProxyURL = ""; }'
all.prod:
nix-build -A entrypoint --arg baseConfig '(import ./prod.config.nix)'
install.prod:
nix-build -A install --arg baseConfig '(import ./prod.config.nix)'
./result ./result
srv.shell:
nix-shell -A srv.shell --command 'cd srv; return'
static.shell:
nix-shell -A static.shell --command 'cd static; return'
static.serve:
nix-shell -A static.shell --run 'cd static; static-serve'
static.depShell:
nix-shell -A static.depShell --command 'cd static; return'
static.lock:
nix-shell -A static.depShell --run 'bundler lock; bundix; rm -rf .bundle vendor'

View File

@ -1,10 +1,14 @@
{ {
runDir = "/tmp/mediocre-blog/run";
dataDir = "/tmp/mediocre-blog/data";
powSecret = "ssshhh"; powSecret = "ssshhh";
mlSMTPAddr = ""; mlSMTPAddr = "";
mlSMTPAuth = ""; mlSMTPAuth = "";
dataDir = "/tmp/mediocre-blog-data";
publicURL = "http://localhost:4000"; publicURL = "http://localhost:4000";
listenProto = "tcp"; listenProto = "tcp";
listenAddr = ":4000"; listenAddr = ":4000";
redisListenPath = "/tmp/mediocre-blog-redis";
# If empty then a derived static directory is used
staticProxyURL = "http://127.0.0.1:4001";
} }

View File

@ -1,84 +1,86 @@
let {
utils = (import ./nix) {};
pkgs = utils.pkgs;
system = utils.system;
in
{config ? ./config.nix}: rec {
config = (import ./config.nix);
static = (import ./static).build; pkgs ? import (fetchTarball {
name = "nixpkgs-21-05";
url = "https://github.com/NixOS/nixpkgs/archive/7e9b0dff974c89e070da1ad85713ff3c20b0ca97.tar.gz";
sha256 = "1ckzhh24mgz6jd1xhfgx0i9mijk6xjqxwsshnvq789xsavrmsc36";
}) {},
srv = (import ./srv).build; baseConfig ? import ./config.nix,
srvBin = pkgs.writeScript "mediocregopher-mediocre-blog-srvBin" ''
#!/bin/sh
exec ${srv}/bin/mediocre-blog \
-pow-secret "${config.powSecret}" \
-ml-smtp-addr "${config.mlSMTPAddr}" \
-ml-smtp-auth "${config.mlSMTPAuth}" \
-data-dir "${config.dataDir}" \
-public-url "${config.publicURL}" \
-static-dir "${static}" \
-listen-proto "${config.listenProto}" \
-listen-addr "${config.listenAddr}"
'';
redisCfg = pkgs.writeText "mediocregopher-mediocre-blog-redisCfg" '' }: rec {
port 0
unixsocket ${config.redisListenPath}
daemonize no
loglevel notice
logfile ""
appendonly yes
appendfilename "appendonly.aof"
dir ${config.dataDir}/redis
'';
redisBin = pkgs.writeScript "mediocregopher-mediocre-blog-redisBin" '' config = baseConfig // {
#!/bin/sh redisListenPath = "${config.runDir}/redis";
mkdir -p ${config.dataDir}/redis };
exec ${pkgs.redis}/bin/redis-server ${redisCfg}
'';
circusCfg = pkgs.writeText "mediocregopher-mediocre-blog-circusCfg" '' static = (import ./static) { inherit pkgs; };
[circus]
endpoint = tcp://127.0.0.1:0
pubsub_endpoint = tcp://127.0.0.1:0
[watcher:srv] srv = (import ./srv) {
cmd = ${srvBin} inherit pkgs config;
numprocesses = 1 staticBuild=static.build;
};
[watcher:redis] redisCfg = pkgs.writeText "mediocre-blog-redisCfg" ''
cmd = ${redisBin} port 0
numprocesses = 1 unixsocket ${config.redisListenPath}
''; daemonize no
loglevel notice
logfile ""
appendonly yes
appendfilename "appendonly.aof"
dir ${config.dataDir}/redis
'';
circusBin = pkgs.writeScript "mediocregopher-mediocre-blog-circusBin" '' redisBin = pkgs.writeScript "mediocre-blog-redisBin" ''
exec ${pkgs.circus}/bin/circusd ${circusCfg} #!/bin/sh
''; mkdir -p ${config.dataDir}/redis
exec ${pkgs.redis}/bin/redis-server ${redisCfg}
'';
service = pkgs.writeText "mediocregopher-mediocre-blog" '' circusCfg = pkgs.writeText "mediocre-blog-circusCfg" ''
[Unit] [circus]
Description=mediocregopher mediocre blog endpoint = tcp://127.0.0.1:0
Requires=network.target pubsub_endpoint = tcp://127.0.0.1:0
After=network.target
[Service] [watcher:srv]
Restart=always cmd = ${srv.bin}
RestartSec=1s numprocesses = 1
User=mediocregopher
ExecStart=${circusBin}
[Install] [watcher:redis]
WantedBy=multi-user.target cmd = ${redisBin}
''; numprocesses = 1
'';
install = pkgs.writeScript "mediocregopher-mediocre-blog" '' entrypoint = pkgs.writeScript "mediocre-blog-entrypoint" ''
set -e -x #!/bin/sh
mkdir -p ${config.runDir}
mkdir -p ${config.dataDir}
exec ${pkgs.circus}/bin/circusd ${circusCfg}
'';
sudo cp ${service} /etc/systemd/system/mediocregopher-mediocre-blog.service service = pkgs.writeText "mediocre-blog" ''
sudo systemctl daemon-reload [Unit]
sudo systemctl enable mediocregopher-mediocre-blog.service Description=mediocregopher mediocre blog
sudo systemctl restart mediocregopher-mediocre-blog.service Requires=network.target
''; After=network.target
}
[Service]
Restart=always
RestartSec=1s
User=mediocregopher
ExecStart=${entrypoint}
[Install]
WantedBy=multi-user.target
'';
install = pkgs.writeScript "mediocre-blog" ''
set -e -x
sudo cp ${service} /etc/systemd/system/mediocregopher-mediocre-blog.service
sudo systemctl daemon-reload
sudo systemctl enable mediocregopher-mediocre-blog.service
sudo systemctl restart mediocregopher-mediocre-blog.service
'';
}

View File

@ -1,13 +0,0 @@
{
pkgs ? import (fetchTarball {
name = "nixpkgs-21-05";
url = "https://github.com/NixOS/nixpkgs/archive/7e9b0dff974c89e070da1ad85713ff3c20b0ca97.tar.gz";
sha256 = "1ckzhh24mgz6jd1xhfgx0i9mijk6xjqxwsshnvq789xsavrmsc36";
}) {},
system ? builtins.currentSystem,
}:
{
pkgs = pkgs;
system = system;
}

View File

@ -1,7 +0,0 @@
build:
nix-build -A build
shell:
nix-shell -A shell

View File

@ -1,20 +1,38 @@
let {pkgs, config, staticBuild}: rec {
utils = (import ../nix) {};
pkgs = utils.pkgs;
system = utils.system;
in
{
build = pkgs.buildGoModule { opts = [
pname = "mediocre-blog-srv"; "-pow-secret=${config.powSecret}"
version = "dev"; "-ml-smtp-addr=${config.mlSMTPAddr}"
src = ./.; "-ml-smtp-auth='${config.mlSMTPAuth}'"
vendorSha256 = "08wv94yv2wmlxzmanw551gixc8v8nl6zq2m721ig9nl3r540x46f"; "-data-dir=${config.dataDir}"
}; "-public-url=${config.publicURL}"
"-listen-proto=${config.listenProto}"
"-listen-addr=${config.listenAddr}"
] ++ (
if config.staticProxyURL == ""
then [ "-static-dir=${staticBuild}" ]
else [ "-static-proxy-url=${config.staticProxyURL}" ]
);
shell = pkgs.stdenv.mkDerivation { build = pkgs.buildGoModule {
name = "mediocre-blog-srv-shell"; pname = "mediocre-blog-srv";
buildInputs = [ pkgs.go ]; version = "dev";
}; src = ./.;
vendorSha256 = "08wv94yv2wmlxzmanw551gixc8v8nl6zq2m721ig9nl3r540x46f";
};
} bin = pkgs.writeScript "mediocre-blog-srv-bin" ''
#!/bin/sh
exec ${build}/bin/mediocre-blog ${toString opts}
'';
runScript = pkgs.writeScriptBin "run-mediocre-blog" ''
go run ./cmd/mediocre-blog/main.go ${toString opts}
'';
shell = pkgs.stdenv.mkDerivation {
name = "mediocre-blog-srv-shell";
buildInputs = [ pkgs.go runScript ];
};
}

View File

@ -1,18 +0,0 @@
build:
nix-build -A build
clean:
rm -f result
rm -rf _site
dev:
nix-shell -A dev
shell:
nix-shell -A shell
lock:
nix-shell -A depShell --run 'bundler lock; bundix; rm -rf .bundle vendor'
update:
nix-shell -A depShell --run 'bundler update; bundler lock; bundix; rm -rf .bundle vendor'

View File

@ -1,53 +1,39 @@
let {pkgs}: rec {
utils = (import ../nix) {};
pkgs = utils.pkgs;
system = utils.system;
jekyll_env = pkgs.bundlerEnv { depInputs = [ pkgs.imagemagick pkgs.exiftool pkgs.bundler pkgs.bundix ];
name = "jekyll_env";
depShell = pkgs.stdenv.mkDerivation {
name = "mediocre-blog-static-dep-shell";
buildInputs = depInputs;
};
jekyllEnv = pkgs.bundlerEnv {
name = "jekyllEnv";
ruby = pkgs.ruby; ruby = pkgs.ruby;
gemdir = ./.; gemdir = ./.;
}; };
dep_inputs = [ pkgs.imagemagick pkgs.exiftool pkgs.bundler pkgs.bundix ];
all_inputs = [ jekyll_env ] ++ dep_inputs;
in
{
build = derivation {
inherit jekyll_env system;
name = "mediocre-blog-static"; build = pkgs.stdenv.mkDerivation {
builder = "${pkgs.bash}/bin/bash"; name = "mediocre-blog-static";
args = [ src = ./src;
(pkgs.writeTextFile { buildPhase = "${jekyllEnv}/bin/jekyll build";
name = "mediocre-blog-static-buildsh"; installPhase = "mv _site $out";
text = '' };
source ${pkgs.stdenv}/setup
set -e
mkdir -p "$out" serve = pkgs.writeScriptBin "static-serve" ''
$jekyll_env/bin/jekyll build -s "${./src}" -d "$out" #!/bin/sh
''; exec ${jekyllEnv}/bin/jekyll serve \
executable = true; -s ./src \
}) -d ./_site \
]; -w -I -D \
}; -P 4001
'';
dev = pkgs.stdenv.mkDerivation { allInputs = depInputs ++ [ jekyllEnv serve ];
name = "mediocre-blog-static-dev";
buildInputs = all_inputs;
shellHook = ''
exec ${jekyll_env}/bin/jekyll serve -s ./src -d ./_site -w -I -D -H 0.0.0.0 -P 4001
'';
};
depShell = pkgs.stdenv.mkDerivation { shell = pkgs.stdenv.mkDerivation {
name = "mediocre-blog-static-dep-shell"; name = "mediocre-blog-static-shell";
buildInputs = dep_inputs; buildInputs = allInputs;
}; };
}
shell = pkgs.stdenv.mkDerivation {
name = "mediocre-blog-static-shell";
buildInputs = all_inputs;
};
}