summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-28 13:35:41 +0200
committerPaul Buetow <paul@buetow.org>2026-03-28 13:35:41 +0200
commitc141a204ed4a14759795804f87280ffef765f9c6 (patch)
tree70c2b0c02717c36ca1d5a64726048f0be9372153 /packages
parent695a66684a0536e38b489993eaf395a899875a2e (diff)
Move package build/upload scripts from gogios Magefile to conf/packages
Packaging logic is now OS-agnostic shell scripts + Makefile, reusable for any Go project. Cross-compiles locally, SCPs to target host for native packaging, and uploads to the PV. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'packages')
-rw-r--r--packages/Makefile102
-rwxr-xr-xpackages/scripts/pkg-freebsd.sh54
-rwxr-xr-xpackages/scripts/pkg-openbsd.sh54
3 files changed, 210 insertions, 0 deletions
diff --git a/packages/Makefile b/packages/Makefile
new file mode 100644
index 0000000..2afcdd8
--- /dev/null
+++ b/packages/Makefile
@@ -0,0 +1,102 @@
+# Build and upload custom packages to the f3s package repository.
+#
+# Usage:
+# make pkg NAME=gogios SRC=~/git/gogios # both FreeBSD + OpenBSD
+# make pkg-freebsd NAME=gogios SRC=~/git/gogios # FreeBSD only
+# make pkg-openbsd NAME=gogios SRC=~/git/gogios # OpenBSD only
+#
+# Required variables:
+# NAME — package name (e.g. gogios)
+# SRC — path to the Go project root (must have cmd/$(NAME)/main.go
+# and internal/version.go with a Version constant)
+#
+# Optional variables:
+# COMMENT — one-line package description
+# DESC — longer description (for OpenBSD desc file)
+# MAINTAINER — maintainer email
+# WWW — project URL
+# ENTRY — Go main package path relative to SRC (default: cmd/$(NAME)/main.go)
+
+SHELL := /bin/bash
+.ONESHELL:
+
+# SSH targets
+FREEBSD_HOST := f0.lan.buetow.org
+FREEBSD_SSH := ssh -p 22
+FREEBSD_SCP := scp -P 22
+OPENBSD_HOST := rex@fishfinger.buetow.org
+OPENBSD_SSH := ssh
+OPENBSD_SCP := scp
+
+# NFS-backed PV on f0
+PV_BASE := /data/nfs/k3svolumes/pkgrepo
+FREEBSD_REPO := freebsd/FreeBSD:15:amd64/latest
+OPENBSD_VERSION := 7.8
+OPENBSD_REPO := openbsd/$(OPENBSD_VERSION)/packages/amd64
+
+# Defaults for package metadata
+COMMENT ?= $(NAME)
+DESC ?= $(NAME)
+MAINTAINER ?= paul@buetow.org
+WWW ?= https://buetow.org
+ENTRY ?= cmd/$(NAME)/main.go
+
+SCRIPTS := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))scripts
+
+# Extract version from internal/version.go, stripping the "v" prefix
+VERSION = $(shell grep 'Version' $(SRC)/internal/version.go | sed 's/.*"\(.*\)"/\1/' | tr -d v)
+
+.PHONY: pkg pkg-freebsd pkg-openbsd check-vars clean
+
+check-vars:
+ifndef NAME
+ $(error NAME is required — e.g. make pkg NAME=gogios SRC=~/git/gogios)
+endif
+ifndef SRC
+ $(error SRC is required — e.g. make pkg NAME=gogios SRC=~/git/gogios)
+endif
+ @test -f "$(SRC)/$(ENTRY)" || { echo "Error: $(SRC)/$(ENTRY) not found"; exit 1; }
+ @test -n "$(VERSION)" || { echo "Error: could not extract version from $(SRC)/internal/version.go"; exit 1; }
+ @echo "Package: $(NAME) $(VERSION)"
+
+# Cross-compile for FreeBSD amd64
+/tmp/$(NAME)-freebsd: check-vars
+ @echo "Cross-compiling $(NAME) for FreeBSD/amd64..."
+ cd $(SRC) && GOOS=freebsd GOARCH=amd64 go build -o $@ $(ENTRY)
+
+# Cross-compile for OpenBSD amd64
+/tmp/$(NAME)-openbsd: check-vars
+ @echo "Cross-compiling $(NAME) for OpenBSD/amd64..."
+ cd $(SRC) && GOOS=openbsd GOARCH=amd64 go build -o $@ $(ENTRY)
+
+# Build, package, and upload the FreeBSD package
+pkg-freebsd: /tmp/$(NAME)-freebsd
+ @echo "Packaging $(NAME) $(VERSION) for FreeBSD..."
+ $(FREEBSD_SCP) /tmp/$(NAME)-freebsd $(FREEBSD_HOST):/tmp/$(NAME)
+ $(FREEBSD_SCP) $(SCRIPTS)/pkg-freebsd.sh $(FREEBSD_HOST):/tmp/pkg-freebsd.sh
+ $(FREEBSD_SSH) $(FREEBSD_HOST) "/bin/sh /tmp/pkg-freebsd.sh \
+ '$(NAME)' '$(VERSION)' '$(COMMENT)' '$(DESC)' '$(MAINTAINER)' '$(WWW)' \
+ '$(PV_BASE)/$(FREEBSD_REPO)'"
+ rm -f /tmp/$(NAME)-freebsd
+
+# Build, package, sign, and upload the OpenBSD package
+pkg-openbsd: /tmp/$(NAME)-openbsd
+ @echo "Packaging $(NAME) $(VERSION) for OpenBSD..."
+ $(OPENBSD_SCP) /tmp/$(NAME)-openbsd $(OPENBSD_HOST):/tmp/$(NAME)
+ $(OPENBSD_SCP) $(SCRIPTS)/pkg-openbsd.sh $(OPENBSD_HOST):/tmp/pkg-openbsd.sh
+ $(OPENBSD_SSH) $(OPENBSD_HOST) "/bin/sh /tmp/pkg-openbsd.sh \
+ '$(NAME)' '$(VERSION)' '$(COMMENT)' '$(DESC)'"
+ @echo "Copying signed package to PV via f0..."
+ $(OPENBSD_SCP) $(OPENBSD_HOST):/tmp/$(NAME)-pkg/out/$(NAME)-$(VERSION).tgz /tmp/$(NAME)-$(VERSION).tgz
+ $(FREEBSD_SCP) /tmp/$(NAME)-$(VERSION).tgz $(FREEBSD_HOST):/tmp/$(NAME)-$(VERSION).tgz
+ $(FREEBSD_SSH) $(FREEBSD_HOST) "doas cp /tmp/$(NAME)-$(VERSION).tgz $(PV_BASE)/$(OPENBSD_REPO)/ && rm /tmp/$(NAME)-$(VERSION).tgz"
+ @# Clean up remote and local temp files
+ $(OPENBSD_SSH) $(OPENBSD_HOST) "doas rm -rf /tmp/$(NAME)-pkg /tmp/$(NAME) /tmp/pkg-openbsd.sh"
+ rm -f /tmp/$(NAME)-openbsd /tmp/$(NAME)-$(VERSION).tgz
+ @echo "OpenBSD package $(NAME)-$(VERSION) uploaded to repo"
+
+# Build and upload for both OSes
+pkg: pkg-freebsd pkg-openbsd
+
+clean:
+ rm -f /tmp/$(NAME)-freebsd /tmp/$(NAME)-openbsd /tmp/$(NAME)-*.tgz
diff --git a/packages/scripts/pkg-freebsd.sh b/packages/scripts/pkg-freebsd.sh
new file mode 100755
index 0000000..bd3dcf2
--- /dev/null
+++ b/packages/scripts/pkg-freebsd.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+# Build a FreeBSD package from a pre-compiled binary and upload to the repo PV.
+# Run on a FreeBSD host (e.g. f0). Called by the Makefile via SSH.
+#
+# Arguments:
+# $1 — package name (e.g. gogios)
+# $2 — version (e.g. 1.4.1)
+# $3 — one-line comment
+# $4 — description
+# $5 — maintainer email
+# $6 — project URL
+# $7 — PV destination path (e.g. /data/nfs/k3svolumes/pkgrepo/freebsd/FreeBSD:15:amd64/latest)
+
+set -e
+
+NAME="$1"
+VERSION="$2"
+COMMENT="$3"
+DESC="$4"
+MAINTAINER="$5"
+WWW="$6"
+PV_DEST="$7"
+
+WORKDIR="/tmp/${NAME}-pkg"
+rm -rf "$WORKDIR"
+mkdir -p "$WORKDIR/stage/usr/local/bin" "$WORKDIR/out/All"
+
+# Place the pre-compiled binary
+cp "/tmp/${NAME}" "$WORKDIR/stage/usr/local/bin/${NAME}"
+chmod 755 "$WORKDIR/stage/usr/local/bin/${NAME}"
+
+# Packing list — files relative to prefix
+printf 'bin/%s\n' "$NAME" > "$WORKDIR/plist"
+
+# Package manifest
+cat > "$WORKDIR/+MANIFEST" <<MANIFEST
+name: ${NAME}
+version: "${VERSION}"
+origin: local/${NAME}
+comment: "${COMMENT}"
+desc: "${DESC}"
+maintainer: "${MAINTAINER}"
+www: "${WWW}"
+prefix: /usr/local
+MANIFEST
+
+# Build and regenerate repo metadata
+doas pkg create -M "$WORKDIR/+MANIFEST" -p "$WORKDIR/plist" -r "$WORKDIR/stage" -o "$WORKDIR/out/All"
+doas pkg repo "$WORKDIR/out"
+doas cp -Rf "$WORKDIR/out/"* "$PV_DEST/"
+
+# Clean up
+rm -rf "$WORKDIR" "/tmp/${NAME}" "/tmp/pkg-freebsd.sh"
+echo "FreeBSD package ${NAME}-${VERSION} uploaded to repo"
diff --git a/packages/scripts/pkg-openbsd.sh b/packages/scripts/pkg-openbsd.sh
new file mode 100755
index 0000000..2cdc822
--- /dev/null
+++ b/packages/scripts/pkg-openbsd.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+# Build and sign an OpenBSD package from a pre-compiled binary.
+# Run on an OpenBSD host (e.g. fishfinger). Called by the Makefile via SSH.
+# The signed .tgz is left in /tmp/<name>-pkg/out/ for the Makefile to retrieve.
+#
+# Arguments:
+# $1 — package name (e.g. gogios)
+# $2 — version (e.g. 1.4.1)
+# $3 — one-line comment
+# $4 — description
+
+set -e
+
+NAME="$1"
+VERSION="$2"
+COMMENT="$3"
+DESC="$4"
+
+WORKDIR="/tmp/${NAME}-pkg"
+doas rm -rf "$WORKDIR"
+mkdir -p "$WORKDIR/stage/usr/local/bin" "$WORKDIR/out"
+
+# Place the pre-compiled binary
+cp "/tmp/${NAME}" "$WORKDIR/stage/usr/local/bin/${NAME}"
+chmod 755 "$WORKDIR/stage/usr/local/bin/${NAME}"
+
+# Packing list
+printf 'usr/local/bin/%s\n' "$NAME" > "$WORKDIR/plist"
+
+# Description file
+printf '%s\n' "$DESC" > "$WORKDIR/desc"
+
+# Build the package
+doas pkg_create \
+ -D COMMENT="$COMMENT" \
+ -d "$WORKDIR/desc" \
+ -f "$WORKDIR/plist" \
+ -B "$WORKDIR/stage" \
+ -p / \
+ "$WORKDIR/out/${NAME}-${VERSION}.tgz"
+
+# Sign with signify if the key exists
+if [ -f /etc/signify/custom-pkg.sec ]; then
+ mkdir -p "$WORKDIR/signed"
+ doas pkg_sign -s signify2 -s /etc/signify/custom-pkg.sec \
+ -o "$WORKDIR/signed" "$WORKDIR/out/${NAME}-${VERSION}.tgz"
+ mv "$WORKDIR/signed/${NAME}-${VERSION}.tgz" "$WORKDIR/out/${NAME}-${VERSION}.tgz"
+ rm -rf "$WORKDIR/signed"
+ echo "Package signed with signify"
+else
+ echo "Warning: /etc/signify/custom-pkg.sec not found, package is unsigned"
+fi
+
+echo "OpenBSD package ${NAME}-${VERSION} built in $WORKDIR/out/"