Skip to main content

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 packages
    • testing: Pre-release packages for testing
    • pr: 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

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

  1. Install the publisher tool:
pip install feelpp-aptly-publisher
# or for development:
pip install -e .
  1. Build your Debian packages:
# Your package building process, e.g.:
dpkg-buildpackage -us -uc -b
  1. 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:

  1. Initial state: Repository has component-a and component-b
  2. You publish component-c:
    feelpp-apt-publish --component component-c --channel stable --distro noble --debs ./debs/
    
  3. Result: Repository now has component-a, component-b, and component-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:

  1. Check that the component is listed in your sources.list
  2. Verify the component appears in the Release file:
    curl -s https://feelpp.github.io/apt/stable/dists/noble/Release | grep Components
    
  3. Check that packages exist:
    curl -s https://feelpp.github.io/apt/stable/dists/noble/COMPONENT/binary-amd64/Packages
    
  4. 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)

Source distribution for feelpp-aptly-publisher 1.2.1
File Size Uploaded
feelpp_aptly_publisher-1.2.1.tar.gz 21.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for feelpp-aptly-publisher 1.2.1
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

1.2.1 This release

2 release files

1.2.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page