Skip to content

Commit 511e1d5

Browse files
committed
Add Debian 13 (Trixie) .deb build support
1 parent 4a6a120 commit 511e1d5

File tree

12 files changed

+128
-53
lines changed

12 files changed

+128
-53
lines changed

Dockerfile.client

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
FROM node:24.2-bookworm-slim
1+
ARG DEBIAN_VER=bookworm
2+
FROM node:24-${DEBIAN_VER}-slim
23

34
# Install system packages
45
RUN apt-get -qy update >/dev/null

Dockerfile.org-python

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
FROM debian:bookworm-slim AS python-bookworm-slim
1+
ARG DEBIAN_VER=bookworm
2+
ARG PYTHON_VER=python3.11
3+
FROM debian:${DEBIAN_VER}-slim AS python-slim
24

35
RUN set -eux; \
46
apt-get update; \
@@ -8,7 +10,6 @@ RUN set -eux; \
810
dh-virtualenv \
911
dh-python \
1012
python3 \
11-
python3.11 \
1213
python3-dev \
1314
python3-pip \
1415
python3-setuptools \
@@ -19,9 +20,13 @@ RUN set -eux; \
1920
; \
2021
rm -rf /var/lib/apt/lists/*;
2122

23+
# Re-declare ARG after FROM to make it available in this stage
24+
ARG PYTHON_VER=python3.11
25+
RUN apt-get update && apt-get install -y --no-install-recommends ${PYTHON_VER} ${PYTHON_VER}-venv && rm -rf /var/lib/apt/lists/*
26+
2227
# ----------------------------------
2328

24-
FROM python-bookworm-slim AS build
29+
FROM python-slim AS build
2530

2631
# Install system packages
2732
RUN apt-get -qy update >/dev/null

Dockerfile.server

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
FROM rust:1.87-slim-bookworm AS rust-bookworm-slim
1+
ARG DEBIAN_VER=bookworm
2+
FROM rust:1-slim-${DEBIAN_VER} AS rust-slim
23

34
# ----------------------------------
45

5-
FROM rust-bookworm-slim AS chef
6+
FROM rust-slim AS chef
67

78
# Create regular user
89
ARG USER=docker
@@ -20,12 +21,14 @@ USER ${UID}:${GID}
2021
RUN cargo install cargo-deb
2122
USER root
2223

23-
# Add deb-multimedia repository (for a more recent ffmpeg)
24-
RUN apt-get -qy update
25-
RUN apt-get -qy install gnupg2 wget
26-
RUN wget -q https://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/deb-multimedia-keyring_2024.9.1_all.deb
27-
RUN dpkg -i deb-multimedia-keyring_2024.9.1_all.deb
28-
RUN echo "deb https://www.deb-multimedia.org bookworm main non-free" > /etc/apt/sources.list.d/deb-multimedia.list
24+
# Add deb-multimedia repository (for a more recent ffmpeg) - only needed for bookworm
25+
ARG DEBIAN_VER=bookworm
26+
RUN apt-get -qy update && apt-get -qy install gnupg2 wget
27+
RUN if [ "$DEBIAN_VER" = "bookworm" ]; then \
28+
wget -q https://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/deb-multimedia-keyring_2024.9.1_all.deb && \
29+
dpkg -i deb-multimedia-keyring_2024.9.1_all.deb && \
30+
echo "deb https://www.deb-multimedia.org bookworm main non-free" > /etc/apt/sources.list.d/deb-multimedia.list; \
31+
fi
2932
RUN apt-get -qy update
3033

3134
# Install system packages
@@ -45,7 +48,8 @@ RUN apt-get -qy install sqlite3 >/dev/null
4548
RUN apt-get -qy install libssl-dev >/dev/null
4649
RUN apt-get -qy install libsqlite3-dev >/dev/null
4750
RUN apt-get -qy install protobuf-compiler >/dev/null
48-
RUN apt-get -qy install python3 python3.11 python3.11-venv >/dev/null
51+
ARG PYTHON_VER=python3.11
52+
RUN apt-get -qy install python3 ${PYTHON_VER} ${PYTHON_VER}-venv >/dev/null
4953

5054
# Switch to regular user
5155
RUN mkdir -p /app

Makefile

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,39 @@ default:
1919
clean-debian:
2020
rm -rf dist_deb
2121

22+
# Helper function to test if a Docker base image is available
23+
define test_base_image
24+
@docker build --platform linux/$(1) -q - <<< "FROM rust:1-slim-$(2)" >/dev/null 2>&1
25+
endef
26+
2227
debian-docker:
23-
for plat in arm64 amd64; do \
24-
cd server; TARGET_ARCH=$$plat make debian-docker; cd ..; \
25-
cd organizer; TARGET_ARCH=$$plat make debian-docker; cd ..; \
28+
@echo "Building Debian packages for multiple distributions..."
29+
rm -rf dist_deb && mkdir -p dist_deb
30+
for debver in bookworm trixie; do \
31+
echo ""; \
32+
echo "=== Checking availability for Debian $$debver ==="; \
33+
if docker build --platform linux/amd64 -q - <<< "FROM rust:1-slim-$$debver" >/dev/null 2>&1; then \
34+
echo "=== Building packages for Debian $$debver ==="; \
35+
rm -rf server/dist_deb client/dist_deb organizer/basic_folders/dist_deb; \
36+
for plat in arm64 amd64; do \
37+
echo "--- Building server for $$debver/$$plat ---"; \
38+
(cd server && DEBIAN_VER=$$debver TARGET_ARCH=$$plat make debian-docker); \
39+
echo "--- Building organizer for $$debver/$$plat ---"; \
40+
(cd organizer && DEBIAN_VER=$$debver TARGET_ARCH=$$plat make debian-docker); \
41+
done; \
42+
echo "--- Building client for $$debver ---"; \
43+
(cd client && DEBIAN_VER=$$debver make debian-docker); \
44+
echo "--- Collecting $$debver packages ---"; \
45+
cp client/dist_deb/*.deb dist_deb/ 2>/dev/null || true; \
46+
cp server/dist_deb/*.deb dist_deb/ 2>/dev/null || true; \
47+
cp organizer/basic_folders/dist_deb/*.deb dist_deb/ 2>/dev/null || true; \
48+
else \
49+
echo "=== Skipping $$debver (base image not available) ==="; \
50+
fi; \
2651
done
27-
cd client && make debian-docker
28-
mkdir -p dist_deb
29-
cp client/dist_deb/* dist_deb/
30-
cp server/dist_deb/* dist_deb/
31-
cp organizer/basic_folders/dist_deb/* dist_deb/
32-
rm dist_deb/*dbgsym* dist_deb/built.*.* 2>/dev/null || true
52+
rm dist_deb/*dbgsym* 2>/dev/null || true
53+
@echo ""
54+
@echo "=== Built packages ==="
3355
ls -l dist_deb/
3456

3557
clean: clean-debian

client/Makefile

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ PACKAGE=clapshot_client
66
UID=$(shell id -u)
77
GID=$(shell id -g)
88

9+
# Debian version (can be overridden via environment)
10+
DEBIAN_VER ?= bookworm
11+
912
CLIENT_DEPS=$(shell find src/ public/ package*.json tsconfig.json vite.config.ts -type f 2>/dev/null) $(shell find ../protobuf/proto -type f)
1013
DEB_DEPS=$(shell find debian/ -type f)
1114

@@ -22,7 +25,7 @@ npm-deps:
2225
cd ../protobuf/libs/typescript && make
2326

2427
docker: clean
25-
cd .. && DOCKER_BUILDKIT=1 docker build -t ${PACKAGE}:${PACKAGE_VERSION} -f Dockerfile.client .
28+
cd .. && DOCKER_BUILDKIT=1 docker build -t ${PACKAGE}:${PACKAGE_VERSION} --build-arg DEBIAN_VER=${DEBIAN_VER} -f Dockerfile.client .
2629
docker tag ${PACKAGE}:${PACKAGE_VERSION} ${PACKAGE}:latest
2730

2831

@@ -42,21 +45,27 @@ debian-local:
4245
dpkg-buildpackage -us -uc -b
4346

4447
docker-deb:
45-
cd .. && DOCKER_BUILDKIT=1 docker build -t ${PACKAGE}:${PACKAGE_VERSION} --build-arg TARGET=deb -f Dockerfile.client .
48+
cd .. && DOCKER_BUILDKIT=1 docker build -t ${PACKAGE}:${PACKAGE_VERSION} --build-arg TARGET=deb --build-arg DEBIAN_VER=${DEBIAN_VER} -f Dockerfile.client .
4649
docker tag ${PACKAGE}:${PACKAGE_VERSION} ${PACKAGE}:deb
4750

48-
debian-docker: dist_deb/built.docker
51+
debian-docker: dist_deb/built.${DEBIAN_VER}.docker
4952

50-
dist_deb/built.docker: ${CLIENT_DEPS} ${DEB_DEPS} ../Dockerfile.client
53+
dist_deb/built.${DEBIAN_VER}.docker: ${CLIENT_DEPS} ${DEB_DEPS} ../Dockerfile.client
54+
@echo "Building client for Debian ${DEBIAN_VER}"
5155
@which jq || (echo "ERROR: Please install jq first." && exit 1)
52-
rm -rf dist_deb
5356
mkdir -p dist_deb
5457
$(MAKE) docker-deb
5558
$(eval PVER=$(shell jq -r '.version' package.json))
5659
test -n ${PVER}
5760
$(eval PKGDIR=${PACKAGE}-${PVER})
58-
$(eval CMD="mkdir -p /deb/ && cp -a /build /deb/${PKGDIR} && cd /deb/${PKGDIR}/client && make debian-local && mv /deb/${PKGDIR}/*.deb /deb/ && rm -rf /deb/${PKGDIR} && chown -R ${UID}:${GID} /deb")
59-
docker run --rm --mount type=bind,source="$$(pwd)/dist_deb",target="/deb" --user root ${PACKAGE}:deb bash -c ${CMD}
61+
docker run --rm --mount type=bind,source="$$(pwd)/dist_deb",target="/deb" --user root ${PACKAGE}:deb \
62+
bash -c "mkdir -p /deb/ && cp -a /build /deb/${PKGDIR} && cd /deb/${PKGDIR}/client && make debian-local && cp /deb/${PKGDIR}/*.deb /deb/ && rm -rf /deb/${PKGDIR} && chown -R ${UID}:${GID} /deb"
63+
@# Rename .deb files to include Debian version (skip if already contains it)
64+
for f in dist_deb/*.deb; do \
65+
case "$$f" in *_${DEBIAN_VER}_*) continue ;; esac; \
66+
newname=$$(echo "$$f" | sed -E 's/(_[0-9.]+-?[0-9]*_)/\1${DEBIAN_VER}_/'); \
67+
[ "$$f" != "$$newname" ] && mv "$$f" "$$newname" || true; \
68+
done
6069
touch $@
6170

6271
dev-local: npm-deps

client/debian/changelog

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
clapshot-client (0.9.2) bookworm; urgency=low
1+
clapshot-client (0.9.2) unstable; urgency=low
22

33
* New feature: Comment export to EDL, Premiere XML, CSV, SRT, and OTIO formats
44
* New export dialog UI in NavBar

organizer/basic_folders/Makefile

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ else
1111
PLATFORM_STR := --platform linux/$(TARGET_ARCH)
1212
endif
1313

14+
# Debian version and Python version (can be overridden via environment)
15+
DEBIAN_VER ?= bookworm
16+
ifeq ($(DEBIAN_VER),trixie)
17+
PYTHON_VER ?= python3.13
18+
else
19+
PYTHON_VER ?= python3.11
20+
endif
21+
1422
# Configurable paths and settings
1523
VENV := _venv
1624
PYTHON := $(VENV)/bin/python
@@ -21,10 +29,10 @@ PY_SRC := $(wildcard *.py) $(wildcard organizer/**/*.py) $(DEPS_SRC)
2129

2230
DEB_SRC := debian/* README* LICENSE* requirements.txt setup.py pyproject.toml
2331

24-
DOCKER_IMG_NAME := clapshot_org_basic_folders_${ARCH}
32+
DOCKER_IMG_NAME := clapshot_org_basic_folders_${DEBIAN_VER}_${ARCH}
2533
DEV_VERSION := $(shell git rev-parse --short HEAD || date +"%Y-%m-%d" || echo "dev")
2634

27-
PROTOLIB := clapshot_grpc-0.0.0+dev.tar.gz
35+
PROTOLIB := clapshot_grpc-0.0.0+dev-py3-none-any.whl
2836
TARGET_BIN := $(VENV)/bin/clapshot-organizer-basic-folders
2937

3038

@@ -73,7 +81,7 @@ docker:
7381
@echo "NOTE! Creating current user and UID/GID in Docker so bind mount is owned by it."
7482
@echo "Otherwise you wouldn't be able to access it without root privileges."
7583
@echo "-------------------------------------------------------------------------------"
76-
cd ../.. && DOCKER_BUILDKIT=1 docker build $(PLATFORM_STR) -t ${DOCKER_IMG_NAME}:${DEV_VERSION} --build-arg USER=${USER} --build-arg UID=${UID} --build-arg GID=${GID} -f Dockerfile.org-python .
84+
cd ../.. && DOCKER_BUILDKIT=1 docker build $(PLATFORM_STR) -t ${DOCKER_IMG_NAME}:${DEV_VERSION} --build-arg USER=${USER} --build-arg UID=${UID} --build-arg GID=${GID} --build-arg DEBIAN_VER=${DEBIAN_VER} --build-arg PYTHON_VER=${PYTHON_VER} -f Dockerfile.org-python .
7785
docker tag ${DOCKER_IMG_NAME}:${DEV_VERSION} ${DOCKER_IMG_NAME}:latest
7886

7987
dist_deb/built.${ARCH}.target: ${DEB_SRC} deps/$(PROTOLIB)
@@ -87,16 +95,25 @@ test-local: $(TARGET_BIN)
8795

8896
debian-local: dist_deb/built.${ARCH}.target
8997

90-
debian-docker: dist_deb/built.${ARCH}.docker
98+
debian-docker: dist_deb/built.${DEBIAN_VER}.${ARCH}.docker
9199

92-
dist_deb/built.${ARCH}.docker: ${PY_SRC} ${DEB_SRC} ../../Dockerfile.org-python
100+
dist_deb/built.${DEBIAN_VER}.${ARCH}.docker: ${PY_SRC} ${DEB_SRC} ../../Dockerfile.org-python
93101
@echo "-------------------------------------------------------------------------------"
102+
@echo "Building organizer for Debian ${DEBIAN_VER} (${ARCH}) with ${PYTHON_VER}"
94103
@echo "NOTE! Creating current user and UID/GID in Docker so bind mount is owned by it."
95104
@echo "Otherwise you wouldn't be able to access it without root privileges."
96105
@echo "-------------------------------------------------------------------------------"
97106
@mkdir -p dist_deb
98-
cd ../.. && DOCKER_BUILDKIT=1 docker build $(PLATFORM_STR) -t ${DOCKER_IMG_NAME}:${DEV_VERSION} --build-arg USER=${USER} --build-arg UID=${UID} --build-arg GID=${GID} -f Dockerfile.org-python .
107+
cd ../.. && DOCKER_BUILDKIT=1 docker build $(PLATFORM_STR) -t ${DOCKER_IMG_NAME}:${DEV_VERSION} --build-arg USER=${USER} --build-arg UID=${UID} --build-arg GID=${GID} --build-arg DEBIAN_VER=${DEBIAN_VER} --build-arg PYTHON_VER=${PYTHON_VER} -f Dockerfile.org-python .
99108
docker tag ${DOCKER_IMG_NAME}:${DEV_VERSION} ${DOCKER_IMG_NAME}:latest
100-
$(eval CMD="cd /build/organizer/basic_folders && cp -r --preserve=mode,ownership,timestamps /deb ./dist_deb && ls -l ./dist_deb && make debian-local && cp dist_deb/*.* /deb/ && chown -R ${UID}:${GID} /deb")
101-
docker run --rm --mount type=bind,source="$$(pwd)/dist_deb",target="/deb" --user root ${DOCKER_IMG_NAME}:latest bash -c ${CMD}
109+
docker run --rm $(PLATFORM_STR) --mount type=bind,source="$$(pwd)/dist_deb",target="/deb" --user root ${DOCKER_IMG_NAME}:latest \
110+
bash -c "cd /build/organizer/basic_folders && cp -r --preserve=mode,ownership,timestamps /deb ./dist_deb && \
111+
sed -i 's/python3\\.11/${PYTHON_VER}/g' debian/control && \
112+
PYTHON_VER=${PYTHON_VER} make debian-local && cp dist_deb/*.deb /deb/ && chown -R ${UID}:${GID} /deb"
113+
@# Rename .deb files to include Debian version (skip if already contains it)
114+
for f in dist_deb/*.deb; do \
115+
case "$$f" in *_${DEBIAN_VER}_*) continue ;; esac; \
116+
newname=$$(echo "$$f" | sed -E 's/(_[0-9.]+-?[0-9]*_)/\1${DEBIAN_VER}_/'); \
117+
[ "$$f" != "$$newname" ] && mv "$$f" "$$newname" || true; \
118+
done
102119
touch $@

organizer/basic_folders/debian/changelog

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
clapshot-organizer-basic-folders (0.9.2) bookworm; urgency=low
1+
clapshot-organizer-basic-folders (0.9.2) unstable; urgency=low
22

33
* (Follow client and server versioning)
44

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#!/usr/bin/make -f
22

3+
# Python version can be overridden via environment (default: python3.11 for bookworm)
4+
PYTHON_VER ?= python3.11
5+
36
%:
47
dh $@ --with python-virtualenv
58

69
override_dh_virtualenv:
7-
dh_virtualenv --builtin-venv --python python3.11 \
8-
--preinstall deps/clapshot_grpc-0.0.0+dev.tar.gz \
9-
--extra-pip-arg --no-build-isolation
10+
dh_virtualenv --builtin-venv --python $(PYTHON_VER) \
11+
--preinstall deps/clapshot_grpc-0.0.0+dev-py3-none-any.whl

protobuf/libs/python/Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
PACKAGE_NAME := clapshot_grpc
22
PACKAGE_VERSION := 0.0.0+dev
33

4-
TARGET_FILE := dist/$(PACKAGE_NAME)-$(PACKAGE_VERSION).tar.gz
4+
TARGET_FILE := dist/$(PACKAGE_NAME)-$(PACKAGE_VERSION)-py3-none-any.whl
55

66
VENV := _venv
77
PYTHON := $(VENV)/bin/python
@@ -21,9 +21,9 @@ PY_SRC := $(wildcard *.py) $(wildcard src/**/*.py) $(wildcard ../../protobuf/pro
2121
$(TARGET_FILE): $(PY_SRC) $(VENV) $(MYPY) $(GENERATED_DIR)/__init__.py
2222
$(MYPY) src --no-strict-optional
2323
$(PYTHON) -m pip install build
24-
$(PYTHON) -m build --sdist
24+
$(PYTHON) -m build --wheel
2525
@echo "------- Build complete -------"
26-
@echo "pip install dist/$(PACKAGE_NAME)-$(PACKAGE_VERSION).tar.gz"
26+
@echo "pip install $(TARGET_FILE)"
2727

2828
package: $(TARGET_FILE)
2929

0 commit comments

Comments
 (0)