Files
maggesandClaude Sonnet 5 2b79411b68 Replace vendored docker-compose with podman-compose
podman-compose and docker-compose aren't discovered the same way by
`podman compose` - verified live (a fake-binary test reading podman's own
provider-search error output) that docker-compose is searched for by
exact path across a fixed list of CLI-plugin directories, while
podman-compose is instead looked up as a plain command on $PATH. This
package installs to /usr/local/bin/podman-compose accordingly, not under
any cli-plugins/ directory.

Unlike docker-compose (a single static Go binary), podman-compose is a
Python script with two runtime dependencies neither of which ship with
Unraid's own Python3 - PyYAML and python-dotenv, vendored here as plain
pure-Python source (no C extension build; PyYAML's own fallback handles
its optional C accelerator being absent).

Verified end-to-end on a real host: with the previous docker-compose
binary temporarily moved aside to confirm podman-compose was actually the
one invoked, `podman compose up/ps/down` ran a real compose project
correctly, including a live HTTP check against the started service.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 18:35:38 +00:00

111 lines
4.2 KiB
Bash
Executable File

#!/bin/bash
# =============================================================================
# scripts/build-packages.sh
#
# Orchestrates building all Slackware .txz packages this plugin ships
# (podman, conmon, crun, netavark, aardvark-dns, passt, fuse-overlayfs,
# catatonit, nftables, podman-compose), by running each package's
# <name>.SlackBuild in turn. See docs/ARCHITECTURE.md section 5.2
# (Build-Strategie).
#
# This script itself does not containerize anything — it assumes it is
# already running inside a Slackware-compatible build environment (see
# .github/workflows/build-packages.yml, which runs it inside a pinned
# Slackware Docker image). Running it on a non-Slackware host will likely
# still compile successfully for most components but the resulting .txz
# should not be trusted for an actual Unraid install — see the container
# image note in the CI workflow.
#
# Usage:
# scripts/build-packages.sh # build all packages
# scripts/build-packages.sh podman conmon # build only the named ones
#
# Output: $REPO_ROOT/dist/<name>-<version>-<arch>-<build><tag>.txz
# plus a .sha256 and .md5 sidecar file per package (see
# scripts/lib/slackbuild-common.sh, sb_make_package).
# Nothing under dist/ is committed to git — see .gitignore.
# =============================================================================
set -eu
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PACKAGES_DIR="$REPO_ROOT/packages"
DIST_DIR="$REPO_ROOT/dist"
# The full, ordered set of packages this project builds automatically.
# containers-common is intentionally excluded for now — see packages/README.md.
# unraid-podman (the plugin's own scaffolding, not an upstream component —
# see packages/unraid-podman/README.md) is built last since it's by far the
# fastest and has nothing useful to report on failure that earlier package
# failures wouldn't already explain.
ALL_PACKAGES=(catatonit nftables podman-compose conmon crun netavark aardvark-dns passt fuse-overlayfs podman unraid-podman)
# catatonit, nftables, and podman-compose are listed first since none of
# them involve a compiler — catatonit/nftables are a plain
# fetch-and-repackage of an already-built upstream artifact, and
# podman-compose is vendored pure-Python source with nothing to compile
# (see their own README.md/SlackBuild for why) — fastest possible signal
# if a pinned URL/checksum in versions.env ever goes stale.
# Podman is listed second-to-last on purpose: among the compiled
# components it is the slowest build and the one most likely to fail on
# a dependency/tag mistake, so faster packages surface problems first
# during local iteration. unraid-podman is genuinely last since it
# packages this repo's own files and has no compile step at all.
requested=("$@")
if [ "${#requested[@]}" -eq 0 ]; then
targets=("${ALL_PACKAGES[@]}")
else
targets=("${requested[@]}")
fi
mkdir -p "$DIST_DIR"
echo "==> Building packages: ${targets[*]}"
echo "==> Output directory: $DIST_DIR"
echo
failed=()
built=()
for name in "${targets[@]}"; do
slackbuild="$PACKAGES_DIR/$name/$name.SlackBuild"
if [ ! -x "$slackbuild" ]; then
echo "!! No SlackBuild found/executable for '$name' ($slackbuild)" >&2
failed+=("$name")
continue
fi
echo "############################################################"
echo "## Building: $name"
echo "############################################################"
# Run each SlackBuild with OUTPUT pointed at the shared dist/ directory,
# so every package's .txz ends up in one place regardless of the
# per-package TMP/PKG scratch dirs it uses internally.
if OUTPUT="$DIST_DIR" "$slackbuild"; then
built+=("$name")
else
echo "!! Build failed: $name" >&2
failed+=("$name")
fi
echo
done
echo "============================================================"
echo "Build summary"
echo "============================================================"
echo "Succeeded (${#built[@]}): ${built[*]:-none}"
echo "Failed (${#failed[@]}): ${failed[*]:-none}"
if [ "${#failed[@]}" -gt 0 ]; then
echo
echo "!! One or more packages failed to build — see log above." >&2
exit 1
fi
echo
echo "All packages built successfully. Artifacts in $DIST_DIR:"
ls -1 "$DIST_DIR"