Feel++ APT Repository Publisher
Repository URL: https://feelpp.github.io/apt/
Public key: feelpp.gpg
This repository contains the feelpp-aptly-publisher tool for publishing Debian packages to the Feel++ APT repository using aptly and GitHub Pages, with full support for multi-component publications.
Table of Contents
Repository Structure
The APT repository is organized as follows:
-
Channels (prefixes):
stable/,testing/,pr/stable: Production-ready packagestesting: Pre-release packages for testingpr: Pull request builds for CI/CD
-
Distributions:
noble,jammy,focal,bookworm,bullseye, etc.- Ubuntu codenames (noble = 24.04, jammy = 22.04, etc.)
- Debian codenames (bookworm = 12, bullseye = 11, etc.)
-
Components (projects): Independent project namespaces
- Examples:
feelpp-project,mmg,parmmg,ktirio-urban-building,organ-on-chip - Each component can have multiple packages
- Components are isolated - updates to one don't affect others
- Examples:
Client Setup
Add the Feel++ APT repository to your system:
# Download and install the GPG key
curl -fsSL https://feelpp.github.io/apt/feelpp.gpg \
| sudo tee /usr/share/keyrings/feelpp.gpg >/dev/null
# Add the repository (example: stable channel, noble distribution, multiple components)
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/feelpp.gpg] \
https://feelpp.github.io/apt/stable noble mmg parmmg" \
| sudo tee /etc/apt/sources.list.d/feelpp-mmg.list
# Update package lists
sudo apt update
# Install packages
sudo apt install mmg libmmg5 libmmg-dev parmmg libparmmg5 libparmmg-dev
Note: Specify the components you need in the sources.list line. Available components can be found in the Release file.
Publishing Packages
Quick Start
- Install the publisher tool:
pip install feelpp-aptly-publisher
# or for development:
pip install -e .
- Build your Debian packages:
# Your package building process, e.g.:
dpkg-buildpackage -us -uc -b
- Publish to the repository:
feelpp-apt-publish \
--component my-project \
--channel stable \
--distro noble \
--debs /path/to/directory/with/debs
That's it! Your packages are now available at:
https://feelpp.github.io/apt/stable/dists/noble/my-project/
Publishing to Different Channels
Stable (production releases):
feelpp-apt-publish --component mmg --channel stable --distro noble --debs ./debs/
Testing (pre-release testing):
feelpp-apt-publish --component mmg --channel testing --distro noble --debs ./debs/
PR (continuous integration):
feelpp-apt-publish --component mmg --channel pr --distro noble --debs ./debs/
Multi-Component Support
The publisher automatically preserves existing components when adding or updating a component. You don't need to do anything special!
Example scenario:
- Initial state: Repository has
component-aandcomponent-b - You publish
component-c:feelpp-apt-publish --component component-c --channel stable --distro noble --debs ./debs/
- Result: Repository now has
component-a,component-b, andcomponent-c
Updating an existing component:
# This will update component-a while preserving component-b and component-c
feelpp-apt-publish --component component-a --channel stable --distro noble --debs ./new-debs/
How it works:
- The publisher reads the current Release file to detect existing components
- It creates temporary repositories for existing components from the pool
- It publishes all components together using aptly's multi-component support
- Both Release and InRelease files are updated consistently
Command-Line Options
feelpp-apt-publish --help
Required options:
--component NAME: Component (project) name (will be normalized:My_Project→my-project)--distro NAME: Distribution codename (e.g.,noble,jammy,bookworm)
Optional options:
--channel NAME: Publication channel (default:stable, options:stable,testing,pr)--debs PATH: Directory containing .deb files (default: current directory)--pages-repo URL: GitHub Pages repository (default:https://github.com/feelpp/apt.git)--branch NAME: Git branch name (default:gh-pages)--sign: Enable GPG signing (default: disabled)--keyid ID: GPG key ID (required if --sign is used)--verbose: Enable verbose logging
Examples:
# Minimal example (uses defaults: stable channel, skip signing)
feelpp-apt-publish --component mmg --distro noble --debs ./debs/
# Full example with all options
feelpp-apt-publish \
--component my-project \
--distro noble \
--channel testing \
--debs /tmp/my-debs \
--verbose
# With GPG signing
feelpp-apt-publish \
--component mmg \
--distro noble \
--sign \
--keyid ABCD1234 \
--debs ./debs/
Installation
From PyPI (when published)
pip install feelpp-aptly-publisher
From Source
git clone https://github.com/feelpp/apt.git
cd apt
pip install -e .
Development Setup
# Install with development dependencies
pip install -e ".[dev]"
# Or using the setup script
./setup-dev.sh
Development
Running Tests
# Run all tests
pytest
# Run only unit tests (fast)
pytest -m "not integration"
# Run integration tests (slower, tests actual publishing)
pytest -m integration
# Run with coverage
pytest --cov=feelpp_aptly_publisher --cov-report=html
Code Quality
# Format code
black src/ tests/
# Lint
flake8 src/ tests/
# Type checking
mypy src/
Testing
The repository includes comprehensive tests:
-
Unit tests (
tests/test_*.py): Fast tests for individual components- CLI argument parsing
- Component name normalization
- Publisher initialization
-
Integration tests (
tests/test_integration.py): Full workflow tests- Single component publishing
- Multi-component publishing (adding components)
- Updating existing components
- All three channels (stable, testing, pr)
- Channel independence
- Release/InRelease file consistency
Run the test suite:
# All tests
pytest -v
# Only integration tests
pytest -v -m integration
# Only unit tests (fast)
pytest -v -m "not integration"
Troubleshooting
Components Not Listed in InRelease
Problem: After publishing, packages install correctly but InRelease file doesn't list all components.
Solution: This was a bug in earlier versions. Update to feelpp-aptly-publisher >= 1.1.0 which fixes multi-component support.
Existing Components Lost After Publishing
Problem: Publishing a new component removes existing components from the repository.
Solution: Upgrade to version >= 1.1.0. The new version automatically detects and preserves all existing components.
Package Not Found After Publishing
Problem: Published package but apt update doesn't see it.
Checklist:
- Check that the component is listed in your sources.list
- Verify the component appears in the Release file:
curl -s https://feelpp.github.io/apt/stable/dists/noble/Release | grep Components
- Check that packages exist:
curl -s https://feelpp.github.io/apt/stable/dists/noble/COMPONENT/binary-amd64/Packages
- Wait a few minutes for GitHub Pages to update (caching)
Contributing
See CONTRIBUTING.md for development guidelines.
License
LGPL-3.0-or-later - see COPYING.LESSER
Authors
Feel++ Packaging Team contact@feelpp.org
Repository: https://github.com/feelpp/apt
Feel++ Project: https://www.feelpp.org
Metadata
Release files for feelpp-aptly-publisher 1.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| feelpp_aptly_publisher-1.2.1.tar.gz | 21.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| feelpp_aptly_publisher-1.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 34.4 kB
Release files / feelpp_aptly_publisher-1.2.1.tar.gz
| Download URL | feelpp_aptly_publisher-1.2.1.tar.gz |
|---|---|
| Size | 21.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4a1574fb570b5ae95461507cb2e7c0a5f3cefb7dbb0701749fe88b6cb8055915
|
|
BLAKE2b-256 checksum How to use checksums |
b0afa10e457abce8ea87b2e68b80140654853c348f71ee9c7e2421b0a31097c0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2025.
Transparency logRelease files / feelpp_aptly_publisher-1.2.1-py3-none-any.whl
| Download URL | feelpp_aptly_publisher-1.2.1-py3-none-any.whl |
|---|---|
| Size | 13.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d7c3812e069adb9b8aef0deed9dcf6e2b80c478a9ad29d18f44977eb8c04e73a
|
|
BLAKE2b-256 checksum How to use checksums |
86b372c8e9306284e12bd2975f517257a141fded1d4dbb3855c71f417a12b64b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2025.
Transparency log