diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-28 13:35:41 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-28 13:35:41 +0200 |
| commit | c141a204ed4a14759795804f87280ffef765f9c6 (patch) | |
| tree | 70c2b0c02717c36ca1d5a64726048f0be9372153 /packages | |
| parent | 695a66684a0536e38b489993eaf395a899875a2e (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/Makefile | 102 | ||||
| -rwxr-xr-x | packages/scripts/pkg-freebsd.sh | 54 | ||||
| -rwxr-xr-x | packages/scripts/pkg-openbsd.sh | 54 |
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/" |
