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,28 +1,27 @@
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 {
config = baseConfig // {
redisListenPath = "${config.runDir}/redis";
};
static = (import ./static) { inherit pkgs; };
srv = (import ./srv) {
inherit pkgs config;
staticBuild=static.build;
};
redisCfg = pkgs.writeText "mediocre-blog-redisCfg" ''
port 0 port 0
unixsocket ${config.redisListenPath} unixsocket ${config.redisListenPath}
daemonize no daemonize no
@ -33,19 +32,19 @@ in
dir ${config.dataDir}/redis dir ${config.dataDir}/redis
''; '';
redisBin = pkgs.writeScript "mediocregopher-mediocre-blog-redisBin" '' redisBin = pkgs.writeScript "mediocre-blog-redisBin" ''
#!/bin/sh #!/bin/sh
mkdir -p ${config.dataDir}/redis mkdir -p ${config.dataDir}/redis
exec ${pkgs.redis}/bin/redis-server ${redisCfg} exec ${pkgs.redis}/bin/redis-server ${redisCfg}
''; '';
circusCfg = pkgs.writeText "mediocregopher-mediocre-blog-circusCfg" '' circusCfg = pkgs.writeText "mediocre-blog-circusCfg" ''
[circus] [circus]
endpoint = tcp://127.0.0.1:0 endpoint = tcp://127.0.0.1:0
pubsub_endpoint = tcp://127.0.0.1:0 pubsub_endpoint = tcp://127.0.0.1:0
[watcher:srv] [watcher:srv]
cmd = ${srvBin} cmd = ${srv.bin}
numprocesses = 1 numprocesses = 1
[watcher:redis] [watcher:redis]
@ -53,11 +52,14 @@ in
numprocesses = 1 numprocesses = 1
''; '';
circusBin = pkgs.writeScript "mediocregopher-mediocre-blog-circusBin" '' entrypoint = pkgs.writeScript "mediocre-blog-entrypoint" ''
#!/bin/sh
mkdir -p ${config.runDir}
mkdir -p ${config.dataDir}
exec ${pkgs.circus}/bin/circusd ${circusCfg} exec ${pkgs.circus}/bin/circusd ${circusCfg}
''; '';
service = pkgs.writeText "mediocregopher-mediocre-blog" '' service = pkgs.writeText "mediocre-blog" ''
[Unit] [Unit]
Description=mediocregopher mediocre blog Description=mediocregopher mediocre blog
Requires=network.target Requires=network.target
@ -67,13 +69,13 @@ in
Restart=always Restart=always
RestartSec=1s RestartSec=1s
User=mediocregopher User=mediocregopher
ExecStart=${circusBin} ExecStart=${entrypoint}
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
''; '';
install = pkgs.writeScript "mediocregopher-mediocre-blog" '' install = pkgs.writeScript "mediocre-blog" ''
set -e -x set -e -x
sudo cp ${service} /etc/systemd/system/mediocregopher-mediocre-blog.service sudo cp ${service} /etc/systemd/system/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,9 +1,18 @@
let {pkgs, config, staticBuild}: rec {
utils = (import ../nix) {};
pkgs = utils.pkgs; opts = [
system = utils.system; "-pow-secret=${config.powSecret}"
in "-ml-smtp-addr=${config.mlSMTPAddr}"
{ "-ml-smtp-auth='${config.mlSMTPAuth}'"
"-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}" ]
);
build = pkgs.buildGoModule { build = pkgs.buildGoModule {
pname = "mediocre-blog-srv"; pname = "mediocre-blog-srv";
@ -12,9 +21,18 @@ in
vendorSha256 = "08wv94yv2wmlxzmanw551gixc8v8nl6zq2m721ig9nl3r540x46f"; 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 { shell = pkgs.stdenv.mkDerivation {
name = "mediocre-blog-srv-shell"; name = "mediocre-blog-srv-shell";
buildInputs = [ pkgs.go ]; 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;
build = pkgs.stdenv.mkDerivation {
name = "mediocre-blog-static"; name = "mediocre-blog-static";
builder = "${pkgs.bash}/bin/bash"; src = ./src;
args = [ buildPhase = "${jekyllEnv}/bin/jekyll build";
(pkgs.writeTextFile { installPhase = "mv _site $out";
name = "mediocre-blog-static-buildsh"; };
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 \
-s ./src \
-d ./_site \
-w -I -D \
-P 4001
''; '';
executable = true;
})
];
};
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 {
name = "mediocre-blog-static-dep-shell";
buildInputs = dep_inputs;
};
shell = pkgs.stdenv.mkDerivation { shell = pkgs.stdenv.mkDerivation {
name = "mediocre-blog-static-shell"; name = "mediocre-blog-static-shell";
buildInputs = all_inputs; buildInputs = allInputs;
}; };
} }