Package: python-aptly
============python-aptly============Aptly REST API client and useful toolingPublisher=========Publisher is tooling for easier maintenance of complex repository managementworkflows.This is how workflow can look like and what publisher can do for you:.. image:: ./doc/aptly-publisher.png:align: centerFeatures--------- Create or update publish from latest snapshots- it takes configuration in yaml format which defines what to publish andhow- expected snapshot format is ``<name>-<timestamp>``- Promote publish- use source publish snapshots to create or update another publish (eg.testing -> stable)- Cleanup unused snapshots- Purge publishes and repositories- Restore and dump publishes- Supports Python 3 (recommended) and Python 2Create or update publish~~~~~~~~~~~~~~~~~~~~~~~~First create configuration file where you define Aptly repositories, mirrorsand target distributions for publishing... code-block:: yamlmirror:# Ubuntu upstream repositorytrusty-main:# Base for our main componentcomponent: maindistributions:- nightly/trusty# Mirrored 3rd party repositoryaptly:# Merge into main componentcomponent: maindistributions:- nightly/trustyrepo:# Some repository with custom softwarecloudlab:# Publish as component cloudlabcomponent: cloudlab# Use swift storage named myswift for publish storagestorage: swift:myswiftdistributions:# We want to publish our packages (that can't break anything for# sure) immediately to both nightly and testing repositories- nightly/trusty- testing/trustyConfiguration above will create two publishes from latest snapshots ofdefined repositories and mirrors:- ``nightly/trusty`` with component cloudlab and main- creates snapshot ``_main-<timestamp>`` by merging snapshots``aptly-<timestamp>`` and ``trusty-main-<timestamp>``)- ``testing/trusty`` with component cloudlab, made of repository cloudlabIt expects that snapshots are already created (by mirror syncing script or byCI when new package is built) so it does following:- find latest snapshot (by creation date) for each defined mirror andrepository- snapshots are recognized by name (eg. ``cloudlab-<timestamp>``,``trusty-main-<timestamp>``)- create new snapshot by merging snapshots with same publish component- eg. create ``_main-<timestamp>`` from latest ``trusty-main-<timestamp>``and ``aptly-<timestamp>`` snapshots- merged snapshots are prefixed by ``_`` to avoid collisions with othersnapshots- first it checks if merged snapshots already exists and if so, it will skipcreation of duplicated snapshot. So it's tries to be fully idempotent.- create or update publish or publishes as defined in configurationIt can be executed like this:::aptly-publisher -c config.yaml -v --url http://localhost:8080 publishPromote publish~~~~~~~~~~~~~~~Let's assume you have following prefixes and workflow:- nightly- created by `publish` action when there's new snapshot or synced mirror- packages are always up to date- testing- freezed repository for testing and stabilization- stable- well tested package versions- well controlled update processThere can be more publishes under prefix, eg. ``nightly/trusty``,``nightly/vivid``Then you need to switch published snapshots from one publish to another one.::aptly-publisher -v --url http://localhost:8080  \--source nightly/trusty --target testing/trusty \publishYou can also specify list of components. When you have separate components foryour packages (eg. cloudlab) and security (mirror of trusty securityrepository), you may need to release them faster.::aptly-publisher -v --url http://localhost:8080  \--source nightly/trusty --target testing/trusty \--components cloudlab security -- publishFinally you are also able to promote selected packages, eg.::aptly-publisher -v --url http://localhost:8080  \--source nightly/trusty --target testing/trusty \--packages python-aptly aptly -- publishShow differences between publishes~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~You can see differences between publishes with following command:::aptly-publisher -v --url http://localhost:8080  \--source nightly/trusty --target testing/trusty \promote --diffExample output can look like this:.. image:: ./doc/publisher_diff_example.png:align: centerCleanup unused snapshots~~~~~~~~~~~~~~~~~~~~~~~~When you are creating snapshots regularly, you need to delete old ones thatare not used by any publish. It's wise to call such action every time whenpublish is updated (eg. nightly).::aptly-publisher -v --url http://localhost:8080 cleanupPurge unused packages from repo and publishes~~~~~~~~~~~~~~~~~~~~~~~~When you are uploading a lot version of the same package, you may want toget rid of old packages version in your snapshots.Be careful, the option ``--hard`` will remove the packages from your repos.::aptly-publisher -v --url http://localhost:8080 --component extra --hard purgeInstallation============You can install directly using from local checkout or from pip:::python3 setup.py installpip3 install python-aptlyOr better build Debian package with eg.:::dpkg-buildpackage -uc -usRead more=========For usage informations, see ``aptly-publisher --help`` or generate and viewman page.::PYTHONPATH=. help2man -n "aptly-publisher - tool for easy creation of Aptly multi component publishes" --version-string=$(grep version setup.py|cut -d '"' -f 2) "python3 aptly/publisher/__main__.py" | sed -e s,__main__.py,aptly-publisher,g -e s,__MAIN__.PY,APTLY-PUBLISHER,g > aptly-publisher.1man aptly-publisher.1Also see ``doc/examples`` directory.For examples of jenkins jobs, have a look at `tcpcloud/jenkins-jobs <https://github.com/tcpcloud/jenkins-jobs>`_ repository.Known issues============- determine source snapshots correctly(`#271 <https://github.com/smira/aptly/issues/271>`_)- cleanup merged snapshots before cleaning up source ones- before that it's needed to run cleanup action multiple times to get allunused snapshots cleaned