Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
2025-09-16 14:18:56 +03:00
parent 2d0e31b358
commit ebd79d510b

View File

@@ -56,65 +56,66 @@
pkgs.gnutar pkgs.gnutar
pkgs.gzip pkgs.gzip
]; ];
dontFixup = true;
buildCommand = '' buildCommand = ''
set -euo pipefail set -euo pipefail
PAY="$PWD/payload" PAY="$PWD/payload"
mkdir -p "$PAY/nix/store" mkdir -p "$PAY/nix/store"
# 1) copy closure (no nix calls; uses closureInfo) # 1) copy closure (no nix calls; uses closureInfo)
while IFS= read -r p; do while IFS= read -r p; do
cp -a --no-preserve=ownership "$p" "$PAY/nix/store/" cp -a --no-preserve=ownership "$p" "$PAY/nix/store/"
done < ${ci}/store-paths done < ${ci}/store-paths
# 2) pick app binary and make relative path used by the runner # 2) pick app binary and make relative path used by the runner
APP_BIN=$(find ${appBinGuess} -maxdepth 1 -type f -perm -111 | head -n1) APP_BIN=$(find ${appBinGuess} -maxdepth 1 -type f -perm -111 | head -n1)
if [ -z "''${APP_BIN:-}" ]; then if [ -z "''${APP_BIN:-}" ]; then
echo "no executable found in ${appBinGuess}" >&2 echo "no executable found in ${appBinGuess}" >&2
exit 1 exit 1
fi fi
APP_REL="/nix/store/$(basename "$(dirname "$APP_BIN")")/$(basename "$APP_BIN")" APP_REL="/nix/store/$(basename "$(dirname "$APP_BIN")")/$(basename "$APP_BIN")"
# 3) tar the payload OUTSIDE $PAY to avoid self-inclusion # 3) tar the payload OUTSIDE $PAY to avoid self-inclusion
_TMP="$(mktemp -d)" _TMP="$(mktemp -d)"
( cd "$PAY" && tar \ ( cd "$PAY" && tar \
--sort=name \ --sort=name \
--owner=0 --group=0 --numeric-owner \ --owner=0 --group=0 --numeric-owner \
-czf "$_TMP/payload.tar.gz" . ) -czf "$_TMP/payload.tar.gz" . )
# 4) write the self-extracting stub # 4) write the self-extracting stub
cat > "$out" <<'SH' cat > "$out" <<'SH'
#!/bin/sh #!/bin/sh
set -euf set -euf
: "''${TMPDIR:=/tmp}" : "''${TMPDIR:=/tmp}"
EXTRACT_DIR="$(mktemp -d "''${TMPDIR%/}/nxbdl.XXXXXX")" EXTRACT_DIR="$(mktemp -d "''${TMPDIR%/}/nxbdl.XXXXXX")"
cleanup() { [ -n "''${KEEP_BUNDLE:-}" ] || rm -rf "$EXTRACT_DIR"; } cleanup() { [ -n "''${KEEP_BUNDLE:-}" ] || rm -rf "$EXTRACT_DIR"; }
trap cleanup EXIT INT TERM trap cleanup EXIT INT TERM
ARCHIVE_LINE=$(awk '/^__ARCHIVE_BELOW__/ {print NR+1; exit 0}' "$0") ARCHIVE_LINE=$(awk '/^__ARCHIVE_BELOW__/ {print NR+1; exit 0}' "$0")
tail -n +"$ARCHIVE_LINE" "$0" | tar -xzf - -C "$EXTRACT_DIR" tail -n +"$ARCHIVE_LINE" "$0" | tar -xzf - -C "$EXTRACT_DIR"
cd "$EXTRACT_DIR" cd "$EXTRACT_DIR"
APP_REL='__APP_REL__' APP_REL='__APP_REL__'
PROOT_REL='__PROOT_REL__' PROOT_REL='__PROOT_REL__'
BUNDLE_PWD="''${BUNDLE_PWD:-$PWD}" BUNDLE_PWD="''${BUNDLE_PWD:-$PWD}"
exec ".${PROOT_REL}" \ exec ".${PROOT_REL}" \
-b ./nix:nix \ -b ./nix:nix \
-R / \ -R / \
-w "$BUNDLE_PWD" \ -w "$BUNDLE_PWD" \
".$APP_REL" "$@" ".$APP_REL" "$@"
__ARCHIVE_BELOW__ __ARCHIVE_BELOW__
SH SH
# 5) inject paths, chmod, and append payload # 5) inject paths, chmod, and append payload
sed -i \ sed -i \
-e "s|__APP_REL__|$APP_REL|g" \ -e "s|__APP_REL__|$APP_REL|g" \
-e "s|__PROOT_REL__|${PROOT_REL}|g" \ -e "s|__PROOT_REL__|${PROOT_REL}|g" \
"$out" "$out"
chmod +x "$out" chmod +x "$out"
cat "$_TMP/payload.tar.gz" >> "$out" cat "$_TMP/payload.tar.gz" >> "$out"
''; '';
}; };