chore: add AppImage release packaging
This commit is contained in:
parent
331e65d948
commit
af7656145e
5 changed files with 87 additions and 17 deletions
28
README.md
28
README.md
|
|
@ -52,8 +52,6 @@ uv run scanslicer --backend x11
|
||||||
|
|
||||||
### Run with Python directly
|
### Run with Python directly
|
||||||
|
|
||||||
The package directory now matches the published name:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python -m scanslicer
|
python -m scanslicer
|
||||||
```
|
```
|
||||||
|
|
@ -110,8 +108,6 @@ Environment variable overrides:
|
||||||
- `SCANSLICER_FEEDBACK_PATH`
|
- `SCANSLICER_FEEDBACK_PATH`
|
||||||
- `SCANSLICER_STATUS_LOG_PATH`
|
- `SCANSLICER_STATUS_LOG_PATH`
|
||||||
|
|
||||||
Legacy override names are still accepted for backward compatibility.
|
|
||||||
|
|
||||||
## Docker Compose
|
## Docker Compose
|
||||||
|
|
||||||
The repo includes a GUI-oriented compose setup for Linux desktop use:
|
The repo includes a GUI-oriented compose setup for Linux desktop use:
|
||||||
|
|
@ -133,21 +129,21 @@ Detailed instructions: `docs/appimage.md`.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
- `docs/README.md` - documentation index
|
- `docs/README.md` - documentation index
|
||||||
- `docs/user-guide.md` - end-user operation guide
|
- `docs/user-guide.md` - end-user operation guide
|
||||||
- `docs/architecture.md` - code architecture and execution flow
|
- `docs/architecture.md` - code architecture and execution flow
|
||||||
- `docs/parameters.md` - full detection parameter reference
|
- `docs/parameters.md` - full detection parameter reference
|
||||||
- `docs/autotune.md` - auto-tune and feedback internals
|
- `docs/autotune.md` - auto-tune and feedback internals
|
||||||
- `docs/runtime-config.md` - backend/environment and persistence paths
|
- `docs/runtime-config.md` - backend/environment and persistence paths
|
||||||
- `docs/appimage.md` - AppImage packaging details
|
- `docs/appimage.md` - AppImage packaging details
|
||||||
- `docs/development.md` - contributor-focused architecture/workflow notes
|
- `docs/development.md` - contributor-focused architecture/workflow notes
|
||||||
|
|
||||||
## Repository Layout
|
## Repository Layout
|
||||||
|
|
||||||
```text
|
```text
|
||||||
scanslicer/ Application source (UI, controllers, canvas, detection)
|
scanslicer/ - Application source (UI, controllers, canvas, detection)
|
||||||
packaging/appimage/ AppImage recipe and build scripts
|
packaging/appimage/ - AppImage recipe and build scripts
|
||||||
Dockerfile Runtime image
|
Dockerfile - Runtime image
|
||||||
docker-compose.yml GUI container runtime wiring
|
docker-compose.yml - GUI container runtime wiring
|
||||||
pyproject.toml Python package metadata and dependencies
|
pyproject.toml - Python package metadata and dependencies
|
||||||
```
|
```
|
||||||
|
|
|
||||||
44
THIRD_PARTY_NOTICES
Normal file
44
THIRD_PARTY_NOTICES
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
ScanSlicer AppImage Third-Party Notices
|
||||||
|
======================================
|
||||||
|
|
||||||
|
This AppImage bundles ScanSlicer together with third-party software.
|
||||||
|
Those components remain under their own licenses.
|
||||||
|
|
||||||
|
The Python package set is resolved from the committed `uv.lock` file at
|
||||||
|
build time. The versions listed below reflect the versions pinned in this
|
||||||
|
repository at the time this notice was generated.
|
||||||
|
|
||||||
|
Python packages bundled by the AppImage build:
|
||||||
|
|
||||||
|
- PySide6 6.10.2
|
||||||
|
License metadata: LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
|
||||||
|
- PySide6-Addons 6.10.2
|
||||||
|
Distributed as part of the PySide6 runtime stack. See the PySide6 and Qt
|
||||||
|
license materials bundled with the wheel metadata for the exact terms.
|
||||||
|
- PySide6-Essentials 6.10.2
|
||||||
|
Distributed as part of the PySide6 runtime stack. See the PySide6 and Qt
|
||||||
|
license materials bundled with the wheel metadata for the exact terms.
|
||||||
|
- shiboken6 6.10.2
|
||||||
|
License metadata: LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
|
||||||
|
- numpy 2.4.2 (Python 3.11+) or 2.2.6 (Python < 3.11)
|
||||||
|
License metadata (installed Python 3.11 build): BSD-3-Clause AND 0BSD AND
|
||||||
|
MIT AND Zlib AND CC0-1.0
|
||||||
|
- Pillow 12.1.1
|
||||||
|
License metadata: MIT-CMU
|
||||||
|
- opencv-python 4.13.0.92
|
||||||
|
This package is installed from PyPI according to `uv.lock`. Consult the
|
||||||
|
package's bundled metadata and license files in the installed wheel for the
|
||||||
|
exact terms that apply to the shipped build.
|
||||||
|
|
||||||
|
System packages bundled by the AppImage:
|
||||||
|
|
||||||
|
- The AppImage also includes selected Ubuntu Noble runtime libraries and the
|
||||||
|
CPython runtime as listed in `packaging/appimage/AppImageBuilder.yml`.
|
||||||
|
Those components remain under their respective upstream and distribution
|
||||||
|
licenses.
|
||||||
|
|
||||||
|
Release hygiene:
|
||||||
|
|
||||||
|
- Keep this file aligned with `uv.lock` when dependency versions change.
|
||||||
|
- Publish the corresponding source code for the exact AppImage build you ship.
|
||||||
|
- Include the project `LICENSE` file alongside this notice.
|
||||||
|
|
@ -8,6 +8,8 @@ ScanSlicer includes a full AppImage packaging workflow under `packaging/appimage
|
||||||
- `packaging/appimage/build-appimage.sh`: local build script
|
- `packaging/appimage/build-appimage.sh`: local build script
|
||||||
- `packaging/appimage/build-appimage-docker.sh`: containerized build wrapper
|
- `packaging/appimage/build-appimage-docker.sh`: containerized build wrapper
|
||||||
- `packaging/appimage/Dockerfile`: AppImage build environment
|
- `packaging/appimage/Dockerfile`: AppImage build environment
|
||||||
|
- `LICENSE`: project GPLv3 license bundled with AppImage releases
|
||||||
|
- `THIRD_PARTY_NOTICES`: bundled dependency notice file for AppImage releases
|
||||||
- desktop entry file in `packaging/appimage/`
|
- desktop entry file in `packaging/appimage/`
|
||||||
- application icon file in `packaging/appimage/`
|
- application icon file in `packaging/appimage/`
|
||||||
|
|
||||||
|
|
@ -42,6 +44,9 @@ Prerequisite:
|
||||||
|
|
||||||
- Docker
|
- Docker
|
||||||
|
|
||||||
|
The Docker build image pins a specific `appimage-builder` version so release
|
||||||
|
builds use a stable packaging toolchain.
|
||||||
|
|
||||||
Command:
|
Command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|
@ -68,6 +73,7 @@ Optional environment variables:
|
||||||
- Removes bundled Qt system libs to prefer PySide wheel Qt runtime
|
- Removes bundled Qt system libs to prefer PySide wheel Qt runtime
|
||||||
- Installs Python dependencies and project wheel into AppDir `/usr`
|
- Installs Python dependencies and project wheel into AppDir `/usr`
|
||||||
- Injects desktop entry and icon assets during `after_bundle`
|
- Injects desktop entry and icon assets during `after_bundle`
|
||||||
|
- Copies `LICENSE` and `THIRD_PARTY_NOTICES` into `usr/share/doc/scanslicer/`
|
||||||
|
|
||||||
Runtime environment variables set in AppDir include:
|
Runtime environment variables set in AppDir include:
|
||||||
|
|
||||||
|
|
@ -84,3 +90,20 @@ Expected output artifact location:
|
||||||
- `appimage/dist/ScanSlicer-<version>-x86_64.AppImage`
|
- `appimage/dist/ScanSlicer-<version>-x86_64.AppImage`
|
||||||
|
|
||||||
Intermediate build files are kept under `appimage/build/`.
|
Intermediate build files are kept under `appimage/build/`.
|
||||||
|
|
||||||
|
## Release Checklist
|
||||||
|
|
||||||
|
Before publishing an AppImage:
|
||||||
|
|
||||||
|
1. Build from a committed state that has a matching source tag or commit you
|
||||||
|
will publish.
|
||||||
|
2. Verify `uv.lock` is committed so the bundled Python dependency set is
|
||||||
|
reproducible from source.
|
||||||
|
3. Confirm the AppImage contains `usr/share/doc/scanslicer/LICENSE` and
|
||||||
|
`usr/share/doc/scanslicer/THIRD_PARTY_NOTICES`.
|
||||||
|
4. Publish the AppImage together with the corresponding source code for that
|
||||||
|
exact release.
|
||||||
|
5. Review `THIRD_PARTY_NOTICES` whenever dependency versions change, especially
|
||||||
|
the PySide6 / Qt runtime stack.
|
||||||
|
6. If you change the pinned `appimage-builder` version, rerun a full AppImage
|
||||||
|
smoke test before publishing.
|
||||||
|
|
|
||||||
|
|
@ -66,11 +66,14 @@ AppDir:
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
mkdir -p "${APPDIR_PATH}/usr/share/applications"
|
mkdir -p "${APPDIR_PATH}/usr/share/applications"
|
||||||
|
mkdir -p "${APPDIR_PATH}/usr/share/doc/scanslicer"
|
||||||
mkdir -p "${APPDIR_PATH}/usr/share/icons"
|
mkdir -p "${APPDIR_PATH}/usr/share/icons"
|
||||||
mkdir -p "${APPDIR_PATH}/usr/share/pixmaps"
|
mkdir -p "${APPDIR_PATH}/usr/share/pixmaps"
|
||||||
mkdir -p "${APPDIR_PATH}/icons"
|
mkdir -p "${APPDIR_PATH}/icons"
|
||||||
mkdir -p "${APPDIR_PATH}/pixmaps"
|
mkdir -p "${APPDIR_PATH}/pixmaps"
|
||||||
cp "${SCANSLICER_ROOT}/packaging/appimage/scanslicer.desktop" "${APPDIR_PATH}/usr/share/applications/scanslicer.desktop"
|
cp "${SCANSLICER_ROOT}/packaging/appimage/scanslicer.desktop" "${APPDIR_PATH}/usr/share/applications/scanslicer.desktop"
|
||||||
|
cp "${SCANSLICER_ROOT}/LICENSE" "${APPDIR_PATH}/usr/share/doc/scanslicer/LICENSE"
|
||||||
|
cp "${SCANSLICER_ROOT}/THIRD_PARTY_NOTICES" "${APPDIR_PATH}/usr/share/doc/scanslicer/THIRD_PARTY_NOTICES"
|
||||||
cp "${SCANSLICER_ROOT}/packaging/appimage/scanslicer.svg" "${APPDIR_PATH}/usr/share/icons/scanslicer.svg"
|
cp "${SCANSLICER_ROOT}/packaging/appimage/scanslicer.svg" "${APPDIR_PATH}/usr/share/icons/scanslicer.svg"
|
||||||
cp "${SCANSLICER_ROOT}/packaging/appimage/scanslicer.svg" "${APPDIR_PATH}/usr/share/pixmaps/scanslicer.svg"
|
cp "${SCANSLICER_ROOT}/packaging/appimage/scanslicer.svg" "${APPDIR_PATH}/usr/share/pixmaps/scanslicer.svg"
|
||||||
rsvg-convert -w 256 -h 256 "${SCANSLICER_ROOT}/packaging/appimage/scanslicer.svg" > "${APPDIR_PATH}/usr/share/icons/scanslicer.png"
|
rsvg-convert -w 256 -h 256 "${SCANSLICER_ROOT}/packaging/appimage/scanslicer.svg" > "${APPDIR_PATH}/usr/share/icons/scanslicer.png"
|
||||||
|
|
@ -80,6 +83,8 @@ AppDir:
|
||||||
cp "${APPDIR_PATH}/usr/share/icons/scanslicer.png" "${APPDIR_PATH}/.DirIcon"
|
cp "${APPDIR_PATH}/usr/share/icons/scanslicer.png" "${APPDIR_PATH}/.DirIcon"
|
||||||
test -f "${APPDIR_PATH}/usr/share/icons/scanslicer.png"
|
test -f "${APPDIR_PATH}/usr/share/icons/scanslicer.png"
|
||||||
test -f "${APPDIR_PATH}/usr/share/pixmaps/scanslicer.png"
|
test -f "${APPDIR_PATH}/usr/share/pixmaps/scanslicer.png"
|
||||||
|
test -f "${APPDIR_PATH}/usr/share/doc/scanslicer/LICENSE"
|
||||||
|
test -f "${APPDIR_PATH}/usr/share/doc/scanslicer/THIRD_PARTY_NOTICES"
|
||||||
test -f "${APPDIR_PATH}/icons/scanslicer.png"
|
test -f "${APPDIR_PATH}/icons/scanslicer.png"
|
||||||
test -f "${APPDIR_PATH}/pixmaps/scanslicer.png"
|
test -f "${APPDIR_PATH}/pixmaps/scanslicer.png"
|
||||||
test -f "${APPDIR_PATH}/.DirIcon"
|
test -f "${APPDIR_PATH}/.DirIcon"
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ FROM ubuntu:24.04
|
||||||
|
|
||||||
COPY --from=ghcr.io/astral-sh/uv:0.10.2 /uv /uvx /usr/local/bin/
|
COPY --from=ghcr.io/astral-sh/uv:0.10.2 /uv /uvx /usr/local/bin/
|
||||||
|
|
||||||
|
ARG APPIMAGE_BUILDER_VERSION=1.1.0
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive \
|
ENV DEBIAN_FRONTEND=noninteractive \
|
||||||
PYTHONDONTWRITEBYTECODE=1 \
|
PYTHONDONTWRITEBYTECODE=1 \
|
||||||
PYTHONUNBUFFERED=1
|
PYTHONUNBUFFERED=1
|
||||||
|
|
@ -29,6 +31,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
|
||||||
RUN python3 -m pip install --no-cache-dir --break-system-packages \
|
RUN python3 -m pip install --no-cache-dir --break-system-packages \
|
||||||
"packaging<21" \
|
"packaging<21" \
|
||||||
appimage-builder
|
"appimage-builder==${APPIMAGE_BUILDER_VERSION}"
|
||||||
|
|
||||||
WORKDIR /work
|
WORKDIR /work
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue