Tool to publish Debian packages to Feel++ APT repository via aptly and GitHub Pages
Project description
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file feelpp_aptly_publisher-1.2.0.tar.gz.
File metadata
- Download URL: feelpp_aptly_publisher-1.2.0.tar.gz
- Upload date:
- Size: 18.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f98147c82663f51be77c484d0f80ed8eeb7938515d1504b8723a3c946953895a
|
|
| MD5 |
3d1317e0abc7fe57b32fd727f5e91d96
|
|
| BLAKE2b-256 |
66f8a7f84d9d19dab20a14f95a215f12c434d8694ef7c87996ab57f919859f84
|
Provenance
The following attestation bundles were made for feelpp_aptly_publisher-1.2.0.tar.gz:
Publisher:
publish.yml on feelpp/apt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
feelpp_aptly_publisher-1.2.0.tar.gz -
Subject digest:
f98147c82663f51be77c484d0f80ed8eeb7938515d1504b8723a3c946953895a - Sigstore transparency entry: 601107819
- Sigstore integration time:
-
Permalink:
feelpp/apt@baaa2fd0bc41cb24688740eb0aa816cfe3d3f883 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/feelpp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@baaa2fd0bc41cb24688740eb0aa816cfe3d3f883 -
Trigger Event:
release
-
Statement type:
File details
Details for the file feelpp_aptly_publisher-1.2.0-py3-none-any.whl.
File metadata
- Download URL: feelpp_aptly_publisher-1.2.0-py3-none-any.whl
- Upload date:
- Size: 12.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4652904cdfa792ae7c02831e01e71ee3feea619f05b362c59a0405d64b27e99a
|
|
| MD5 |
f16bfea850c31c9ef98062a7fbe38f35
|
|
| BLAKE2b-256 |
47e2a1c8e3776e04932d32b590c17e72f0303304782678ae829a77be321c9857
|
Provenance
The following attestation bundles were made for feelpp_aptly_publisher-1.2.0-py3-none-any.whl:
Publisher:
publish.yml on feelpp/apt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
feelpp_aptly_publisher-1.2.0-py3-none-any.whl -
Subject digest:
4652904cdfa792ae7c02831e01e71ee3feea619f05b362c59a0405d64b27e99a - Sigstore transparency entry: 601107820
- Sigstore integration time:
-
Permalink:
feelpp/apt@baaa2fd0bc41cb24688740eb0aa816cfe3d3f883 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/feelpp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@baaa2fd0bc41cb24688740eb0aa816cfe3d3f883 -
Trigger Event:
release
-
Statement type: