.. _release-history:

===============
Release history
===============

.. towncrier release notes start

.. _release-0.14.10:

debusine 0.14.10 (2026-06-22)
-----------------------------

Server
~~~~~~

Features
^^^^^^^^

- Add a ``restricted`` flag to workflow templates; if this is true, only
  workspace owners (as opposed to contributors) can start workflow instances
  from that template. (:issue:`634`)
- Add external user tokens. (:issue:`1392`)
- Add collection token grants, which can grant external user tokens the ability
  to view specific private collections. (:issue:`1392`)
- Add an API to manage collection token grants. (:issue:`1392`)
- Add roles for collections. (:issue:`1392`)


Bug Fixes
^^^^^^^^^

- Delay notifying the worker that a work request is available, until the
  transaction has committed. (:issue:`1030`)
- If a worker presents an invalid activation token, don't provision a new
  (disabled) worker for it. Activation tokens are primarily used in worker
  pools and we'd rather just let the provisioner shut down any unexpectedly
  provisioned pool members. (:issue:`1429`)
- Retry transactions in ``debusine-admin delete_expired``. (:issue:`1446`)
- ``debusine-admin vacuum_storage``: Delete ``FileUpload`` rows corresponding
  to ``FileInArtifact`` rows that have already been marked as complete.
  (:issue:`1448`)
- Delete any leftover ``FileUpload`` rows when returning a shortcut response to
  a file upload attempt for a file that is already complete. (:issue:`1448`)
- Gracefully handle empty (0-byte) artifact file block uploads. (:issue:`1448`)
- Gracefully ignore missing orphan files during ``vacuum-storage`` cleanup.
  (:issue:`1478`)
- Set gunicorn and Celery defaults to keep memory leaks under control.
  (:issue:`1493`)
- Revive completed workflows, if needed, when retrying sub-workflows.
  (:issue:`1496`)
- ``debusine-admin worker create``: Add a transaction to fix occasional
  failures. (:issue:`1503`)
- Avoid truncating workflow template validation errors when launching
  workflows.


Web UI
~~~~~~

Features
^^^^^^^^

- Enforce per-collection display permissions in archive views.  This includes
  accepting external user tokens with suitable grants. (:issue:`1392`)


Client
~~~~~~

Features
^^^^^^^^

- ``debusine workflow-template``: Allow setting the ``restricted`` flag.
  (:issue:`634`)
- Add ``debusine archive token {grant,list,revoke}`` commands. (:issue:`1392`)
- Command ``collection show {name}@{category}`` shows the collection Web URL.
  (:issue:`1434`)
- The Debusine client is now available in a :ref:`OCI image
  <debusine-oci-images>`. (:issue:`1474`)


Bug Fixes
^^^^^^^^^

- Increase the number of retries in file uploads, and retry for 500 series
  responses. (:issue:`1448`)
- Rewind file handle to the correct start position when retrying a file upload
  chunk. (:issue:`1448`)


Tasks
~~~~~

Features
^^^^^^^^

- :task:`Sbuild`: Extract debug symbols from ``-dbgsym`` binary packages into
  ``DebugSymbols`` artifacts. (:issue:`957`)
- :task:`SystemBootstrap`: Add ``gpgv_command`` option to ``bootstrap_options``
  to allow bootstrapping older releases that rely on SHA1 signatures with
  ``gpgv``. (:issue:`1340`)


Worker
~~~~~~

Features
^^^^^^^^

- Support an ``Environment`` section in the worker configuration file for
  setting environment variables in tasks. (:issue:`1464`)


Bug Fixes
^^^^^^^^^

- Set ``TMPDIR`` within the worker's working directory when executing tasks.
  (:issue:`1464`)
- Execute tasks under a minimal environment (only ``PATH``). (:issue:`1464`)


General
~~~~~~~

Documentation
^^^^^^^^^^^^^

- Document how to run integration tests locally.


.. _release-0.14.9:

debusine 0.14.9 (2026-06-02)
----------------------------

This release includes a couple of security improvements to Debusine.

Server
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Migrated from the Prometheus client's `multiprocess mode
  <https://prometheus.github.io/client_python/multiprocess/>`_ that uses
  on-disk database files to a Redis-backed implementation.

  The Redis database location is configured with ``PROMETHEUS_REDIS_URL``
  in settings. By default we will use database 1 on ``localhost`` for
  these metrics. It should be a separate Redis database to Celery.
  (:issue:`1406`)


Features
^^^^^^^^

- In signon configuration, ``add_to_group`` can now use workspace-specific
  group names, like ``scope/workspace/name``. (:issue:`634`)
- ``WorkflowTemplate`` instances can now be configured to grant any number of
  extra groups.

  When evaluating permissions for a work request, extra groups granted by
  workflow templates in the root workflow will be in effect. (:issue:`634`)
- :collection:`debian:suite`: Make adding artifacts with the same name and data
  idempotent: if the same artifact is already present in the suite, it is no
  longer an error. (:issue:`1113`)
- Allow workspace owners to start workflows directly, without a template.
  (:issue:`1221`)
- AuthorizationMiddleware: reduce token last_seen_at updates: update only if
  older than 5 minutes. (:issue:`1460`)


Bug Fixes
^^^^^^^^^

- When retrying a work request, recursively retry workflow callbacks that
  depend on it. (:issue:`1412`)


Web UI
~~~~~~

Features
^^^^^^^^

- Worker list: show workers seen within the token update interval (5 minutes)
  as seen "less than 5 minutes ago". (:issue:`1460`)
- Collection detail: display suite targeting information. (:issue:`1475`)


Bug Fixes
^^^^^^^^^

- Improved autopkgtest log parsing to highlight testbed setup failures in the
  web UI. (:issue:`1233`)
- Show the correct title and breadcrumbs for suite archive views.
  Improve the formatting of Debian suite archive root pages. (:issue:`1468`)


Client
~~~~~~

Features
^^^^^^^^

- Allow setting extra groups when configuring workflow templates in debusine
  client. (:issue:`634`)
- Lookup utilities in the ``debusine collection`` command line client.
  (:issue:`691`)
- ``debusine workflow start``: Add ``--no-template`` option to start workflows
  directly, without a template; this may only be used by workspace owners.
  (:issue:`1221`)
- CLI output of "create artifact" command: show FQDN artifact URL instead of
  only the path.


Workflows
~~~~~~~~~

Features
^^^^^^^^

- Make all regression-analysis callbacks incremental, substantially reducing
  the number of work requests we need to create for large regression-tracking
  workflows. (:issue:`1412`)


Tasks
~~~~~

Bug Fixes
^^^^^^^^^

- SECURITY: Reject checksum filenames in ``.dsc`` and ``.changes`` files
  that contain multiple path components. (:issue:`1484`,
  :cve:`2026-11853`)


.. _release-0.14.8:

debusine 0.14.8 (2026-05-25)
----------------------------

This release contains backwards-incompatible API changes in the
server-worker communication. Older workers will be unable to start or
complete existing tasks until they have been upgraded. We recommend
flushing all pending tasks before upgrading debusine to 0.14.8.

Server
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Enforce stricter artifact-related permissions for work request tokens.
  (:issue:`523`)
- Work request tokens are now unable to access any work request besides the one
  associated with the token. (:issue:`523`)
- Disallow worker tokens in most places in favour of work request tokens.
  (:issue:`523`)
- Restrict artifact creation to registered categories. Unknown categories are
  now rejected instead of being accepted without validation. (:issue:`1390`)
- Use ``POST`` for ``/api/1.0/work-request/get-next-for-worker/``, rather than
  ``GET``. (:issue:`1398`)
- :ref:`OpenMetrics <reference-metrics>`: Deprecate ``token``, ``user`` and
  ``worker`` labels, replacing with ``token_type``.
- Work requests running on external workers are now restricted to writes to the
  same workspace.
- ``/api/1.0/open-metrics`` no longer emits ``host_architecture`` labels.
  Please use ``build_architecture`` instead.


Features
^^^^^^^^

- Include links to ``created_by`` and ``aborted_by`` in work request API
  responses. (:issue:`1157`)
- Include ``parent`` and ``workflow_root`` in work request API responses.
  (:issue:`1157`)
- Add an ``observer`` role on scopes, which implies the ``viewer`` role on all
  the scope's workspaces. (:issue:`1292`)
- Add ``error_on_empty`` option to dictionary lookups, to indicate that a
  lookup must match at least one item. (:issue:`1301`)
- Accept the ``__in`` suffix to ``name`` and ``data__KEY`` matchers in
  dictionary lookups. (:issue:`1301`)
- Add SSO Provider ``AzureEntraProvider`` to simplify configuring Azure Entra.
  (:issue:`1450`)
- SSO: Implement the ``email_verified`` and ``group:*`` restrictions for all
  OIDC providers, not just GitLab. (:issue:`1450`)
- SSO: Implement the ``add_to_group`` option for all OIDC providers.
  (:issue:`1450`)
- Allow workspace-qualified lookups to refer to workspaces outside the initial
  workspace's inheritance chain.
- Record output data when work requests are aborted due to automatic retry
  limits.


Bug Fixes
^^^^^^^^^

- Don't enter an infinite loop when trying to create a worker with constraint
  failures other than a non-unique name. (:issue:`600`)
- Reduce database queries performed during full scans in ``debusine-admin
  vacuum_storage``. (:issue:`724`)
- Don't fail to retry workflows that were aborted before becoming pending.
  (:issue:`1153`)
- Optimize subqueries used for filtering objects on which a user has a
  particular role. (:issue:`1206`)
- Fix incorrect pending and per-architecture task counts in
  ``/api/1.0/service-status/`` and ``/-/status/queue/``. (:issue:`1449`)
- Don't delete an empty file store root directory in ``debusine-admin
  vacuum_storage``. (:issue:`1455`)
- Update the total size of file stores via a journal table, so that
  transactions don't block on other transactions that are adding files to the
  same store. (:issue:`1459`)
- The Celery task to mark work requests as completed was supposed to retry the
  work request on serialization failures, but this didn't work properly.  Fix
  it. (:issue:`1462`)
- Show the number of distinct files stored in ``debusine-admin scope show``
  rather than counting duplicates across artifacts.


Documentation
^^^^^^^^^^^^^

- Document :ref:`reference-metrics` on the Prometheus/OpenMetrics
  endpoint. (:issue:`1440`)


Miscellaneous
^^^^^^^^^^^^^

- :issue:`1463`


Web UI
~~~~~~

Features
^^^^^^^^

- Add basic views for listing and removing collection relations.
  (:issue:`1271`)
- APT configuration of a suite: add required suites.
- Collection detail: display suite base information.


Bug Fixes
^^^^^^^^^

- Optimize workflow table filtering to use more efficient join strategies.
  (:issue:`1206`)
- Fix log viewer (including Autopkgtest logs): display a warning when a file is
  too large to render and small enough to be parsed. (:issue:`1369`)


Client
~~~~~~

Features
^^^^^^^^

- Add ``debusine collection relation list`` and ``debusine collection relation
  edit`` commands.
- Move more dput-ng configuration to ``/usr/share/dput-ng/``, in line with how
  dput-ng 1.45 ships its own configuration files.


Workflows
~~~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :workflow:`package_publish`: Look up build logs and task history in the
  workspace of the binary artifacts, rather than in the workspace of the work
  request.
- :workflow:`package_publish`: Require ``target_suite`` to be in the same
  workspace as the workflow.  Cross-workspace copies must now be initiated
  using a workflow in the target workspace.


Features
^^^^^^^^

- :workflow:`autopkgtest`: Add ``pin_packages`` parameter. (:issue:`1301`)
- :workflow:`autopkgtest`, :workflow:`blhc`, :workflow:`lintian`,
  :workflow:`piuparts`, :workflow:`qa`,
  :workflow:`reverse_dependencies_autopkgtest`: Turn ``update_qa_results`` into
  an enumeration, with values ``no``, ``yes``, or ``force``; ``force`` skips
  the check for whether the :collection:`debian:qa-results` collection already
  contains a current matching result.  The old boolean values are still
  accepted for compatibility. (:issue:`1301`)


Tasks
~~~~~

Features
^^^^^^^^

- :task:`Autopkgtest`: Add ``pin_packages`` parameter. (:issue:`1301`)


Bug Fixes
^^^^^^^^^

- :task:`Lintian`: Treat exit codes other than 0 and 2 as errors.
  (:issue:`1454`)
- Ensure proper cleanup of tasks even when they fail early (in fetch_input or
  configure_for_execution). (:issue:`1469`)


Worker
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Workers now execute work requests using short-lived tokens that only
  grant the minimum access necessary.

  This change is backwards-incompatible with older workers that do not know how
  to receive and use this token. (:issue:`523`)


Features
^^^^^^^^

- Worker Pools: Support installing Debusine from Freexian's Debusine Enterprise
  repositories and arbitrary custom repositories.


Bug Fixes
^^^^^^^^^

- Fix race in task statistics calculation in the unshare executor.
  (:issue:`1458`)


Signing
~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Switch signing logging from Django file-based handlers to systemd
  JournalHandler. (:issue:`597`)


Features
^^^^^^^^

- Add fields to Debusine-signed Debian uploads: ``Debusine-User``,
  ``Debusine-Workflow``, and ``Debusine-Work-Request``. (:issue:`1157`)


General
~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Completely numeric usernames are no longer permitted. (:issue:`1151`)


Features
^^^^^^^^

- The permission system now supports adding extra group membership for the
  duration of a session. (:issue:`634`)
- Django 5.2 support in integration tests. (:issue:`1453`)


.. _release-0.14.7:

debusine 0.14.7 (2026-04-22)
----------------------------

Server
~~~~~~

Features
^^^^^^^^

- Added ``debusine-admin signon_sync`` command to sync user groups with remote
  sources of truth.

  This requires the signon ``GitlabProvider`` to be configured with
  ``sync_token`` key in its ``options``, to be a GitLab API token that is able
  to
  access the membership information of the groups to be synced.

  If set up correctly, groups listed in the ``add_to_group`` option will be
  checked against their remote membership. Inconsistencies are listed to
  ``stdout``, or reconciled if ``--fix`` is used. (:issue:`976`)
- :task:`APTMirror`: Make the ``architectures`` parameter optional, and
  automatically discover the available architectures if it is unset.


Bug Fixes
^^^^^^^^^

- server: Validate LocalArtifact data during API artifact creation, returning
  errors earlier when invalid data is provided. (:issue:`173`)
- Improve error for duplicate workflow template creation. (:issue:`594`)
- Move updates of expensive properties of workflows into the scheduler.
  (:issue:`1362`)
- Forbid dependencies between work requests that are not in workflows.
  (:issue:`1362`)
- Improve performance of locking workflows for update.

  Defer work request completion to a Celery task, so that workers don't get
  blocked on workflow locks and sometimes end up discarding completed work.
  (:issue:`1404`)
- Run the scheduler when workers are marked connected, but not on other changes
  to workers.  There is still a regular fallback scheduler run in case this
  misses anything. (:issue:`1427`)
- Fix fetching artifacts in private workspaces from worker tasks.
  (:issue:`1435`)
- Run the scheduler when work requests are marked pending, completed, or
  aborted, but not on other changes to work requests.  There is still a regular
  fallback scheduler run in case this misses anything. (:issue:`1441`)
- Increase the frequency of the regular fallback scheduler run to once every 15
  seconds. (:issue:`1441`)
- Only run ``provisioner`` and ``scheduler`` tasks in their corresponding
  services, not in ``debusine-server-celery.service``. (:issue:`1441`)
- Fix high database write bandwidth caused by insufficiently-constrained
  ``UPDATE`` statements.
- Reduce log noise from locked workflows: once the scheduler has found that it
  can't assign a work request to a worker because it's locked, it skips other
  work requests in the same workflow.


Documentation
^^^^^^^^^^^^^

- Document ``debusine-admin create_collection``. (:issue:`1430`)


Web UI
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Removed the Web UI components for creating Artifacts and Work Requests, as
  the focus for these actions shifts to the debusine-client (:issue:`1192`)


Features
^^^^^^^^

- Updated work request display for workflow callbacks.

  When showing a workflow callback, a description is now shown that matches the
  workflow callback's docstring.

  The work request "Internals" tab is now displayed with a more compact, and
  appropriate, ``<dl>`` layout. (:issue:`1319`)


Bug Fixes
^^^^^^^^^

- Filter out work requests with ``allow_failure=True`` (such as regression
  reference tests) from the failed workflows list and summary counts in the web
  UI. (:issue:`1377`)


Miscellaneous
^^^^^^^^^^^^^

- :issue:`1105`


Client
~~~~~~

Miscellaneous
^^^^^^^^^^^^^

- :issue:`1419`


Tasks
~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- The ``DebusineTaskConfiguration`` bare data entry now has additional fields.

  Old ``debusine`` clients will raise validation errors for the extra ``path``
  and ``position`` fields when pulling data from new servers. (:issue:`1407`)


Features
^^^^^^^^

- Allow to match task configuration entries using boolean tag expressions.

  In a :bare-data:`debusine:task-configuration` entry, ``tags_provided`` and
  ``tags_required`` can now be strings with a boolean tag expression that match
  the corresponding scheduler tag sets in the task to configure.
  (:issue:`1394`)
- Added path and position fields to task configuration entries.

  The new fields are optional. When set, configuration entries are sorted by
  ``path`` and ``position`` first.

  Configuration entries with those values unset, or with the same values, are
  then sorted by presence of subject and context to preserve the existing
  behaviour.

  The database ID of configuration file entries is used as a last tie breaker
  when everything else is the same, to keep sorting deterministic.

  If new entries are created on the server that do not have path information
  are
  checked out, and do not exist in the local repository, they are now added to
  a
  ``new.yaml`` file on the root of the repository instead of each in its own
  file
  under ``new/``.

  It is now possible to have multiple entries in the collection matching the
  same
  task information, or even duplicate entries, as long as their path and
  position
  information is different. (:issue:`1407`)


Bug Fixes
^^^^^^^^^

- Autopkgtest artifacts now record ``relates-to`` relationships to the source
  and binary package artifacts that were used as input. (:issue:`806`)
- Configure a default TCP timeout for external requests.

  Add an ``http_timeout`` configuration parameter to the debusine-worker and
  client configuration. (:issue:`1312`)


Worker
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Removed ``--log-file`` option. Worker logs are now written to the systemd
  journal. (:issue:`597`)


Features
^^^^^^^^

- Set Worker version in Metadata and log the version (:issue:`323`)
- Lock down the home directory of the signing worker with tighter permissions
  (``chmod 700``). (:issue:`1051`)


Bug Fixes
^^^^^^^^^

- The System user (``_system``) that is used for tasks created by
  ``debusine-admin`` is now an implicit scope and workspace owner, everywhere.
  (:issue:`523`)
- Sync async HTTP client timeout with ``DEFAULT_REQUEST_TIMEOUT`` and make it
  configurable via ``worker.config.http_timeout``. (:issue:`1416`)
- Send worker log events to module-specific loggers rather than the root
  logger. (:issue:`1447`)


Miscellaneous
^^^^^^^^^^^^^

- :issue:`1419`


General
~~~~~~~

Miscellaneous
^^^^^^^^^^^^^

- :issue:`1414`


.. _release-0.14.6:

debusine 0.14.6 (2026-03-29)
----------------------------

This release switches to :ref:`tag-based scheduling
<development-blueprints-tag-based_scheduling>` by default.
We recommend running ``debusine-admin check_scheduler_tags`` immediately
after upgrading to this version to confirm that everything will work
correctly. If necessary, it can be disabled by setting
``FEATURE_TAG_BASED_SCHEDULING = False`` in your
:ref:`local server settings <set-up-debusine-server>`.

The worker pool is not yet aware of tag-based scheduling (:issue:`1393`)
and still uses the traditional scheduling mechanisms to predict required
worker capacity.

Server
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- The server now requires ``python3-django-cte`` >= 2.0.0, available in
  ``trixie-backports``.


Features
^^^^^^^^

- Set ``User-Agent`` Header to ``debusine/<version>`` for HTTP requests.
  (:issue:`93`)
- The command ``debusine-admin check_scheduler_tags`` can be used to detect
  potential problems with ``FEATURE_TAG_BASED_SCHEDULING`` for existing
  workers and work request that may need attention before turning the
  feature on. (:issue:`326`)
- Extend syntax of lookups to be able to target a specific workspace.
  (:issue:`495`)
- Replace the lookup API endpoints with ones usable by users, instead of
  workers. (:issue:`691`)
- Cache positive lookup results in the context, so that we don't need to repeat
  the same lookup-related queries many times while orchestrating workflows.

  :workflow:`reverse_dependencies_autopkgtest`: Pre-cache source and binary
  lookups for reverse-dependencies so that child :workflow:`autopkgtest`
  workflows don't need to spend time looking them up again. (:issue:`786`)
- Sort ``static_parameters`` and ``runtime_parameters`` following the model
  definitions, in API responses. (:issue:`1201`)
- The ``debusine-admin group members`` subcommand now supports a ``--role``
  option to specify the role (``member`` or ``admin``) when adding or setting
  group members, and lists the role of each member. (:issue:`1290`)


Bug Fixes
^^^^^^^^^

- ``debusine-admin delete_expired``: Take much less aggressive locks, so that
  the rest of the service can stay operational while expiry is running.
  (:issue:`473`)
- ``debusine-admin vacuum_storage``: Optimize last-modified checks for orphan
  files: they incur an I/O cost for local stores, so it's better to only run
  them for the rare case of orphan files rather than for all files in the
  stores.

  ``debusine-admin vacuum_storage``: Simplify scan for empty directories.
  (:issue:`724`)
- If the work request assigned to an external worker is locked when the worker
  tries to get its next work request, return HTTP 423 immediately rather than
  blocking.  The worker will try again, and this avoids filling up PostgreSQL
  connection slots if a large workflow is locked for some time. (:issue:`786`)
- Don't disturb parent workflows when a worker asks for a new work request and
  we find that we need to retry some running work requests. (:issue:`1081`)
- :issue:`1352`, :issue:`1383`
- Don't generate emails to admins for explicitly-generated API exceptions, even
  if they happen to have HTTP status codes >= 500. (:issue:`1359`)
- Retain artifacts if they extend a non-expired artifact. (:issue:`1360`)
- Nicer logging for debusine.server.celery.update_workflows not getting a lock.
  (:issue:`1365`)
- Optimize lookups in :collection:`debian:archive` and
  :collection:`debian:suite` collections to use available indexes.
  (:issue:`1367`)
- Handle file uploads when deleting expired workspaces. (:issue:`1375`)
- Retry deadlocks while marking a work request as completed by a worker.
  (:issue:`1382`)
- Suppress database connection errors (``OperationalError``) from being emailed
  to administrators by the ``django.request`` logger to prevent email floods
  during database outages. (:issue:`1384`)
- Artifact Relation Creation endpoint: Require the caller to have permission to
  create artifacts in the workspace that the origin artifact resides in.
  Artifact Relation Deletion endpoint: Require the caller to be an owner of the
  origin artifact's workspace. (:issue:`1499`, :cve:`2026-11852`)
- Enforce permission checking in all API views.
- Only permit external and signing worker tokens to use the worker websocket.
- Restrict access to the asset-permission-check endpoint to signing workers.
- Restrict submission to the open-metrics API endpoints to Celery workers.


Web UI
~~~~~~

Bug Fixes
^^^^^^^^^

- Collection search now matches anywhere in item names, instead of only
  matching prefixes. (:issue:`1145`)
- Display the last page in workflow lists when a requested page number exceeds
  the total number of pages, instead of returning a plain 404 error page.
  (:issue:`1306`)
- :task:`Piuparts`: fix label (avoid duplicates) if multiple binary packages
  are built from the same source. (:issue:`1333`)
- Fix task configuration inspector to better cope with invalid values in the
  ``collection`` query parameter. (:issue:`1341`)


Client
~~~~~~

Features
^^^^^^^^

- Add workflow template deletion to the client with ``debusine
  workflow-template delete``. (:issue:`960`)


Workflows
~~~~~~~~~

Features
^^^^^^^^

- :workflow:`piuparts`: include architecture-independent packages in each
  :task:`Piuparts` task. If only architecture-independent packages are
  provided: create tasks for all available architectures. (:issue:`1174`)


Bug Fixes
^^^^^^^^^

- :workflow:`qa`: Don't abort top-level ``regression-analysis`` callback due to
  failures of its dependencies. (:issue:`1133`)
- :workflow:`qa`: Update the top-level regression analysis incrementally as
  tasks finish. (:issue:`1337`)
- :workflow:`autopkgtest`, :workflow:`blhc`, :workflow:`lintian`,
  :workflow:`piuparts`: Fix failure to be idempotent if the state of the
  ``qa_suite`` collection changes. (:issue:`1370`)
- Fix workflow orchestrator crashes if child work requests have been retried.
  (:issue:`1400`)


Tasks
~~~~~

Features
^^^^^^^^

- Allow task configuration entries to provide task tags and require worker
  tags.

  This adds two new fields to task configuration entries, that can be set to
  lists
  of tags to add to task-provided or task-required tags:

  * ``provide_tags`` (list): a list of additional tags to add to task-provided
    tags, using the ``workspace`` provenance.
  * ``require_tags`` (list): a list of additional tags to add to task-required
    tag, using the ``workspace`` provenances. (:issue:`326`)
- Tasks now require architecture tags from workers.

  This MR contains a database migration that processes all ``WorkRequests``
  objects in the database one at a time, and may take a long time.

  On large servers, you can use this script, before upgrading, to pre-fill the
  tags in batches to avoid the migration taking a database lock for a long
  time.

  .. code-block:: python3

    #!/usr/bin/python3

    import argparse
    import os

    import django

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "debusine.project.settings")
    django.setup()

    from django.db import transaction
    from django.db.models import QuerySet

    import debusine.worker.tags as wtags
    from debusine.db.models import WorkRequest

    GENERATED_TAGS = [
        wtags.BUILD_ARCH_PREFIX + arch
        for arch in ("amd64", "arm64", "ppc64el", "armhf", "armel", "i386")
    ]


    def merge_tag_into(tag: str, wr: WorkRequest) -> None:
        """Add tag to tags, in place, keeping it sorted."""
        if tag not in wr.scheduler_tags_required:
            wr.scheduler_tags_required.append(tag)
            wr.scheduler_tags_required.sort()
            wr.save()


    def sbuild_like() -> QuerySet[WorkRequest]:
        return (
            WorkRequest.objects.filter(task_data__has_key="build_architecture")
            .exclude(task_data__build_architecture=None)
            .exclude(scheduler_tags_required__overlap=GENERATED_TAGS)
            .order_by()
        )


    def mmdebstrap_like() -> QuerySet[WorkRequest]:
        return (
            WorkRequest.objects.filter(
                task_data__bootstrap_options__has_key="architecture"
            )
            .exclude(task_data__bootstrap_options__architecture=None)
            .exclude(scheduler_tags_required__overlap=GENERATED_TAGS)
            .order_by()
        )


    @transaction.atomic()
    def prefill(count: int, dry_run: bool) -> None:
        """Prefill a batch of ``count`` WorkRequests."""
        # sbuild-like tags using build_architecture
        total = sbuild_like().count()
        print(f"{total} sbuild-like work requests to process")
        processed = 0
        for wr in sbuild_like()[:count]:
            tag = wtags.BUILD_ARCH_PREFIX + wr.task_data["build_architecture"]
            merge_tag_into(tag, wr)
            processed += 1
        print(f"{processed}/{total} sbuild-like work requests processed")

        # mmdebstrap-like tags using bootstrap_options.architecture
        total = mmdebstrap_like().count()
        print(f"{total} mmdebstrap-like work requests to process")
        processed = 0
        for wr in mmdebstrap_like()[:count]:
            tag = (
                wtags.BUILD_ARCH_PREFIX
                + wr.task_data["bootstrap_options"]["architecture"]
            )
            merge_tag_into(tag, wr)
            processed += 1
        print(f"{processed}/{total} mmdebstrap-like work requests processed")

        if dry_run:
            raise SystemExit(0)


    def main():
        parser = argparse.ArgumentParser(
            description="Pre-fill build-arch scheduler tags from task data."
        )
        parser.add_argument(
            "--dry-run",
            "-n",
            action="store_true",
            help="do nothing, pretend to perform the operation",
        )
        parser.add_argument(
            "--count",
            "-c",
            type=int,
            default=100,
            help="approximate number of WorkRequest to process"
            " (may go from 0 to twice this much)",
        )
        args = parser.parse_args()

        prefill(args.count, args.dry_run)


    if __name__ == "__main__":
        main()

  To reiterate: running this code is not required, but it may help mitigate a
  slow upgrade for sites with many ``WorkRequest`` objects in their database.
  (:issue:`326`)
- Allow to match task configuration entries by task tags.

  This adds two new fields to task configuration entries, that restrict
  matching
  the entries to only those tasks providing or requiring all the listed tags:

  * ``tags_provided`` (defaults to ``[]``): a list of tags that the task must
    provide
  * ``tags_required`` (defaults to ``[]``): a list of tags that the task must
    require (:issue:`1231`)
- Add ``architectures`` field to ``extra_repositories`` to filter repositories
  by build architecture. (:issue:`1289`)
- Store resolved task input fields in dynamic task data.

  This both allows inspecting task inputs in more details, and it allows
  reconstructing the task fields from stored values.

  Over time, this should allow simplifying task code significantly, as it can
  rely on populated input fields and drop the need to save the needed
  information
  in dynamic data. (:issue:`1346`)
- Use a task input field for task build_architecture, and use a Django setting
  for the fallback value.

  You can now set the ``DEBUSINE_FALLBACK_ARCHITECTURE`` Django setting, to set
  the architecture to use for tasks that require one but do not specify one. It
  defaults to ``amd64``.

  ``build_architecture`` is now resolved via a task input field, which means it
  is automatically saved in dynamic task data and is available for inspection,
  and its lookup logic can make use of the database in the future.

  Tasks that do not need a build architecture now again do not require
  potential
  workers to have a specific one. (:issue:`1347`)
- Restrict tasks providing ``task:source-package:*`` tags to the system
  provenance.

  This is intended to make sure that tags match the package that is being
  built,
  and that users cannot provide extra package-specific tags that could, for
  example, trigger secure boot signing. (:issue:`1381`)


Documentation
^^^^^^^^^^^^^

- Documented work request fields relationship with the work request lifetime.
  (:issue:`1348`)
- Added ``worker:class`` to the set of documented tags. (:issue:`1391`)


Miscellaneous
^^^^^^^^^^^^^

- :issue:`1345`


Worker
~~~~~~

Features
^^^^^^^^

- Restrict ``worker:type:*`` worker-provided tags to the system provenance.

  Give that this information is in the database, this prevents a worker
  accidentally or maliciously reporting as the wrong type. (:issue:`326`)


Bug Fixes
^^^^^^^^^

- Workers now run tasks in a working directory outside of /tmp ($HOME/workdir).
  (:issue:`1051`)


Signing
~~~~~~~

Bug Fixes
^^^^^^^^^

- :task:`Sign`: Only require ``worker:cap:sbsign`` tag for ``purpose: uefi``.
  (:issue:`1380`)
- :task:`SignRepositoryIndex`: Fix type of artifact relation from signed to
  unsigned ``Release`` files.


General
~~~~~~~

Features
^^^^^^^^

- Tag-based scheduling is now enabled by default.

Documentation
^^^^^^^^^^^^^

- Promoted the task configuration blueprint to the main documentation.


.. _release-0.14.5:

debusine 0.14.5 (2026-02-24)
----------------------------

Server
~~~~~~

Features
^^^^^^^^

- Add a feature flag to enable tag-based scheduling.

  This introduce the temporary ``FEATURE_TAG_BASED_SCHEDULING`` boolean
  setting,
  defaulting to ``False``, working as a feature flag.

  When set to ``True``, it enables tag-based matching of tasks and workers in
  the
  scheduler.
  We do not recommend enabling it: it is not expected to work yet, in this
  release of Debusine. (:issue:`326`)
- Add worker-provided tags for tag-based scheduling.

  As an initial step to move to tag-based scheduling (see
  :ref:`scheduler-tags-reference`), this makes workers report their
  capabilities
  also using tags, and tasks define required worker tags to match them in
  scheduling.

  This isn't used for scheduling yet, since filtering server-side would mean
  that
  no task could get scheduled except on workers that have been updated to
  provide
  worker tags.

  Scheduler tags now appear in work requests in ``debusine work-request-show``
  and
  in the work request detail in the web UI. (:issue:`326`)
- :task:`APTMirror`: Fetch most files directly rather than calling out to
  ``apt``.

  :task:`APTMirror`: Fetch ``Contents`` and ``Translation`` indexes.
  (:issue:`955`)
- :task:`APTMirror`: Add partial mirroring support. (:issue:`1250`)
- :task:`APTMirror`: Add support for mirroring private repositories using HTTP
  Basic Authentication. (:issue:`1251`)
- When creating an asset in response to ``debusine asset create``, also create
  an ``AssetUsage`` row to allow minimal usage of the new asset in the given
  workspace.  This only makes a difference for asset usage roles that may be
  implied by other roles, such as ``REPOSITORY_SIGNER`` which is implicitly
  granted to workspace owners. (:issue:`1313`)


Bug Fixes
^^^^^^^^^

- :task:`APTMirror`: Allow mirrored suites to reuse versions if
  ``may_reuse_versions`` is set on the suite or its parent archive.
  (:issue:`1263`)
- Stop the test SFTP server more reliably (again). (:issue:`1296`)
- :issue:`1314`


Web UI
~~~~~~

Features
^^^^^^^^

- Workflow view: display input artifacts with their lookups and resolved
  artifacts. (:issue:`885`)
- Log parsers: Avoid reading logs twice for parsing and rendering. Improve
  error messages. (:issue:`1146`)
- Display a "please wait" message while a workflow is being orchestrated, as it
  can take some time. (:issue:`1249`)


Bug Fixes
^^^^^^^^^

- Sort collections alphabetically in workspace drop-down menu. (:issue:`1011`)
- DebDiff WorkRequest and Artifact views: shorten excessively long titles.
  (:issue:`1177`)
- Show the aborting user in the “Aborted” work request status badge.
  (:issue:`1228`)
- Show ``debusine work-request sign`` rather than ``debusine
  provide-signature`` in the "Waiting for signature" card.  This requires
  debusine-client >= 0.13.0, available in ``bookworm-backports-sloppy``,
  ``trixie-backports``, or ``forky``. (:issue:`1270`)
- Avoid including blank lines when copying log text with sections.
  (:issue:`1281`)
- File text widgets: remove trailing newline when copying to the clipboard.
  (:issue:`1327`)


Miscellaneous
^^^^^^^^^^^^^

- Use the 'info' color for the 'Running' state badges to make it distinct from
  the 'Pending' state.


Client
~~~~~~

Bug Fixes
^^^^^^^^^

- Hide deprecated subcommands from command-line completion. (:issue:`1267`)


Workflows
~~~~~~~~~

Bug Fixes
^^^^^^^^^

- :workflow:`blhc`: Accept ``binary_artifacts`` parameter as an alternative to
  ``package_build_logs``; if ``binary_artifacts`` is passed, then find the
  build logs using relations from the binary artifacts.

  :workflow:`qa`: Wait for binary artifacts to exist before populating the
  :workflow:`blhc` sub-workflow.  The ``package_build_logs`` parameter is no
  longer used. (:issue:`1142`)
- :workflow:`update_environments`: More accurately create the environments
  requested in the targets parameter. (:issue:`1199`)
- Simplify ``Workflow.ensure_child_*``, avoiding creation of duplicate work
  requests in some situations. (:issue:`1269`)
- :workflow:`debdiff`: Handle packages transitioning from arch-dependent to
  arch-independent. (:issue:`1300`)
- :workflow:`piuparts`: Store QA results according to the build architecture
  (i.e. the architecture where we're running the test), not the architecture of
  the input binary packages. (:issue:`1318`)


Tasks
~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Add missing GenerateKey task version.

  The GenerateKey task was missing ``TASK_VERSION``, and it has now been added.

  Note that the scheduler will likely not find suitable workers for this task
  until the signing workers have been updated to match the task version.


Features
^^^^^^^^

- Add initial set of task-provided scheduler tags.

  This introduces task-provided tags ``task:scope:*``, ``task:workspace:*``,
  ``task:group:*``, ``task:source-package:*``.

  Using tags for scheduling is still temporarily disabled until all workers are
  updated to provide their scheduler tags. (:issue:`326`)
- :task:`Sbuild`: Create relation between :artifact:`debian:package-build-log`
  and :artifact:`debian:upload` artifacts. (:issue:`1142`)


Bug Fixes
^^^^^^^^^

- :task:`DebDiff` (and theoretically other tasks): Handle non-UTF-8 output.
  (:issue:`1086`)


Worker
~~~~~~

Bug Fixes
^^^^^^^^^

- Don't consider a worker pool worker idle if it has PENDING tasks.
  (:issue:`1315`)


Documentation
^^^^^^^^^^^^^

- Recommend enabling ``security.nesting=true`` in the ``debusine`` Incus
  profile. (:issue:`1330`)


.. _release-0.14.4:

debusine 0.14.4 (2026-01-30)
----------------------------

Server
~~~~~~

Features
^^^^^^^^

- Emit ``debusine_workflow_orchestrator_duration`` metric indicating how long
  workflow orchestrators took to run. (:issue:`1196`)


Bug Fixes
^^^^^^^^^

- Stop the test SFTP server more reliably. (:issue:`1296`)


Web UI
~~~~~~

Features
^^^^^^^^

- Improve DebDiff view load time by optimizing log parsing. (:issue:`1257`)
- Debdiff artifact view: make added and removed file list scrollable.


Workflows
~~~~~~~~~

Bug Fixes
^^^^^^^^^

- :workflow:`debdiff`: fix incorrect binary package pairing by comparing
  architecture-independent binaries together and including them in
  architecture-dependent comparisons. (:issue:`1175`)


Tasks
~~~~~

Features
^^^^^^^^

- :task:`Autopkgtest`: Return a SKIPPED result if all tests were skipped.
  (:issue:`1282`)


Bug Fixes
^^^^^^^^^

- :task:`Lintian`: Allow execution on ``incus-vm``.


Worker
~~~~~~

Miscellaneous
^^^^^^^^^^^^^

- Bump the bundled ``lxc.generator`` and ``incus-agent-setup`` code from
  ``distrobuilder``.


.. _release-0.14.3:

debusine 0.14.3 (2026-01-26)
----------------------------

Server
~~~~~~

Features
^^^^^^^^

- Improve database error handling for ``debusine-admin check`` and
  ``debusine-admin migrate``. (:issue:`226`)
- SSO restrict: allow multiple groups to be OR-ed together. (:issue:`1091`)
- Record when work requests are marked pending.

  Emit ``debusine_work_request_start_latency`` metric when marking a work
  request running. (:issue:`1195`)
- Introduce optional workspace scoping for groups.

  Workspace-related groups can still be assigned roles on other workspaces and
  their resources.

  This removes the requirement of having unique group names across an entire
  scope.

  The owner group of a newly created child workspace is now scoped to that
  workspace and simply called "Owners". (:issue:`1241`)


Bug Fixes
^^^^^^^^^

- Updated examples for serving static files also for repository pages.
  (:issue:`1213`)
- Enforce permissions on the file body upload endpoint. (Note that hashes were
  already recorded in the artifact creation step, which included permission
  checks.) (:issue:`1245`)
- Fix ``/api/1.0/artifact/{workspace}/{artifact_id}/`` when the workspace has
  multiple child workspaces. (:issue:`1252`)
- Consider artifacts to be visible via indirect workspace inheritance as well
  as direct inheritance. (:issue:`1255`)
- Add ``debusine-admin`` support for workspace-specifc groups.

  ``debusine-admin`` was lagging behind after the introduction of
  workspace-specific group, and this brings it up to date:

  * There is a new ``workspace`` column in ``debusine-admin group list``.
  * ``debusine-admin group list`` can also filter by workspace name, or
    by groups without workspaces.
  * For all other commands, groups can be specified either as
    ``scopename/groupname``, for scope-level groups, or as
    ``scopename/workspacename/groupname``, for workspace-level groups.
    (:issue:`1284`)

- Gracefully handle ``emit_metric`` HTTP failures.
- Validate collection names and categories on the creation endpoint.


Web UI
~~~~~~

Features
^^^^^^^^

- Link to deb archives from workspace detail view. (:issue:`1219`)
- Serve apt archives locally for development.

  When ``DEBUG=True``, archives are served under ``/-/__archives__/`` so
  that interlinking between the main web UI and the archive web UI works.

  Also, starting a ``runserver`` on port ``8081`` makes it the serve the
  equivalent of the ``deb.…`` subdomain, to have simpler URLs for setting up
  apt
  sources for testing.


Bug Fixes
^^^^^^^^^

- Avoid separately flattening each item when rendering a workflow list.
  (:issue:`656`)
- DebDiffViewWorkRequestPlugin: shorten description. (:issue:`1177`)
- Fix rendering issues with large text/log files in Firefox (over 10,000 lines)
  and improve loading performance in all browsers. (:issue:`1248`)
- :issue:`1260`, :issue:`1280`
- Add UI for workspace-specifc groups.

  The UI was lagging behind after the introduction of workspace-specific group.
  Now the group management URL structure is duplicated under the workspace URL
  namespace, to manage a workspace's groups. (:issue:`1284`)


Client
~~~~~~

Features
^^^^^^^^

- Add ``debusine --version``. (:issue:`465`)
- Improve human readable output for ``workflow create``, ``work-request
  create``, ``work-request list``.

  Note that the default output of those commands changed: for machine readable
  output, use ``--yaml``. (:issue:`1225`)


Bug Fixes
^^^^^^^^^

- Fix webui URLs in debusine client output. (:issue:`1222`)


Tasks
~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Drop support for Debian 8 (jessie) and Ubuntu 14.04 (trusty). (:issue:`985`)


Bug Fixes
^^^^^^^^^

- Run :task:`Piuparts` with the standard ``/etc/piuparts/scripts`` scripts.
  (:issue:`1268`)
- :task:`APTMirror`: Only look for the target suite in the task's workspace.


Worker
~~~~~~

Features
^^^^^^^^

- Add ``debusine-worker --version``. (:issue:`465`)
- Cloud Workers: Pin debusine sources so that an older version wouldn't
  accidentally be installed from ``stable`` (or similar), due to
  network/repository issues. (:issue:`1286`)


Bug Fixes
^^^^^^^^^

- Worker Pool: Ignore tasks that completed before the current instance was
  created, in idle time calculations. (:issue:`1203`)


Signing
~~~~~~~

Features
^^^^^^^^

- Improve database error handling for ``debusine-signing check`` and
  ``debusine-signing migrate``. (:issue:`226`)


General
~~~~~~~

Features
^^^^^^^^

- Port to Pydantic v2. (:issue:`1261`)


Bug Fixes
^^^^^^^^^

- Add support for Python 3.14. (:issue:`1277`)


.. _release-0.14.2:

debusine 0.14.2 (2026-01-06)
----------------------------

Server
~~~~~~

Features
^^^^^^^^

- Add a mechanism to allow Celery workers to emit metrics. (:issue:`1195`)
- Configure ``Acquire-By-Hash: yes`` in suites by default. (:issue:`1232`)
- :task:`CopyCollectionItems`: Log details of copies to an output file.
  (:issue:`1236`)


Bug Fixes
^^^^^^^^^

- Repositories: Serve ``by-hash`` responses when multiple artifacts match the
  hash. (:issue:`1239`)
- Adjust constraints so the ``delete_expired`` task isn't broken by cloud
  workers. (:issue:`1240`)


Web UI
~~~~~~

Features
^^^^^^^^

- Add QA tab for :workflow:`debian_pipeline`. (:issue:`1214`)


Bug Fixes
^^^^^^^^^

- Further optimize filtering for workflows with failed work requests.
  (:issue:`656`)
- Activate ``ManifestStaticFilesStorage`` to avoid UI glitches after upgrades.
  (:issue:`881`)
- Return HTTP 403 in the case of an OpenID Connect validation error, rather
  than logging an uncaught exception. (:issue:`1033`)
- Create our own dark-mode-aware theme for select2.

  This should align select2-derived widgets to the rest of the site theme.
  (:issue:`1202`)
- Text files: fix text layout.

  Text and log files: selecting file contents no longer selects line numbers.

  Log files: clicking an entry in the table of contents opens the section
  and highlights its name. (:issue:`1227`)


Client
~~~~~~

Features
^^^^^^^^

- dput-ng configuration for debusine.debian.net: Automatically map any unknown
  distribution to a workflow template named ``upload-to-{distribution}``. This
  indirectly enables support for bookworm-backports and trixie-backports.
  (:issue:`883`)
- dput-ng plugin: Support a ``@DISTRIBUTION@`` special value in
  ``workflow_data`` that gets replaced by the name of the target distribution.


Bug Fixes
^^^^^^^^^

- Allow the client to upload artifacts to a non-default scope. (:issue:`1244`)


Workflows
~~~~~~~~~

Bug Fixes
^^^^^^^^^

- :workflow:`qa`: Pass arch-indep ``binary_artifact`` to all children, even
  when ``all`` isn't one of the tested architectures. (:issue:`1157`)
- Support mixed :artifact:`debian:upload` artifacts as input to workflows.
  (:issue:`1175`)


Tasks
~~~~~

Bug Fixes
^^^^^^^^^

- Reduce level of log message reporting that a task raised an exception to
  ``INFO``; the details are also logged in the task's output data, so this
  doesn't need to be considered an error at the service level. (:issue:`1236`)
- :task:`GenerateSuiteIndexes`: Generate the correct pool paths for binary
  packages named ``lib*`` in source packages without a ``lib`` prefix.


Worker
~~~~~~

Features
^^^^^^^^

- Support non-amd64 worker pools. (:issue:`1203`)


Bug Fixes
^^^^^^^^^

- Avoid aborting+retrying worker tasks when the worker dies, this causes a lot
  of damage to parent workflows. (:issue:`1081`)
- Reassign running work requests when we clean up missing worker pool workers.
  Deassign any pending work requests when we clean up / terminate worker pool
  workers.
  Fix the worker pool provisioner's idle-time query (that was constantly
  crashing).
  Fix a couple of completely incorrect queries in the provisioner.
  (:issue:`1203`)
- Allow task input artifacts to be inherited from a workspace in another scope.
  (:issue:`1246`)


General
~~~~~~~

Bug Fixes
^^^^^^^^^

- Accept pytest 9 instead of pytest-subtests.


Miscellaneous
^^^^^^^^^^^^^

- :issue:`501`, :issue:`673`


.. _release-0.14.1:

debusine 0.14.1 (2025-12-15)
----------------------------

Server
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Rename ``CreateExperimentWorkspace`` to :task:`CreateChildWorkspace`, and
  make it slightly more configurable. (:issue:`964`)


Features
^^^^^^^^

- :task:`CreateChildWorkspace`: Allow ``-`` in experiment names. (:issue:`964`)
- Exclude internal workflow collections from collection lists in server API by
  default.

  This removes clutter from the output of ``debusine collection list`` and
  makes
  it significantly faster. (:issue:`1132`)
- Increment ``debusine_signon_oidc_callbacks`` counter on OpenID authentication
  callbacks. (:issue:`1194`)
- Add ``debusine-admin worker_pool edit`` to adjust worker pool configuration
  interactively.


Bug Fixes
^^^^^^^^^

- Optimize filtering for workflows with failed work requests. (:issue:`656`)
- :collection:`debian:suite`: Forbid versions of source or binary package from
  going backwards by default. (:issue:`1137`)
- Treat archives as suites' parents without needing an explicit collection item
  relationship.


Web UI
~~~~~~

Features
^^^^^^^^

- Add view to create a collection. (:issue:`787`)
- Add views to configure and delete collections. (:issue:`788`)
- Added a tab with regression analysis summaries to QA workflow UI.
  (:issue:`912`)
- Wrap long lines in log files.

  Improve rendering of line numbers in log files. (:issue:`1147`)


Bug Fixes
^^^^^^^^^

- Fix missing breadcrumbs for workflow templates.
- Fix scrolling to an anchor: add padding on the top so the anchor is visible.


Client
~~~~~~

Features
^^^^^^^^

- CLI: allow specifying a collection as name@category. (:issue:`1169`)
- Add ``debusine archive suite create`` command. (:issue:`1184`)
- Use server-provided links in CLI; requires servers to run at least Debusine
  0.13.0.


Workflows
~~~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Rename ``create_experiment_workspace`` to :workflow:`create_child_workspace`,
  and make it slightly more configurable.

  Only allow scope owners to create or update
  :workflow:`create_child_workspace` workflows. (:issue:`964`)


Features
^^^^^^^^

- :workflow:`debian_pipeline`, :workflow:`lintian`, :workflow:`qa`,
  :workflow:`sbuild`: Show input artifacts in web UI. (:issue:`885`)
- :workflow:`create_child_workspace`: Allow ``-`` in experiment names.
  (:issue:`964`)
- :workflow:`qa`: Add top-level summary information to regression analysis.
  (:issue:`1164`)


Worker
~~~~~~

Features
^^^^^^^^

- Worker Pools: Periodically check that all workers are still running, and
  clean up after any that have died. (:issue:`731`)


Bug Fixes
^^^^^^^^^

- Fix IPv6 on AWS EC2 Worker pool workers.

  Enable IMDSv2 (token-authenticated metadata endpoints) AWS EC2 Worker pool
  workers.

  Cloud Workers: Remove the default ``incusbr0``.

  Cloud Workers: Permit Incus containers to access DHCP and DNS from the host.

  Cloud Workers: Defer starting ``debusine-worker`` until everything is
  configured. (:issue:`1203`)
- Amazon EC2 Worker Pools: Ignore ``InsufficientInstanceCapacity``, which seems
  to be non-fatal.
- Worker Pool: Configure a hostname for workers via ``cloud-init``.
- Worker Pools: Update the debusine ``daily-builds`` source to the ``trixie``
  suite.


General
~~~~~~~

Bug Fixes
^^^^^^^^^

- Respect the ``enabled`` flag in the worker pool provisioner.


.. _release-0.14.0:

debusine 0.14.0 (2025-12-03)
----------------------------

The 0.14.x series requires Python >= 3.13 (available in Debian 13 "Trixie").

The database migration to 0.14.0 will update many work requests'
configuration, potentially breaking in-progress workflows.
We recommend letting all currently executing workflows complete before
upgrading to 0.14.0.

Server
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Remove the old workflow template creation endpoint (used by debusine-client <
  0.13). (:issue:`869`)


Features
^^^^^^^^

- Port to Psycopg 3.
- Record websocket metrics.


Bug Fixes
^^^^^^^^^

- Fix django-prometheus metrics following our switch to gunicorn.
  (:issue:`1098`)


Web UI
~~~~~~

Features
^^^^^^^^

- Introduced breadcrumbs in the UI design. (:issue:`444`)

  * Added breadcrumbs bar below the navbar
  * Breadcrumbs remain visible while scrolling
  * Scope has been moved from the navbar to the breadcrumbs
  * Moved "Work requests" link from the navbar to the plumbing menu
- Add a button to copy ``debusine provide-signature`` commands to the
  clipboard. (:issue:`1018`)


Bug Fixes
^^^^^^^^^

- Ignore content negotiation for archive views that return files.
  (:issue:`1173`)
- Return an error message instead of a 500 when displaying artifact details for
  incomplete artifacts. (:issue:`1189`)


Client
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Removed the deprecated ``create-workflow-template`` command. Use
  ``workflow-template create`` instead.
  Workflow Template creation now accept ``static_parameters`` and
  ``runtime_parameters`` during creation and editing. These are passed as a
  single YAML data block. (:issue:`869`)
- Stop generating :artifact:`debian:binary-packages` artifacts in ``debusine
  artifact import-debian``. (:issue:`1172`)


Features
^^^^^^^^

- Implemented ``debusine workflow-template edit``. (:issue:`767`)
- Add ``debusine collection delete`` command.

  The command will return an error if the collection is not empty, including if
  it only contains removed items: use ``--force`` to remove non-empty
  collections.

  ``debusine collection show`` will now show statistics about items in the
  collection.


Workflows
~~~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Workflows templates now allow the creator to specify which parameters may be
  specified when starting a workflow, through the new ``runtime_parameters``
  field. This replaces the previous model, where workflow template data
  overrode any provided workflow data.  (:issue:`869`)

  * The ``task_data`` field of Workflow Templates is renamed to
    ``static_parameters``.
  * Existing workflow templates have been migrated to retain the same
    restrictions as before. They will need manual maintenance in future,
    as new fields are added.

- Rename ``arch_all_host_architecture`` to ``arch_all_build_architecture`` in
  several workflows. (:issue:`995`)
- :workflow:`debian_pipeline`: Rename ``publish_target`` parameter to
  ``suite``.

  :workflow:`debian_pipeline`: If ``suite`` is set, automatically use it during
  builds and tests. (:issue:`1122`)


Tasks
~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Rename ``host_architecture`` to ``build_architecture`` in several tasks.
  (:issue:`995`)
- Stop generating :artifact:`debian:binary-packages` artifacts in
  :task:`Sbuild`.
  Stop accepting :artifact:`debian:binary-packages` artifacts in all tasks and
  workflows. (:issue:`1172`)


Features
^^^^^^^^

- Add ``resolve_alternatives`` parameter to the ``PackageBuild`` generic task
  (and therefore ``sbuild``). (:issue:`627`)
- ``extra_repositories`` has an additional format for referring to Debusine
  repositories. (:issue:`1122`)


Bug Fixes
^^^^^^^^^

- Fix ``piuparts`` when working with pre-usr-merge environments.
  (:issue:`1084`)


Worker
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Rename ``system:host_architecture`` to ``system:native_architecture`` in
  worker metadata. (:issue:`995`)


Bug Fixes
^^^^^^^^^

- Avoid ``debsums`` errors causing ``piuparts`` failures when there is a
  ``dpkg`` security update in a suite.


General
~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Drop compatibility with Debian bookworm; Debusine now requires Python >=
  3.13.


.. _release-0.13.1:

0.13.1 (2025-11-17)
-------------------

* Minor update to resolve autopkgtest failures in Debian:

  * Fix the debian-pipeline workflow autopkgtest on non-amd64.
  * Fix an artifact sorting bug in the server workflow.
  * Fix a regression in dark-mode.
  * Depend on iproute2 for integration-tests-task-signing.

.. _release-0.13.0:

0.13.0 (2025-11-16)
-------------------

The 0.13.x series will be the final release that supports Debian 12
(Bookworm). Future versions will target Debian 13 (Trixie) and later.

Server
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Remove ``debian:suite-lintian`` collection and
  ``UpdateSuiteLintianCollection`` server task. (:issue:`911`)


Features
^^^^^^^^

- Report ``task_data`` validation failures back to the client. (:issue:`182`)
- Add ``completed_by`` field to work requests, used for ``WAIT`` tasks that
  were explicitly completed by a user action. (:issue:`573`)
- Add :task:`Confirm` task. (:issue:`573`)
- Log warnings on invalid work request state transitions, in preparation for
  raising exceptions instead. (:issue:`1094`)
- Add HTTP request/response metrics using `django-prometheus
  <https://github.com/django-commons/django-prometheus>`__. (:issue:`1098`)
- Improve error logging and messages for orchestrator failures. (:issue:`1127`)
- Add ``allow_dependency_failures`` workflow data parameter. (:issue:`1133`)
- Add a ``links`` section to API response records.

  A ``links`` section, mapping link names to URLs or a dict with link details,
  has been added to serialized responses for work requests, artifacts, workflow
  templates and collections. Links records include both API links and links to
  the web UI (link names prefixed with ``webui_``)

  This allows the Debusine client to show convenience links to the web UI,
  without reimplementing link construction client-side. This also makes the
  debusine client resilient should web UI URLs change.

  Old clients ignore the extra field while parsing responses from the server.

  This is an attempt to move towards the `HATEOAS
  <https://en.wikipedia.org/wiki/HATEOAS>`_ pattern. (:issue:`1134`)
- Switch to ``uvicorn`` (via ``gunicorn``) as our ASGI runner. (:issue:`1148`)


Bug Fixes
^^^^^^^^^

- Lock entire workflows when updating any work request in them, to avoid
  deadlocks. (:issue:`1050`)
- :task:`CreateExperimentWorkspace <CreateChildWorkspace>` now creates the
  usual :ref:`singleton collections <collection-singleton>` in the new
  workspace. (:issue:`1114`)
- Fix possible deadlock when updating expensive properties of workflows.
  (:issue:`1131`)
- Only consider workers as connected if they have sent their dynamic metadata
  recently. (:issue:`1152`)
- Stop marking workers as disconnected on server startup. (:issue:`1152`)
- :task:`GenerateSuiteIndexes`: Set correct ``Content-Type`` for ``Release``
  files.


Web UI
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Changed the base template structures, moving the title into its own block.
  (:issue:`444`)
- Change footer template structure, reorganizing content and adding ``id``\ s.


Features
^^^^^^^^

- Work request view detail: hide "Output" tab for workflows. (:issue:`929`)
- Export :collection:`debian:suite` collections in archive access views even if
  they are not in a :collection:`debian:archive`, unless they have ``exported``
  set to False. (:issue:`1101`)
- Add archive access views to show some useful information for archives and
  suites. (:issue:`1115`)
- Web UI now has a dark mode.

  By default, light/dark mode is selected based on browser preferences, and
  there
  are buttons in the footer to pick between light, dark, and autodetect.

  The footer had to be refactored to fit the new buttons, which should also
  improve flexibility of customization. Please see the new structure of
  ``footer.html`` if you are customizing the footer in your instance.
  (:issue:`1158`)
- Show output data from workflows if available.


Bug Fixes
^^^^^^^^^

- DebDiff artifacts: fix server errors if missing relations, binary changes in
  source artifacts, link correctly to the lines. (:issue:`1083`)
- Task configuration inspector: show the matching workspace for the collections
  shown. (:issue:`1141`)
- Significantly improve the performance of some views, including the homepage.
  (:issue:`1150`)
- Serve ``Release``, ``Release.gpg`` and ``InRelease`` files as text.


Client
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- CLI: uniform behaviour of ``--workspace``.

  Arguments that require a workspace now take a ``--workspace`` argument,
  defaulting to:

  * ``Playground`` for ``localhost``
  * ``developers`` for ``debusine.debian.net``
  * ``sandbox`` for ``debusine.freexian.com``
  * ``System`` for all other cases

  ``debusine setup`` can now be used to configure a different default workspace
  for each server.

  This introduces a uniform handling, but adds some subtle differences in
  behaviour:

  * ``debusine asset create``: ``--workspace`` changes from mandatory to optional.
  * ``debusine workspace inheritance`` now takes a ``--workspace`` argument,
    deprecating its positional version, which becomes optional.
    The positional argument for a workspace, if given, overrides the
    ``--workspace`` one (or its default).
  * ``debusine task-config pull`` does not require ``--workspace`` to be
    set for a first checkout, as it uses the configured default server.
    However, if a checkout exists and ``--workspace`` is provided, it
    raises an error if the argument provided does not match the
    workspace in the checkout metadata.
  * In all other cases when ``--workspace`` was optional, the server assigned a
    default value taken from the settings on the remote site. Now the client
    assigns a default value, as described above.


Features
^^^^^^^^

- CLI: added ``debusine collection create``. (:issue:`787`)
- Implemented ``debusine collection show`` and ``debusine collection manage``.
  (:issue:`788`)
- Implemented ``debusine workflow-template list``, ``show`` and ``manage``.
  (:issue:`871`)
- Refactored command line interface to use a ``debusine object verb`` syntax.

  Previous commands are hidden from command line help but still work: see for
  example ``debusine show-artifact --help``.

  This is the full list of deprecation and changes:

  .. table:: Command line redesign
     :widths: auto

     =============================  =============================
     Deprecated syntax              New syntax
     =============================  =============================
     ``create-artifact``            ``artifact create``
     ``show-artifact``              ``artifact show``
     ``show-artifact-relations``    ``artifact show-relations``
     ``import-debian-artifact``     ``artifact import-debian``
     ``download-artifact``          ``artifact download``
     ``create-asset``               ``asset create``
     ``list-assets``                ``asset list``
     ``task-config-pull``           ``task-config pull``
     ``task-config-push``           ``task-config push``
     ``list-work-requests``         ``work-request list``
     ``show-work-request``          ``work-request show``
     ``create-work-request``        ``work-request create``
     ``manage-work-request``        ``work-request manage``
     ``retry-work-request``         ``work-request retry``
     ``abort-work-request``         ``work-request abort``
     ``provide-signature``          ``work-request sign``
     ``on-work-request-completed``  ``work-request on-completed``
     ``create-workflow-template``   ``workflow-template create``
     ``create-workflow``            ``workflow start``
     ``workspace-inheritance``      ``workspace inheritance``
     =============================  =============================

  Note that, to have a consistent ordering across all commands, ``debusine
  create-workflow-template`` changed from ``debusine create-workflow-template
  template_name task_name`` to ``debusine workflow-template create task_name
  template_name`` (inverting ``task_name`` and ``template_name``).
  (:issue:`1064`)
- Allow using ``DEBUSINE_SERVER_NAME`` instead of ``--server``.

  For convenience in scripts, ``debusine`` now supports the
  ``DEBUSINE_SERVER_NAME`` environment variable as an alternative to specifying
  ``--server``. When both are used, ``--server`` has priority. (:issue:`1119`)
- CLI: cleanup behaviour of ``--data``.

  The following commands read from stdin when ``--data`` is not specified:

  * ``work-request create``
  * ``workflow start``
  * ``collection create`` (it used to assume ``{}`` instead)
  * ``workflow-template create`` (it used to assume ``{}`` instead)
  * ``asset create`` (it used to require the ``--data`` argument, now it
    defaults to ``--data=-`` when not specified)

  The following commands assume ``{}`` when ``--data`` is not specified:

  * ``artifact create``
  * ``collection manage``
  * ``workflow-template manage``

  When reading data from stdin, and both stdin and stdout are a TTY, to avoid
  giving the impression that the command has halted ``debusine`` now prints a
  colorful prompt explaining that it's waiting for YAML on stdin.
  (:issue:`1129`)
- CLI: Added ``--yaml`` option to get machine readable YAML output.

  Without ``--yaml``, ``debusine`` will, at least in the commands that
  have been ported to it, show colorful output formatted for humans,
  whether the output is a tty or not (so that piping to pagers still
  work).

  Well known error types now are also shown formatted and colored.
  (:issue:`1138`)
- Implemented ``debusine collection list``, with tabular output and clickable
  links when not run on a pipe.


Bug Fixes
^^^^^^^^^

- ``workspace-inheritance``: if the inheritance chain is not valid (e.g.
  workspace does not exist): user can edit the chain again. (:issue:`1060`)


Workflows
~~~~~~~~~

Features
^^^^^^^^

- :workflow:`debian_pipeline`: Implement ``enable_confirmation`` parameter.
  (:issue:`573`)
- :workflow:`piuparts`: When preparing reference QA results, store the new
  :artifact:`debian:piuparts` artifact rather than bare data items.
  (:issue:`907`)
- :workflow:`piuparts`, :workflow:`qa`,
  :workflow:`reverse_dependencies_autopkgtest`: Implement
  ``enable_regression_tracking`` parameter to perform regression analysis
  against reference results. (:issue:`908`)
- :workflow:`qa`: Implement ``fail_on`` parameter. (:issue:`909`)
- :workflow:`debian_pipeline`: Implement ``qa_failure_policy``,
  ``regression_tracking_qa_results``, and ``enable_regression_tracking``
  parameters. (:issue:`910`)
- Generate indexes for :collection:`debian:suite` collections even if they are
  not in a :collection:`debian:archive`, unless they have ``exported`` set to
  False. (:issue:`1101`)


Bug Fixes
^^^^^^^^^

- Don't propagate workflow orchestrator errors to their parent workflow; just
  log them (in the system log and in the work request's output data) and carry
  on. (:issue:`1126`)
- Don't prematurely complete workflows during orchestration if one of their
  sub-workflows is empty. (:issue:`1130`)
- Don't abort ``regression-analysis`` callbacks due to failures.
  (:issue:`1133`)


Tasks
~~~~~

Features
^^^^^^^^

- Unify task labels using subject/parameter_summary. (:issue:`687`)


Worker
~~~~~~

Bug Fixes
^^^^^^^^^

- Cleanly shut down both the signing and external workers. (:issue:`1082`)
- Sanitize the environment of command execution under ``unshare``.
  Set ``PATH`` under ``unshare`` to support pre-usr-merge environments.
  (:issue:`1084`)
- Recommend ``iproute2`` in the ``debusine-worker`` package and require it for
  the ``unshare`` backend, as ``sbuild`` needs it. (:issue:`1092`)


Signing
~~~~~~~

Bug Fixes
^^^^^^^^^

- :task:`SignRepositoryIndex`: Set correct ``Content-Type`` for ``Release.gpg``
  and ``InRelease`` files.


General
~~~~~~~

Documentation
^^^^^^^^^^^^^

- Clarify terminology around workflows in explanations and tutorials.
  (:issue:`868`)

Miscellaneous
^^^^^^^^^^^^^

- :issue:`502`


.. _release-0.12.2:

0.12.2 (2025-09-22)
-------------------

Server
~~~~~~

Features
^^^^^^^^

- :task:`APTMirror`: Reuse source and binary packages from other suites in the
  same archive. (:issue:`392`)
- Add a new ``REPOSITORY_SIGNER`` role on signing keys, which is currently
  implied by the ``OWNER`` role on workspaces using the key. (:issue:`756`)
- Added an API to change the name or configuration of a collection.
  (:issue:`788`)


Bug Fixes
^^^^^^^^^

- ``debusine-admin vacuum_storage`` does not report missing files added during
  the vacuum process. (:issue:`933`)
- Filter out more null labels in the open-metrics endpoint, fixing a 500.
  (:issue:`1022`)
- Do not fail task configuration when deleted entries exist. (:issue:`1054`)
- Enable console-based logging for daphne to have better diagnosis information
  in systemd's journal for debusine-server.service.


Documentation
^^^^^^^^^^^^^

- Improved OIDC documentation, fixing some mistakes.
- Provide basic documentation for configuration with alternative webservers.


Web UI
~~~~~~

Features
^^^^^^^^

- Integrate the new logo. (:issue:`593`)
- Wrap work request errors for readability. (:issue:`821`)
- Added web UI to edit a workspace inheritance chain. (:issue:`978`)
- Improve layout of toasts for error messages.


Bug Fixes
^^^^^^^^^

- Improve messages when configured or dynamic task data are missing.
  (:issue:`1012`)
- Fix server error (HTTP 500) when browsing server tasks. (:issue:`1029`)
- Only show statistics of bare data in a collection view. (:issue:`1038`)
- Render empty files as text. (:issue:`1069`)


Client
~~~~~~

Features
^^^^^^^^

- Parse the scope in work request responses, when available (server >= 0.12).
  (:issue:`1080`)
- Support uploading to ``trixie`` and ``trixie-security`` in the ``dput-ng``
  profile.


Bug Fixes
^^^^^^^^^

- Improve error handling in ``debusine workspace-inheritance``. (:issue:`1057`)


Workflows
~~~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :workflow:`blhc`: Require ``vendor`` and ``codename`` parameters, used to
  build the ``environment`` lookup for :task:`Blhc`. (:issue:`1052`)


Features
^^^^^^^^

- :workflow:`debian_pipeline`: Support publishing to a Debusine-managed
  :collection:`debian:suite` collection. (:issue:`577`)
- :workflow:`package_publish`: Default component/section/priority to the values
  in the packages being published. (:issue:`577`)
- Improve workflow labels. (:issue:`687`)
- :workflow:`update_suites`: Implement signing of repository indexes, using a
  new :workflow:`update_suite` sub-workflow. (:issue:`756`)
- :workflow:`package_publish`: Update repository indexes after the items have
  been copied. (:issue:`758`)
- :workflow:`blhc`, :workflow:`lintian`: Implement
  ``enable_regression_tracking`` parameter to perform regression analysis
  against reference results. (:issue:`908`)
- :workflow:`blhc`: Support updating a :collection:`debian:qa-results`
  collection with reference QA results. (:issue:`1047`)
- :workflow:`autopkgtest`, :workflow:`blhc`, :workflow:`debdiff`,
  :workflow:`debian_pipeline`, :workflow:`lintian`,
  :workflow:`make_signed_source`: Sort child work requests by architecture when
  populating them, where possible. (:issue:`1072`)


Bug Fixes
^^^^^^^^^

- :workflow:`debdiff`: Include new architecture ``all`` artifacts in the
  parameters to :task:`DebDiff`. (:issue:`1053`)


Tasks
~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :task:`Blhc`: Require ``environment`` and ``host_architecture`` parameters.
  (:issue:`1052`)


Features
^^^^^^^^

- :task:`Piuparts`: Generate :artifact:`debian:piuparts` artifacts.
  (:issue:`805`)


Bug Fixes
^^^^^^^^^

- :task:`MakeSourcePackageUpload`: Ensure that ``dpkg-dev`` is installed in the
  environment. (:issue:`1036`)
- :task:`Blhc`: Only use the ``--debian`` option if we have a new enough
  ``blhc`` version. (:issue:`1067`)


Miscellaneous
^^^^^^^^^^^^^

- :issue:`1055`


Worker
~~~~~~

Features
^^^^^^^^

- Add a mechanism for sysadmins to execute scripts after worker task
  completion. (:issue:`1070`)


Bug Fixes
^^^^^^^^^

- Retry requests for new work from the server, if they fail. (:issue:`1030`)
- Workaround an `sbuild bug <https://bugs.debian.org/1110102>`__ with its
  autopkgtest backend. (:issue:`1056`)
- Allow executing tasks in a non-default scope (requires server >= 0.12).
  (:issue:`1080`)


Signing
~~~~~~~

Features
^^^^^^^^

- Restrict the ``openpgp`` key purpose to signing Debian upload ``.changes``
  files.
  Add a new key purpose ``openpgp-repository`` for signing Debian repository
  indexes using OpenPGP.


General
~~~~~~~

Documentation
^^^^^^^^^^^^^

- Update installation tutorial to be based on Debian 13 trixie.


.. _release-0.12.1:

0.12.1 (2025-08-21)
-------------------

Server
~~~~~~

Bug Fixes
^^^^^^^^^

- Don't allow multiple instances of the same root workflow's orchestrator to
  run concurrently for different sub-workflows. (:issue:`1000`)
- Ignore SSO identities without an attached user in open-metrics endpoint,
  fixing a 500. (:issue:`1022`)


Web UI
~~~~~~

Features
^^^^^^^^

- :workflow:`debian_pipeline` workflow: display input artifacts (source
  package) and display source package in title. (:issue:`1005`)


Bug Fixes
^^^^^^^^^

- Display dynamic task data in the "Internals" tab of work requests if
  available. (:issue:`1013`)


Client
~~~~~~

Features
^^^^^^^^

- Add ``debusine workspace-inheritance`` to configure a workspace's
  inheritance. (:issue:`978`)
- Add shell completion via ``argcomplete``. (:issue:`1020`)


Bug Fixes
^^^^^^^^^

- Return more user-friendly errors if an incorrect file is specified to
  ``debusine provide-signature --local-file``. (:issue:`986`)


Workflows
~~~~~~~~~

Features
^^^^^^^^

- Add :workflow:`blhc` workflow and use it from :workflow:`debian_pipeline` and
  :workflow:`qa` workflows. (:issue:`802`)


Tasks
~~~~~

Bug Fixes
^^^^^^^^^

- ``task_configuration`` in task data is now inherited from the parent
  workflow. (:issue:`1012`)
- Default task_configuration to ``default@debusine:task-configuration``.
  (:issue:`1012`)


Worker
~~~~~~

Bug Fixes
^^^^^^^^^

- Go back to exiting the worker if it fails to send a task result to the
  server, so that systemd can restart it and allow it to reconnect.
  (:issue:`937`)


General
~~~~~~~

Bug Fixes
^^^^^^^^^

- Weaken tests for invalid HTML, since lxml (via libxml2) no longer provides as
  much HTML error checking. (:issue:`953`)


.. _release-0.12.0:

0.12.0 (2025-08-15)
-------------------

Server
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Remove ``debusine-admin create_workspace``, ``delete_workspace``,
  ``list_workspaces``, and ``manage_workspace`` commands, deprecated in favor
  of ``debusine-admin workspace <subcommand>`` in 0.8.0.

  Remove ``debusine-admin create_file_store``, deprecated in favor of
  ``debusine-admin file_store create`` in 0.9.0. (:issue:`886`)
- Moved OIDC validation to code. ``Provider.restrict`` is still supported, but
  deprecated: use ``settings.SIGNON_CLASS`` instead, see the ``DebusineSignon``
  class.

  The ``add_to_group`` option of ``Provider`` now requires a dict mapping
  GitLab
  groups to Debusine groups, instead of a string, and a string value is
  ignored.

  Site-specific code is provided to replicate existing setups for
  ``debusine.debian.net`` and ``debusine.freexian.com``, and can be removed
  once
  both sites are migrated to using dict values for ``add_to_group``.
  (:issue:`898`)
- Refactor server/signon to remove compatibility code.

  This drops the previous ``debusine.DebusineSignon`` class for
  ``SIGNON_CLASS``
  in favour of ``sites.DebianSignon``, only needed for ``debusine.debian.net``.

  The default ``signon.Signon`` class is now sufficient for basic deployments,
  including ``debusine.freexian.com``.

  ``restrict`` has been un-deprecated and is now honored, so that deployments
  like ``debusine.freexian.com`` can restrict logins to given GitLab groups
  without a ``SIGNON_CLASS``.

  No migration strategy is provided: this requires a flag day for
  ``debusine.debian.net`` and ``debusine.freexian.com``, as they used the
  ``DebusineSignon`` class. There should be no breaking changes for other
  deployments introduced with this change. (:issue:`898`)
- Changed the location for local templates in the packaged defaults.

  Additional local templates were loaded from
  ``/var/lib/debusine/server/templates``. This is now changed to
  ``/etc/debusine/server/templates``, which is the correct place for local
  customizations. (:issue:`947`)
- Squashed database migrations from before 0.11.0.  People with older Debusine
  server installations must upgrade to 0.11.* before upgrading to this version.
  (:issue:`975`)
- Rename ``debusine-admin manage_worker`` command to ``debusine-admin worker``.
  The ``--worker-type`` option, if given, must now come after the subcommand
  name (``enable`` or ``disable``).  The old name is still present, but is
  deprecated.

  Rename ``debusine-admin edit_worker_metadata`` command to ``debusine-admin
  worker edit_metadata``.  The old name is still present, but is deprecated.

  Rename ``debusine-admin list_workers`` command to ``debusine-admin worker
  list``.  The old name is still present, but is deprecated.


Features
^^^^^^^^

- Store content-type of files as sent by the client. (:issue:`324`)
- Implement :collection:`debian:archive` collection. (:issue:`329`)
- Add an API endpoint to abort a work request or a workflow. (:issue:`384`)
- Add :artifact:`debian:repository-index` artifacts, and allow adding them to
  :collection:`debian:suite` collections.

  Add a :task:`GenerateSuiteIndexes` task to generate ``Packages``,
  ``Sources``, and ``Release`` files for a suite. (:issue:`755`)
- Add ``url`` and ``scope`` fields to responses from several API views.
  (:issue:`766`)
- Add ``/api/1.0/open-metrics/`` that provides instance usage statistics.
  (:issue:`888`)
- Allow ``Provider.options['add_to_group']`` to match ``nm.debian.org`` user
  statuses when using an ``nm:`` prefix. (:issue:`898`)
- Add ``on_assignment`` :ref:`event <workflow-event-reactions>`.

  Add :ref:`action-skip-if-lookup-result-changed` action, and a new "skipped"
  work request result. (:issue:`907`)
- Ensure that only one workflow callback can run at once for a given workflow.
  (:issue:`908`)
- :task:`APTMirror`: Mirror repository indexes as well as packages.
  (:issue:`945`)
- Add ``debusine-admin worker create`` to create a worker with an activation
  token, as an alternative to letting it register itself and then enabling the
  token separately.
- Extend ``binary`` and ``binary-version`` lookups on
  :collection:`debian:archive` and :collection:`debian:suite` collections to
  include ``Architecture: all`` packages for concrete architecture names.
- Improve reconstruction of lookups by preserving the original spelling of the
  parent collection.


Bug Fixes
^^^^^^^^^

- ``debusine-admin delete_expired``: Optimize calculation of which artifacts
  must be kept. (:issue:`473`)
- Record errors from assigning work requests to workers in
  ``WorkRequest.output_data``. (:issue:`589`)
- Optimize ``Workspace.get_collection``, used by most lookups. (:issue:`786`)
- Fix crashes in ``debusine-admin delete_expired`` and ``debusine-admin
  vacuum_storage`` when trying to clean up expired or old incomplete artifacts
  respectively.

  Make ``debusine-admin delete_expired`` delete files from stores that aren't
  present in any artifact, even if the artifacts they used to be in weren't
  deleted in this ``delete_expired`` run. (:issue:`891`)
- Fix a race when telling the client which of a new artifact's files it needs
  to upload; previously this sometimes resulted in incomplete artifacts when
  two artifacts with overlapping files were created at nearly the same time.

  Forbid creating relations with incomplete artifacts. (:issue:`930`)
- Fix crash in ``debusine-admin delete_expired`` when trying to clean up
  expired workspaces. (:issue:`936`)
- When creating worker, server, or sub-workflow work requests in workflows,
  make them inherit the effective priority of their parent as their base
  priority. (:issue:`973`)
- Work around S3 incompatibility between Hetzner and boto3 >= 1.36.0.


Web UI
~~~~~~

Features
^^^^^^^^

- Display files based on the content-type sent by the client, restricted to a
  set of safe content-types. (:issue:`324`)
- Add web UI to abort a work request or a workflow. (:issue:`384`)
- Add a separate virtual host with archive access views. (:issue:`757`)
- Make it easier for local admins to customize the homepage and footer.
  (:issue:`850`)
- Allow Debian Maintainers to log in via Salsa OIDC authentication.
  (:issue:`898`)
- Add view to test and debug how task configuration is applied. (:issue:`989`)
- Add links to workflow documentation from the web UI.


Bug Fixes
^^^^^^^^^

- Exclude Celery worker from list of workers. (:issue:`559`)
- Add ``--server FQDN/SCOPE`` option to suggested ``debusine
  provide-signature`` command (requires the client to be at least version
  0.11.3). (:issue:`749`)
- Make "workspace not found" errors slightly more generic, since they can also
  cover authorization failures. (:issue:`778`)
- Optimize detail view for large workflows. (:issue:`786`)
- Return 404 when trying to view a nonexistent workflow template, rather than
  logging a noisy traceback. (:issue:`875`)
- Fix display of collection retention periods. (:issue:`890`)
- Support byte-range requests that specify only one of the first and last byte
  positions in the range. (:issue:`956`)


Client
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Print web URLs to objects where possible.  This requires a server with at
  least commit `30dd738393e46f2f2bc0d09aacdfd53297dbba95
  <https://salsa.debian.org/freexian-team/debusine/-/commit/30dd738393e46f2f2bc0d09aacdfd53297dbba95>`__.
  (:issue:`766`)


Features
^^^^^^^^

- Guess content-type of files when uploading them to the server. (:issue:`324`)
- Add ``debusine abort-work-request`` command. (:issue:`384`)
- Allow selecting a server using ``--server FQDN/SCOPE``, as an alternative to
  needing to know the ``[server:...]`` section name in the configuration file.
  (:issue:`749`)
- Added ``debusine task-config-pull`` and ``task-config-push``, to manage
  :collection:`debusine:task-configuration` collections. (:issue:`789`)
- A local copy of the ``.changes`` file can be passed to ``provide-signature``
  for signing and uploading. (:issue:`816`)
- Accept extra command-line arguments to ``debusine
  on-work-request-completed``. (:issue:`966`)


Workflows
~~~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :workflow:`lintian`, :workflow:`qa`, :workflow:`debian_pipeline`: Change
  default value of ``fail_on_severity``/``lintian_fail_on_severity`` to
  ``error``. (:issue:`804`)
- Rename the ``suite_collection`` key of the
  :workflow:`reverse_dependencies_autopkgtest` workflow and the
  ``reverse_dependencies_autopkgtest_suite`` key of the :workflow:`qa` and
  :workflow:`debian_pipeline` workflows to ``qa_suite``.

  :workflow:`piuparts`: Add ``source_artifact`` as a required task data key.
  (:issue:`907`)


Features
^^^^^^^^

- Add :workflow:`debdiff` workflow and integrate it into
  :workflow:`debian_pipeline`. (:issue:`607`)
- Add :workflow:`update_suites` workflow. (:issue:`755`)
- In the :workflow:`sbuild` workflow, configure the same ASPCUD criteria as
  Debian's buildd would use, when targeting ``experimental``. (:issue:`829`)
- :workflow:`update_environments`: Accept ``null`` as an element in a
  ``targets.variants`` list; this may be useful to indicate that an environment
  may be used as a generic environment for any task while also being the most
  suitable environment for particular variants. (:issue:`899`)
- :workflow:`reverse_dependencies_autopkgtest`: Document support for passing
  :artifact:`debian:binary-package` artifacts in ``binary_artifacts`` and
  ``context_artifacts``.

  :workflow:`qa`: Document support for passing
  :artifact:`debian:binary-package` artifacts in ``binary_artifacts``.
  (:issue:`906`)
- :workflow:`autopkgtest`, :workflow:`lintian`, :workflow:`piuparts`,
  :workflow:`qa`, :workflow:`reverse_dependencies_autopkgtest`: Support
  updating a :collection:`debian:qa-results` collection with reference QA
  results. (:issue:`907`)
- :workflow:`autopkgtest`: Implement ``enable_regression_tracking`` parameter
  to perform regression analysis against reference results. (:issue:`908`)
- Add split source/binary upload signing, where the developer signs the source
  package and Debusine signs the binaries. (:issue:`944`)


Bug Fixes
^^^^^^^^^

- Make the :workflow:`package_upload` workflow idempotent. (:issue:`800`)
- :workflow:`lintian`: Constrain child work requests to run on an architecture
  matching the binaries. (:issue:`866`)
- :workflow:`lintian`: Only produce source and binary-all analysis artifacts
  once.

  :workflow:`lintian`: If ``binary_artifacts`` is empty, create a single work
  request to run ``lintian`` on the source package. (:issue:`908`)
- :workflow:`package_upload`: Avoid confusion between the output of different
  :task:`MergeUploads` tasks. (:issue:`914`)
- :workflow:`reverse_dependencies_autopkgtest`: Give child workflows a
  hardcoded priority of -5 relative to their parent workflow, for now.
  (:issue:`973`)
- :workflow:`package_upload`: Constrain :task:`MakeSourcePackageUpload` to run
  on a particular architecture. (:issue:`990`)


Tasks
~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :task:`Lintian`: Change default value of ``fail_on_severity`` to ``error``.
  (:issue:`804`)
- If tasks are given an ``environment`` without a ``variant`` filter,
  automatically try ``variant={task_name}`` followed by ``variant=``.  This may
  require changes to your ``update_environments`` workflows to ensure that a
  generic environment with no variant is always available. (:issue:`899`)


Features
^^^^^^^^

- Display input artifacts for tasks :task:`AssembleSignedSource`,
  :task:`Autopkgtest`, :task:`Blhc`, :task:`CopyCollectionItems`,
  :task:`ExtractForSigning`, :task:`Lintian`, :task:`MakeSourcePackageUpload`,
  :task:`MergeUploads`, Noop, :task:`PackageUpload`, :task:`Piuparts`,
  :task:`SystemBootstrap`, and :task:`SystemImageBuild`. (:issue:`549`)
- :task:`Sbuild`: Add ``build_dep_resolver`` and ``aspcud_criteria`` options.
  (:issue:`829`)
- Require a compatible piuparts version to be available in the environment for
  the :task:`Piuparts` task, when running in a container. (:issue:`867`)
- :task:`Autopkgtest`: Document support for passing
  :artifact:`debian:binary-package` artifacts in ``input.binary_artifacts`` and
  ``input.context_artifacts``.

  :task:`Piuparts`: Support passing :artifact:`debian:binary-package` artifacts
  in ``input.binary_artifacts``. (:issue:`906`)
- :task:`Lintian`: Add ``architecture`` field to :artifact:`debian:lintian`
  artifact. (:issue:`908`)
- :task:`DebDiff`: Speed up this task significantly by avoiding installing most
  of the ``Recommends`` of the ``devscripts`` package.


Bug Fixes
^^^^^^^^^

- Fix DNS resolution during ``customization_script`` execution in
  :task:`SimpleSystemImageBuild` image builds. (:issue:`664`)
- :task:`Piuparts`: Process base tarball in Python rather than using
  ``mmtarfilter``, which wasn't available until Debian 10 (buster).
  (:issue:`867`)
- Ensure that a ``/var/lib/dpkg/available`` file exists when running the
  :task:`Piuparts` task. (:issue:`874`)
- :task:`Lintian`: Fix incorrect parsing of tag explanations for Debian
  bullseye. (:issue:`921`)
- :task:`MergeUploads`: Fix ineffective overlapping-files check when multiple
  input uploads share the same ``.changes`` file name. (:issue:`954`)
- Fix an ``AssertionError`` in the :task:`Piuparts` task, when using
  :artifact:`debian:binary-packages` as input.
- Install ``passwd`` if we need ``useradd`` to create a non-root user inside
  task executors.


Signing
~~~~~~~

Features
^^^^^^^^

- Add :task:`SignRepositoryIndex` task. (:issue:`756`)


General
~~~~~~~

Features
^^^^^^^^

- Add ``components`` attribute to :artifact:`debian:system-tarball` and
  :artifact:`debian:system-image` artifacts. (:issue:`829`)
- Run test suite under ``pytest``.


.. _release-0.11.3:

0.11.3 (2025-07-08)
-------------------

Client
~~~~~~

Features
^^^^^^^^

- A local copy of the ``.changes`` file can be passed to ``provide-signature``
  for signing and uploading. (:issue:`816`)


.. _release-0.11.2:

0.11.2 (2025-07-03)
-------------------

Client
~~~~~~

Features
^^^^^^^^

- Allow selecting a server using ``--server FQDN/SCOPE``, as an alternative to
  needing to know the ``[server:...]`` section name in the configuration file.
  (:issue:`749`)


.. _release-0.11.1:

0.11.1 (2025-05-04)
-------------------

Server
~~~~~~

Bug Fixes
^^^^^^^^^

- Set ``Vary: Cookie, Token`` on all HTTP responses. (:issue:`761`)
- Return multiple lookup results in a predictable order, to make it easier for
  workflows to be idempotent. (:issue:`796`)
- Fix regression in ``update_workflows`` Celery task.


Web UI
~~~~~~

Features
^^^^^^^^

- Add a :artifact:`debdiff <debian:debdiff>` artifact view. (:issue:`714`)
- Added list and detail views for WorkerPool. (:issue:`733`)
- Add number of files in the "Files" tab of the artifact view.
- Redesigned table sorting and header rendering.


Bug Fixes
^^^^^^^^^

- Redesigned table filtering. (:issue:`475`)
- Search collection page: fix "str failed to render" error in table headers.
  (:issue:`799`)
- :task:`Autopkgtest`: Render extra repositories as deb822 sources.
  (:issue:`828`)
- Change the default tab in the artifact view to "Files". (:issue:`848`)
- :task:`Autopkgtest`: Fix the "Distribution" field.


Miscellaneous
^^^^^^^^^^^^^

- :issue:`420`, :issue:`814`


Client
~~~~~~

Features
^^^^^^^^

- ``debusine setup``: Manage the default server setting. (:issue:`780`)


Bug Fixes
^^^^^^^^^

- Wrap Debusine errors so that they're shown cleanly by ``dput-ng``.
  (:issue:`827`)
- Improve logging while uploading individual files to artifacts.
  (:issue:`839`)
- Fix handling of responses without ``Content-Type``.


Workflows
~~~~~~~~~

Features
^^^^^^^^

- Allow overriding the ``environment`` in the :workflow:`piuparts` workflow.
  Allow overriding the ``piuparts_environment`` in the :workflow:`qa` and
  :workflow:`debian_pipeline` workflows. (:issue:`638`)


Bug Fixes
^^^^^^^^^

- In the :workflow:`autopkgtest`, :workflow:`piuparts` and
  :workflow:`sbuild` workflows, extend children's ``extra_repositories``
  with overlay repositories (e.g. ``experimental``) if ``codename`` is a
  known overlay. (:issue:`780`)
- :workflow:`make_signed_source`: Disambiguate handling of multiple signing
  templates for a single architecture.

  :workflow:`make_signed_source`: Provide :artifact:`debian:upload`
  artifacts as ``signed-source-*`` outputs, not
  :artifact:`debian:source-package`.

  :workflow:`debian_pipeline`: Upload signed source packages and their
  binaries if necessary. (:issue:`796`)
- :workflow:`sbuild`: Improve workflow orchestration error when no
  environments were found.  (:issue:`830`)


Tasks
~~~~~

Bug Fixes
^^^^^^^^^

- :task:`Lintian`: Use ``lintian --print-version`` to extract the version.
  (:issue:`609`)
- Fix a variety of bugs in :task:`SimpleSystemImageBuild` image builds, that
  broke use with the ``incus-vm`` and ``qemu`` executors.
  Only require the ``python3-minimal`` package to be installed for the ``qemu``
  executor. (:issue:`664`)
- :task:`DebDiff`: Install ``diffstat`` package, to make the ``--diffstat``
  flag work. (:issue:`748`)
- :task:`DebDiff`: Create ``relates-to`` relations to binary artifacts.


Worker
~~~~~~

Bug Fixes
^^^^^^^^^

- Incus LXC instances now wait for ``systemd-networkd`` to declare the network
  online, before running autopkgtests. (:issue:`812`)


General
~~~~~~~

Documentation
^^^^^^^^^^^^^

- Add new project management practices page. (:issue:`784`)
- Update playground setup advice. (:issue:`797`)
- Update the introduction with more recent content.


.. _release-0.11.0:

0.11.0 (2025-04-15)
-------------------

Server
~~~~~~

Features
^^^^^^^^

- Delete artifacts that were created more than a day ago and are still
  incomplete. (:issue:`667`)


Bug Fixes
^^^^^^^^^

- Don't create a workflow if its input validation fails. (:issue:`432`)
- Only retry work requests up to three times in a row due to worker failures.
  (:issue:`477`)
- Rename ``debusine-server-artifacts-cleanup.{service,timer}`` to
  ``debusine-server-delete-expired.{service,timer}``, to better reflect the
  function of those units. (:issue:`636`)
- :task:`APTMirror`: Ensure that only one mirroring task for a given
  collection runs at once. (:issue:`694`)
- Don't set the Celery worker's concurrency to 1 in the database when starting
  the scheduler or provisioner service. (:issue:`751`)
- Record errors from server tasks in ``WorkRequest.output_data``.
  (:issue:`785`)
- Optimize computing the runtime status of large workflows.
  Batch expensive workflow updates and defer them to a Celery task.
  (:issue:`786`)


Documentation
^^^^^^^^^^^^^

- Update :ref:`configure-gitlab-sso` to account for a renamed module.


Web UI
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Remove FileInArtifact IDs from file links.

``<scope>/<workspace>/artifact/<artifact_id>/raw/<file_in_artifact_id>/<path>``
  becomes ``…/<artifact_id>/raw/<path>``.

``<scope>/<workspace>/artifact/<artifact_id>/file/<file_in_artifact_id>/<path>``
  becomes ``…/<artifact_id>/file/<path>``. (:issue:`621`)


Features
^^^^^^^^

- Better usability for the token generation UI: copy token to clipboard, show a
  config snippet with the token. (:issue:`421`)
- Downloading an artifact without the archive= query parameter autodetects the
  file type.

  This means that a download will by default produce a tarball only if the
  artifact contains more than one file. One can explicitly add
  ``?archive=tar.gz`` to force always returning a tarball. (:issue:`621`)
- Add view raw and download buttons to all file display widgets.
  (:issue:`621`)
- Add an indication to ``/-/status/workers/`` showing each worker's pool.
  Exclude inactive pool workers from ``/-/status/workers/``.
  Add worker details page. (:issue:`733`)


Bug Fixes
^^^^^^^^^

- Work requests now show validation/configuration errors. (:issue:`651`)


Client
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Move Debusine-specific entries in ``dput-ng`` profiles from keys in a nested
  ``debusine`` object to top-level ``debusine_*`` keys, to make them easier to
  override in local profiles.


Features
^^^^^^^^

- Add ``bullseye-security``, ``bookworm``, and ``bookworm-security`` entries to
  the ``dput-ng`` profile for ``debusine.debian.net``.
- Show more useful information for 404 responses.


Bug Fixes
^^^^^^^^^

- Fix file uploads if ``api-url`` is configured with a trailing slash.
  (:issue:`793`)


Workflows
~~~~~~~~~

Features
^^^^^^^^

- Restrict starting workflows to workspace contributors. (:issue:`625`)


Bug Fixes
^^^^^^^^^

- Record errors from ``Workflow.ensure_dynamic_data``. (:issue:`589`)
- Record orchestrator errors in ``WorkRequest.output_data``.
  :workflow:`reverse_dependencies_autopkgtest`: Validate
  ``suite_collection`` parameter. (:issue:`651`)
- Use ``|`` instead of ``/`` as a collection item prefix separator in
  workflows, since ``/`` is used to separate lookup string segments.
  :workflow:`reverse_dependencies_autopkgtest`: Fix orchestration failure
  for source package versions containing a colon.


Tasks
~~~~~

Features
^^^^^^^^

- :task:`MergeUploads`: Reimplement ``mergechanges`` in Python, for
  efficiency and to avoid problems with buggy versions of ``mawk`` in some
  old Debian releases. (:issue:`512`)


Bug Fixes
^^^^^^^^^

- :task:`ExtractForSigning`: Tolerate overlap between template and binary
  artifacts. (:issue:`763`)


Signing
~~~~~~~

Documentation
^^^^^^^^^^^^^

- Document how to find generated signing keys. (:issue:`771`)


General
~~~~~~~

Documentation
^^^^^^^^^^^^^

- Rework :ref:`tutorial-getting-started` to create a workflow. (:issue:`764`)


Miscellaneous
^^^^^^^^^^^^^

- :issue:`743`


.. _release-0.10.0:

0.10.0 (2025-04-02)
-------------------

Server
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :task:`CreateExperimentWorkspace <CreateChildWorkspace>`: Redefine
  ``expiration_delay`` as a number of days rather than a duration.
- Use Debusine permissions for managing workflow templates.  If you previously
  granted yourself the ``add_workflowtemplate`` permission, see the
  :ref:`updated tutorial <tutorial-getting-started>` for how to grant yourself
  owner access to a workspace.


Features
^^^^^^^^

- Store worker pool statistics on task completion and worker shutdown.
  Implement provisioning of pool workers. (:issue:`721`)


Bug Fixes
^^^^^^^^^

- Retry any running work requests when terminating pool workers.
  (:issue:`731`)
- Limit status views of running external tasks (``/api/1.0/service-status/``
  and ``/-/status/queue/``) to worker tasks. (:issue:`750`)


Documentation
^^^^^^^^^^^^^

- Document cloud worker pools and storage. (:issue:`735`)


Web UI
~~~~~~

Features
^^^^^^^^

- Add an audit log for group-related changes. (:issue:`734`)


Bug Fixes
^^^^^^^^^

- Fix link to workflows that need input.


Client
~~~~~~

Features
^^^^^^^^

- Add ``debusine setup`` for editing server configuration interactively.
  (:issue:`711`)
- Add ``dput-ng`` integration. (:issue:`713`)


Bug Fixes
^^^^^^^^^

- ``debusine provide-signature``: Always pass ``--re-sign`` to ``debsign``.
  (:issue:`713`)


Workflows
~~~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :workflow:`create_experiment_workspace <create_child_workspace>`: Redefine
  ``expiration_delay`` as a number of days rather than a duration.


Bug Fixes
^^^^^^^^^

- :workflow:`make_signed_source`: Pass unsigned binary artifacts to
  :workflow:`sbuild` sub-workflow via ``input.extra_binary_artifacts``.
  (:issue:`727`)
- :workflow:`autopkgtest`, :workflow:`lintian`: Handle
  :artifact:`debian:upload` source artifacts without original upstream
  source. (:issue:`744`)


Documentation
^^^^^^^^^^^^^

- :workflow:`make_signed_source`: No longer document
  :artifact:`debian:binary-packages` artifacts as being accepted in
  ``binary_artifacts``; they never worked. (:issue:`747`)


Tasks
~~~~~

Features
^^^^^^^^

- :task:`Sbuild`: Accept :artifact:`debian:upload` artifacts in
  ``input.extra_binary_artifacts``. (:issue:`727`)


Bug Fixes
^^^^^^^^^

- :task:`ExtractForSigning`: If given :artifact:`debian:upload` artifacts in
  ``binary_artifacts``, follow ``extends`` relationships to find the
  underlying :artifact:`debian:binary-package` artifacts. (:issue:`747`)
- Handle errors while fetching task input more gracefully. (:issue:`763`)


.. _release-0.9.1:

0.9.1 (2025-03-24)
------------------

Server
~~~~~~

Features
^^^^^^^^

- Automatically add task runs to the appropriate
  :collection:`debusine:task-history` collection. (:issue:`510`)
- Support Hetzner Object Storage.
  Support worker pools on Hetzner Cloud. (:issue:`543`)
- Accept scope prefixes in ``debusine-admin create_collection --workspace`` and
  ``debusine-admin create_work_request --workspace``. (:issue:`608`)
- Implement ``populate`` and ``drain`` storage policies in ``debusine-admin
  vacuum_storage``.
  Implement store-level ``soft_max_size`` and ``max_size`` limits in
  ``debusine-admin vacuum_storage``. (:issue:`684`)
- :asset:`debusine:cloud-provider-account` asset: Add optional
  ``configuration.s3_endpoint_url`` for the ``aws`` provider type.
  (:issue:`685`)
- Add roles to group memberships. (:issue:`697`)
- Add ``debusine-admin worker_pool`` command.
  Add internal per-provider API for launching and terminating dynamic workers.
  (:issue:`720`)
- Support worker pools on AWS EC2. (:issue:`722`)


Bug Fixes
^^^^^^^^^

- Add a ``DEBUSINE_DEFAULT_WORKSPACE`` Django setting, for use if the default
  workspace has been renamed to something other than "System". (:issue:`571`)
- Only upload to write-only stores when applying the ``populate`` storage
  policy in ``debusine-admin vacuum_storage``, not elsewhere. (:issue:`684`)


Documentation
^^^^^^^^^^^^^

- Document file stores. (:issue:`541`)
- Document :task:`CreateExperimentWorkspace <CreateChildWorkspace>` task.
  (:issue:`542`)


Web UI
~~~~~~

Features
^^^^^^^^

- Add web UI for group management: list groups, add/remove users, change user
  roles. (:issue:`542`)


Bug Fixes
^^^^^^^^^

- Do not show "Plumbing" in the navigation bar if the view is not
  workspace-aware. (:issue:`675`)


Workflows
~~~~~~~~~

Features
^^^^^^^^

- :workflow:`package_publish`: Copy :collection:`debusine:task-history`
  items from the same workflow. (:issue:`510`)


Documentation
^^^^^^^^^^^^^

- Document :workflow:`create_experiment_workspace <create_child_workspace>`.
  (:issue:`542`)
- Document how to implement a new workflow. (:issue:`693`)


Tasks
~~~~~

Features
^^^^^^^^

- :task:`MmDebstrap`, :task:`SimpleSystemImageBuild`: Support reading
  keyrings from ``/usr/local/share/keyrings/``. (:issue:`739`)


Worker
~~~~~~

Features
^^^^^^^^

- Add worker activation tokens, which can be used to auto-enable pool workers
  when they start without needing to expose worker tokens in ``cloud-init``
  user-data. (:issue:`732`)


General
~~~~~~~

Miscellaneous
^^^^^^^^^^^^^

- :issue:`729`


.. _release-0.9.0:

0.9.0 (2025-02-25)
------------------

Server
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- File stores are now linked to scopes rather than to workspaces.  They can be
  configured using ``debusine-admin scope``.
  ``debusine-admin workspace define`` and ``debusine-admin workspace list`` (as
  well as the deprecated ``debusine-admin create_workspace``, ``debusine-admin
  manage_workspace``, and ``debusine-admin list_workspaces`` commands) no
  longer handle file stores. (:issue:`682`)
- Rename ``debusine-admin create_file_store`` command to ``debusine-admin
  file_store create``.  (The old name is still present, but is deprecated.)
  (:issue:`683`)
- Rename ``debusine-admin monthly_cleanup`` to ``debusine-admin
  vacuum_storage``, and run it daily.  Rename the associated ``systemd`` units
  similarly. (:issue:`684`)


Features
^^^^^^^^

- Implement :ref:`task configuration mechanism <task-configuration>`.
  (:issue:`508`)
- Implement :collection:`debusine:task-history` collection. (:issue:`510`)
- Add API: ``1.0/asset/`` to create and list :ref:`assets`.
  Add API:
  ``1.0/asset/<str:asset_category>/<str:asset_slug>/<str:permission_name>`` to
  check permissions on :ref:`assets`.
  Add ``debusine-admin asset`` management command to manage asset permissions.
  (:issue:`576`)
- Add ``debusine-admin scope add_file_store``, ``debusine-admin scope
  edit_file_store``, and ``debusine-admin scope remove_file_store`` commands.
  Add an ``instance_wide`` field to file stores, defaulting to True, which can
  be configured using the ``--instance-wide``/``--no-instance-wide`` options to
  ``debusine-admin file_store create``.  Non-instance-wide file stores may only
  be used by a single scope.
  Add ``soft_max_size`` and ``max_size`` fields to file stores, which can be
  configured using the ``--soft-max-size`` and ``--max-size`` options to
  ``debusine-admin file_store create``. (:issue:`682`)
- Add ``debusine-admin scope show`` command.
  Add ``debusine-admin file_store delete`` command.
  Make ``debusine-admin file_store create`` idempotent. (:issue:`683`)
- Generalize sweeps by ``debusine-admin vacuum_storage`` over files in local
  storage to be able to handle other backends. (:issue:`684`)
- Add ``debusine-admin asset create`` command.
  Add an :file-backend:`S3` file backend.
  Add ``--provider-account`` option to ``debusine-admin file_store create``, to
  allow linking file stores to cloud provider accounts. (:issue:`685`)
- Add :asset:`debusine:cloud-provider-account` asset. (:issue:`696`)
- Implement ephemeral groups. (:issue:`697`)
- Add a plugin for the Munin monitoring server.
  If run on the server, it should be able to automatically configure itself.
  It provides three graphs.
  The workrequest queue length is graphed by type and by worker architecture.
  The third graph shows the number of registered, connected and busy workers.


Bug Fixes
^^^^^^^^^

- Deal with expired work requests without an internal collection that are
  referenced by build logs.
  Fix deleting expired work requests with child work requests referenced by
  build logs. (:issue:`635`)
- Explicitly depend on ``libjs-select2.js`` in the ``debusine-server`` package.
- Set current context when running server tasks.


Documentation
^^^^^^^^^^^^^

- Add blueprint for dynamic cloud compute scaling. (:issue:`538`)
- Add blueprint for dynamic cloud storage scaling. (:issue:`539`)
- Split artifacts documentation by category. (:issue:`541`)
- Add blueprint for cloning workspaces for experiments.
  Add blueprint for granting ``ADMIN`` roles on groups to users. (:issue:`542`)


Miscellaneous
^^^^^^^^^^^^^

- :issue:`666`, :issue:`704`


Web UI
~~~~~~

Features
^^^^^^^^

- Workspaces can now be set to expire. Owners can configure this and other
  attributes in the web UI. (:issue:`698`)
- Display configured task data (see :ref:`task-configuration`) in views that
  display work requests. (:issue:`707`)
- ``/{scope}/{workspace}/workflow/``: Add ``label`` tag to "With failed work
  requests", to allow enabling/disabling the checkbox by clicking on the text.


Bug Fixes
^^^^^^^^^

- Fix collection item detail URLs to allow slashes in names. (:issue:`676`)
- Handle empty Lintian artifacts. (:issue:`677`)
- Filter workflow template detail view to the current workspace. (:issue:`680`)
- Preserve redirect URL on login. (:issue:`717`)
- Fix title of homepage and scope pages.


Client
~~~~~~

Features
^^^^^^^^

- Add ``asset_create`` and ``asset_list`` methods to create and list
  :ref:`assets`.
  Add ``create-asset`` and ``list-assets`` commands to create and list assets.
  Add ``asset_permission_check`` method to check permissions on :ref:`assets`.
  (:issue:`576`)


Workflows
~~~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :workflow:`debian_pipeline`, :workflow:`make_signed_source`,
  :workflow:`package_upload`: Signing keys are now specified by fingerprint,
  rather than a lookup for an asset.
  Remove the ``debian:suite-signing-keys`` collection. (:issue:`576`)


Features
^^^^^^^^

- Add ``subject`` to dynamic data for all workflows. (:issue:`679`)
- Add workflow to create an experiment workspace. (:issue:`699`)


Bug Fixes
^^^^^^^^^

- :workflow:`make_signed_source`: Fix passing of
  :artifact:`debusine:signing-input` artifacts between workflow steps.
  (:issue:`689`)
- Fix handling of dependencies between workflows.  In most cases workflows
  themselves shouldn't have dependencies, but the :workflow:`sbuild`
  sub-workflow created by :workflow:`make_signed_source` is an exception.
  (:issue:`690`)
- :workflow:`make_signed_source`: Pass all outputs from the :task:`Sign`
  task through to the :task:`AssembleSignedSource` task, not just one of
  them. (:issue:`692`)
- :workflow:`make_signed_source`: Fix orchestration of :workflow:`sbuild`
  sub-workflow. (:issue:`695`)


Tasks
~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :task:`Sbuild`: Remove ``schroot`` support. (:issue:`660`)


Features
^^^^^^^^

- Add ``subject``, ``configuration_context``, and ``runtime_context`` to
  dynamic data for all worker tasks. (:issue:`679`)


Bug Fixes
^^^^^^^^^

- Fix accidental leakage of keyring and customization script names between
  :task:`MmDebstrap` task instances on the same worker, leading to task
  failure. (:issue:`686`)


Worker
~~~~~~

Features
^^^^^^^^

- Record runtime statistics for tasks. (:issue:`510`)
- Log task stages to a work request debug log as well.


Bug Fixes
^^^^^^^^^

- Fix various worker asyncio issues.


Signing
~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :task:`GenerateKey`: The result is now a :asset:`debusine:signing-key`
  :ref:`asset <assets>` rather than an :ref:`artifact <artifact-reference>`.
  :task:`Debsign`, :task:`Sign`: The ``key`` parameter is now the key's
  fingerprint, rather than an asset lookup.
  :task:`Sign`, :task:`Debsign`: The ``signer`` role is required on signing
  key assets, by the work request creator. (:issue:`576`)


Features
^^^^^^^^

- Allow recording username and resource data in the signing service audit log.
  Record the username and resource description in the audit log, in the
  :task:`Sign` and :task:`Debsign` tasks. (:issue:`576`)


General
~~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Add a new primitive, :ref:`assets`, to represent objects that need
  permissions, like :asset:`debusine:signing-key`.
  Existing work requests and workflows are migrated to refer to signing keys by
  fingerprint.
  Existing ``debusine:signing-key`` artifacts are migrated to assets.
  We recommend that Debusine admins audit their database for any remaining
  artifacts with category ``debusine:signing-key``, and remove them after
  confirming that they have been migrated to assets. This will require removing
  any related artifact relations first. Audit query: ``SELECT * FROM
  db_artifact WHERE category='debusine:signing-key';`` (:issue:`576`)


.. _release-0.8.1:

0.8.1 (2025-01-13)
------------------

Server
~~~~~~

Features
^^^^^^^^

- New view with list of workflows (``/<scope>/<workspace>/workflow/``). List
  workflow templates with stats in the workspace view
  (``/<scope></workspace>/``), new view with specific template information
  (``/<scope>/<workspace>/workflow-template/<workflow-template>/``).
  (:issue:`400`)


Bug Fixes
^^^^^^^^^

- Use an in-memory channel layer for tests, rather than Redis. (:issue:`617`)
- Fix cleanup of expired work requests referenced by internal collections.
  (:issue:`644`)
- Retry any work requests that a worker is currently running when it asks for a
  new work request. (:issue:`667`)
- Fix tests with python-debian >= 0.1.50. (:issue:`672`)


Documentation
^^^^^^^^^^^^^

- Split collections documentation by category. (:issue:`541`)


Web UI
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Reorganize ``/-/user/`` URLs to contain the user name, and move the logout
  view to ``/-/logout/``. (:issue:`649`)
- Remove ``/view/`` from workspace view path (``/<scope>/<workspace>/view/``).


Features
^^^^^^^^

- Add workflows split-button pulldown to base template. (:issue:`620`)
- For workflows that need input, link to the first work request that needs
  input. (:issue:`674`)
- Add a user detail view.
- Extend workspace detail view to show figures about workflows.
- Use `select2 <https://select2.org/>`__ for the multiple choice fields on the
  workflow list form.


Bug Fixes
^^^^^^^^^

- Hide collections with the category ``workflow-internal`` from the navbar
  collections dropdown. (:issue:`639`)
- Return 404 when trying to view incomplete files, rather than logging a noisy
  traceback.
  Don't link to incomplete files, and mark them as "(incomplete)".
  Mark artifacts as incomplete in artifact lists if any of their files are
  incomplete. (:issue:`667`)
- Fix ordering of workers list by "Last seen". (:issue:`669`)


Workflows
~~~~~~~~~

Features
^^^^^^^^

- :workflow:`debian_pipeline`, :workflow:`qa`,
  :workflow:`reverse_dependencies_autopkgtest`, :workflow:`sbuild`: Support
  :artifact:`debian:upload` artifacts as input. (:issue:`590`)
- :workflow:`autopkgtest`, :workflow:`piuparts`,
  :workflow:`reverse_dependencies_autopkgtest`, :workflow:`qa`,
  :workflow:`debian_pipeline`: Add support for ``extra_repositories``.
  (:issue:`622`)


Bug Fixes
^^^^^^^^^

- Fix looking up the architecture from a lookup that returns an artifact from a
  collection. (:issue:`661`)


Tasks
~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :task:`Autopkgtest`: Replace the ``extra_apt_sources`` property with
  ``extra_repositories``, following the same syntax as :task:`Sbuild`.
  (:issue:`622`)


Features
^^^^^^^^

- Gather runtime statistics from executors. (:issue:`510`)
- :task:`Piuparts`: Add support for ``extra_repositories``. (:issue:`622`)
- :task:`SimpleSystemImageBuild`: Switch from debos to debefivm-create for
  VM image creation. This also drops support for the Debian Jessie release.


Bug Fixes
^^^^^^^^^

- :task:`Piuparts`: Compress processed base tarball for pre-1.3
  compatibility. (:issue:`638`)


General
~~~~~~~

Miscellaneous
^^^^^^^^^^^^^

- :issue:`648`, :issue:`670`


.. _release-0.8.0:

0.8.0 (2024-12-26)
------------------

Server
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Refactor tabular output to also allow machine-readable YAML. (:issue:`247`)
- Add permission checks to all API views that accept user authentication.
  (:issue:`568`)
- Enforce permissions when creating artifacts. (:issue:`614`)
- Deprecate ``debusine-admin create_workspace``, ``delete_workspace``,
  ``list_workspace`` and ``manage_workspace`` in favor of
  ``debusine-admin workspace <subcommand>``.
  ``debusine-admin workspace create`` creates workspaces with a default
  30-days expiration delay (instead of no expiration by default for
  ``create_workspace``), and requires an existing owner group to be
  specified. (:issue:`640`)
- Enforce permissions when retrying work requests.


Features
^^^^^^^^

- ``debusine-admin create_workspace``: Assign an owners group, controlled by
  the ``--with-owners-group`` option. (:issue:`527`)
- Add infrastructure to help enforcing permissions in views. (:issue:`598`)
- Record information about any originating workflow template in work requests,
  and add a cached human-readable summary of their most important parameters.
  (:issue:`618`)
- Implement ``debusine-admin group list`` and ``debusine-admin group members``.
  (:issue:`623`)
- Add a contributor role for workspaces; contributors can display the workspace
  and create artifacts in it. (:issue:`625`)
- Introduce new ``debusine-admin workspace`` subcommand, regrouping and
  expanding the existing ``*_workspace``. See :ref:`debusine-admin
  workspace <debusine-admin-cli-workspace>`. (:issue:`640`)
- Allow bare artifact IDs in workflow input.


Bug Fixes
^^^^^^^^^

- Validate new scope, user, collection, and notification channel names.
  (:issue:`551`)
- Allow creating workflows using scoped workspace names. (:issue:`570`)
- Report workflow validation errors directly to the client on creation, rather
  than leaving unvalidated workflows lying around in error states.
  (:issue:`633`)
- Set up permissions context when running server tasks. (:issue:`642`)
- Port to Django 5.1. (:issue:`646`)
- Check work request status when running Celery tasks, to guard against
  mistakes elsewhere.
- Enable Django's ``ATOMIC_REQUESTS`` setting, avoiding a class of mistakes
  where views forget to wrap their changes in a transaction.
- Implement ``add_to_group`` option in signon providers.
- Link externally-signed artifacts to the :task:`ExternalDebsign` work
  request.


Miscellaneous
^^^^^^^^^^^^^

- :issue:`626`, :issue:`643`


Web UI
~~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- Drop workspaces from homepage; they are now visible on scope pages instead.
  (:issue:`554`)
- Move ``/api-auth/`` views to ``/api/auth/``. (:issue:`581`)
- Move ``admin``, ``task-status``, ``user``, and ``workers`` views to unscoped
  URLs. (:issue:`582`)
- Move account-related views to unscoped URLs. (:issue:`583`)
- Move work request URLs under workspaces. (:issue:`584`)
- Move artifact URLs under workspaces. (:issue:`585`)


Features
^^^^^^^^

- Set the current workspace in views that use it. (:issue:`395`)
- Move "Workers" and "Task status" from the navigation bar to the footer.
  Add a per-scope landing page.
  Add a "Collections" menu in workspaces.
  Add view to list and filter workflows. (:issue:`557`)
- Show current and other workspaces in base template. (:issue:`624`)
- Merge workspace list into scope detail view. (:issue:`629`)
- Show the current scope as the "brand", with an optional label and icon.
  (:issue:`630`)
- Display git-based version information in footer. (:issue:`631`)
- Show results in workflow views.
- Show workflow details open by default.


Bug Fixes
^^^^^^^^^

- Silence unnecessary logging when viewing invalid work requests.
  (:issue:`588`)
- Log out via ``POST`` rather than ``GET``. (:issue:`646`)
- :task:`ExternalDebsign`: Fix "Waiting for signature" card.
- Consider task type when selecting work request view plugins.
- Fix "Last Seen" and "Status" for Celery workers.
- List workflow templates in workspace detail view.


Documentation
^^^^^^^^^^^^^

- Document scope as required in client configuration, and simplify example if
  there is only one. (:issue:`613`)


Miscellaneous
^^^^^^^^^^^^^

- :issue:`645`


Client
~~~~~~

Documentation
^^^^^^^^^^^^^

- Add documentation for the client configuration file. (:issue:`613`)


Workflows
~~~~~~~~~

Features
^^^^^^^^

- Add :workflow:`package_publish` workflow. (:issue:`396`)
- Add :workflow:`reverse_dependencies_autopkgtest` workflow. (:issue:`397`)
- :workflow:`autopkgtest`, :workflow:`sbuild`: Implement
  ``arch_all_host_architecture``. (:issue:`574`)
- :workflow:`sbuild`: Implement ``extra_repositories``. (:issue:`622`)
- :workflow:`package_upload`: Support uploading to delayed queues.


Bug Fixes
^^^^^^^^^

- :workflow:`debian_pipeline`: Handle some ``build-*`` promises being
  missing.
- :workflow:`make_signed_source`, :workflow:`package_upload`: Fix invalid
  creation of some child work requests. Add validation to catch such
  problems in future.
- :workflow:`package_upload`: Set correct task type for ``ExternalDebsign``.
- Fix work request statuses in several workflows.
- Mark empty workflows as completed.


Documentation
^^^^^^^^^^^^^

- Point to the workflow template list.


Tasks
~~~~~

Incompatible Changes
^^^^^^^^^^^^^^^^^^^^

- :task:`Sbuild`: Stop running ``lintian``; it's now straightforward to run
  both ``sbuild`` and ``lintian`` in sequence using the
  :workflow:`debian_pipeline` workflow. (:issue:`260`)


Features
^^^^^^^^

- :task:`Sbuild`: Implement ``extra_repositories``. (:issue:`622`)
- :task:`Lintian`, :task:`Piuparts`: Capture ``apt-get`` output.


Bug Fixes
^^^^^^^^^

- :task:`Sbuild`: Don't count it as a success if the host architecture is
  not supported by the source package. (:issue:`592`)
- :task:`Sbuild`: Drop the redundant ``--no-clean`` argument. (:issue:`603`)
- :task:`Piuparts`: Handle ``piuparts`` being in either ``/usr/sbin`` or
  ``/usr/bin``.
- Wait for Incus instances to boot systemd.


Documentation
^^^^^^^^^^^^^

- Split task documentation by task types.


Miscellaneous
^^^^^^^^^^^^^

- :issue:`652`


Signing
~~~~~~~

Documentation
^^^^^^^^^^^^^

- Add blueprint for restricting use of signing keys. (:issue:`576`)


General
~~~~~~~

Features
^^^^^^^^

- Enforce ``mypy``'s strict mode across the whole codebase.


Bug Fixes
^^^^^^^^^

- Ensure consistent ``LANG`` settings in systemd services. (:issue:`494`)
- Reset failed ``*-migrate`` services in integration tests.


.. _release-0.7.2:

0.7.2 (2024-11-13)
------------------

Quality
~~~~~~~

* Use ``hello`` from bookworm in piuparts integration test.

.. _release-0.7.1:

0.7.1 (2024-11-12)
------------------

Quality
~~~~~~~

* Fetch packages from matching suites in integration tests.

.. _release-0.7.0:

0.7.0 (2024-11-12)
------------------

Server
~~~~~~

* Unblock reverse-dependencies when aborting a work request.
* Upgrade to Django 4.2.
* Implement an admin role for scopes.
* Validate group names.
* Add ``debusine-admin group`` management command.
* Add :workflow:`make_signed_source` workflow.
* Add API for monitoring worker status.
* Add roles for workspaces.
* Handle scopes in workspace management commands.
* Add an initial set of permission predicates.
* Add scope visibility permission check.
* Use workspace permissions in collection lookup.
* Force evaluation of lazy ``request.user`` in ``AuthorizationMiddleware``.
* Don't ignore failed elements of multiple lookups.
* Make the default workspace public.
* Improve command-line handling of constraint violations.
* Add :ref:`singleton collections <collection-singleton>`.
* Add permission for creating workspaces.
* Add :workflow:`lintian` workflow.
* Fix ``debusine-admin create_workspace --default-expiration-delay``
  command-line parsing.
* Support lookups that match items of multiple types.
* Add :workflow:`piuparts` workflow.
* Add :workflow:`qa` workflow.
* Implement ``signing_template_names`` in :workflow:`sbuild` workflow.
* Add ``same_work_request`` lookup filter to
  :collection:`debian:package-build-logs` collection.
* Add :workflow:`debian_pipeline` workflow.
* Add :task:`CopyCollectionItems` task.

Web UI
~~~~~~

* Disallow public access to work requests in private workspaces.
* Prototype implementation of scopes in URLs.
* Handle workspaces with the same name in different scopes.
* Remove ``workspace/`` segment from URLs.

Client
~~~~~~

* Implement scope support.
* Correctly download artifacts with directories in file paths.

Worker
~~~~~~

* :task:`SystemBootstrap`:

  * Allow keyring URLs starting with ``file:///usr/share/keyrings/``.
  * Write non-ASCII-armored keyrings to ``.gpg`` rather than ``.asc``.

* :task:`Sbuild`:

  * Relax ``binnmu_maintainer`` validation in dynamic data to avoid failures
    if ``DEBUSINE_FQDN`` is under a non-email-suitable domain.
  * Drop unnecessary ``sbuild:host_architecture`` from dynamic metadata.

* Add :task:`DebDiff` task.

Signing
~~~~~~~

* :task:`Sign`:

  * Fail if signing failed.
  * Use detached signatures when signing UEFI files.
  * Take multiple unsigned artifacts and sign them all with the same key.

* Register :task:`Debsign` task, which previously existed but was unusable.

Documentation
~~~~~~~~~~~~~

* Indicate that kmod keys aren't (yet?) supported.
* Split signing service documentation into :ref:`explanation
  <explanation-signing-service>` and :ref:`reference
  <reference-signing-service>`.
* Add an :ref:`explanation of lookups <explanation-lookups>`.
* Document the :ref:`debusine-worker CLI <debusine-worker-cli>`.
* Move :ref:`artifact relationships <artifact-relationships>` documentation
  to reference.
* Point to bookworm-backports instead of deb.freexian.com.
* Update :ref:`add-new-worker` to explain how to enable a signing worker.
* Add :ref:`how-to for configuring a YubiHSM <configure-hsm>`.
* Install a signing worker in the :ref:`installation tutorial
  <tutorial-install-debusine>`.
* Document the :ref:`debusine-signing CLI <debusine-signing-cli>`.
* Add blueprint for changing the UI to be more workflow-centered.
* Restructure the hierarchy of reference documentation pages.
* Document how to generate signing keys.
* Add blueprint for copying artifacts between workspaces.
* Add blueprint for a URL redesign.

Quality
~~~~~~~

* Add more type annotations for tasks.
* Fix test failures in non-English locales.
* Skip simplesystemimagebuild test with UML >= 6.11um1 for now.

.. _release-0.6.0:

0.6.0 (2024-10-10)
------------------

Server
~~~~~~

* Tighten up handling of creating artifacts with files that already exist.
* Add ``Wait`` task type.
* Add :task:`Delay` task.
* Add :task:`ExternalDebsign` task and a corresponding API view to allow a
  client to provide a signature to it.
* Add a system for coordinating multiple sub-workflows within a higher-level
  workflow.
* Introduce :ref:`scopes <explanation-scopes>`.
* Introduce a basic application context.
* Run workflow orchestrators via Celery.
* Add :workflow:`autopkgtest` workflow.
* Add ``debusine-admin scope`` command.
* Add :ref:`action-retry-with-delays` action for use in ``on_failure`` event
  reactions.
* :workflow:`sbuild` workflow:

  * Support build profiles.
  * Add ``retry_delays``, which can be used for simplistic retries of
    dependency-wait failures.

* Let ``nginx`` gzip-compress text responses.
* Add :task:`PackageUpload` task.
* Add :workflow:`package_upload` workflow.

Web UI
~~~~~~

* Improve label for :artifact:`debian:binary-package` artifacts.
* Show "Waiting for signature" card on blocked :task:`ExternalDebsign`
  requests.
* Show forward and reverse-extends artifact relations.

Client
~~~~~~

* Add ``debusine provide-signature`` command.
* Allow ``debusine import-debian-artifact`` to upload individual ``.deb``
  packages.
* Correct imported package relations.
* Don't download large artifacts as tarballs.

Worker
~~~~~~

* Add :task:`MakeSourcePackageUpload` task.
* Add :task:`MergeUploads` task.
* :task:`Sbuild`:

  * Support ``build_profiles``.
  * Don't permit architecture-independent binary-only NMUs.
  * Fix ``architecture`` field of created :artifact:`debian:binary-packages`
    artifacts.
  * Export ``DEB_BUILD_OPTIONS`` for ``nocheck`` and ``nodoc`` profiles.
  * Set a default maintainer for binary-only NMUs.

* Apply some environment constraints to the :task:`Piuparts` task's
  ``base_tgz`` lookup.
* Register :task:`ExtractForSigning` task, which previously existed but was
  unusable.
* Fix ``unshare`` executor compatibility with Debian environments from
  before the start of the ``/usr`` merge.
* Fall back to the worker's host architecture for the purpose of environment
  lookups if the task doesn't specify one.
* Log progress through the main steps of each task.

Signing
~~~~~~~

* Add :task:`Debsign` task.

Documentation
~~~~~~~~~~~~~

* Document signing workers and tasks.
* Add design for permission management.
* Add design for reverse-dependencies-autopkgtest workflow.
* Add design for task configuration, work request statistics, and other
  build-related features.
* Add short introduction to :ref:`debusine-concepts` tying everything
  together.
* Move explanation of expiration logic to a separate
  :ref:`expiration-of-data` page.
* Simplify :ref:`explanation of artifacts <explanation-artifacts>`.
* Move information about :ref:`reference-task-types` to a separate page.
* Move information about :ref:`collection data models
  <collection-data-models>` to a separate page.

Quality
~~~~~~~

* Use `vulture <https://github.com/jendrikseipp/vulture>`__ to find dead
  code.
* Sort imports automatically using `isort
  <https://github.com/PyCQA/isort>`__.
* Make coverage reports briefer.

.. _release-0.5.0:

0.5.0 (2024-09-03)
------------------

Server
~~~~~~

* Avoid N+1 queries when resolving :ref:`multiple lookups
  <lookup-multiple>`.
* Automatically drop privileges when running ``debusine-admin`` or
  ``debusine-signing`` as root.
* Mark retried work requests as blocked if necessary.
* Add an API endpoint to review manual unblocks.
* Unassign pending or running work requests when disabling a worker.
* Fix ineffective :collection:`debian:environments` uniqueness constraint.
* Adjust the :workflow:`sbuild` workflow to allow storing build logs in a
  new :collection:`debian:package-build-logs` collection.
* Default to a five-second timeout when sending email, to avoid hangs if the
  local mail transport agent is broken.
* Don't buffer output to log files.
* Validate new work requests when creating them.

Web UI
~~~~~~

* Link to work request and build log in artifact list.
* Add a framework of UI shortcuts and sidebar information, allowing a more
  attractive and consistent presentation of resources such as artifacts and
  work requests.
* Redirect user to original URL after login.
* If an artifact has only one file, download that file by default instead of
  a tarball.
* Show input artifacts in work request views.
* Add a user-friendly view of files in artifacts.
* Fix error when viewing an artifact with multiple related build logs.
* Use `pygments <https://pygments.org/>`__ to render text content.
* Redesign work request detail view.
* Use work request labels in the UI.
* Add UI to review work requests blocked on manual approval.
* Add a view of registered workers and their running work requests.
* Fix collection search paging.
* Add a view of the task queue.

Client
~~~~~~

* Only accept valid artifact categories in ``debusine create-artifact``.
* Don't process downloads one byte at a time.
* Retry some HTTP requests.

Worker
~~~~~~

* Make ``arch-test`` a dependency rather than an optional feature.
* Add :task:`ExtractForSigning` task.
* Add :task:`AssembleSignedSource` task.
* :task:`Sbuild`:

  * Create a :artifact:`debusine:signing-input` artifact.
  * Ignore ``dose-debcheck`` decoding errors.
  * Support building binary-only NMUs.
  * Skip ``dose-debcheck`` extraction on success.

Signing
~~~~~~~

* Add support for static (not extracted under wrap) PKCS#11 keys.
* Add OpenPGP key generation and signing support.

Documentation
~~~~~~~~~~~~~

* Document that workers need ``sbin`` directories in their ``PATH``.
* Clarify data model details for the workflow hierarchy.
* Improve documentation for ``debusine-admin manage_worker disable``.
* Fix documentation of creating a collection in :ref:`set-up-apt-mirroring`.
* Add design for coordinating sub-workflows.
* Add design for package upload task and workflow.

Quality
~~~~~~~

* Support building Debusine itself with ``nocheck`` and ``nodoc`` build
  profiles.
* Add `pre-commit <https://pre-commit.com/>`__ configuration.
* Fix various :py:exc:`ResourceWarning`\ s.
* Convert Python packaging to `hatchling
  <https://pypi.org/project/hatchling/>`__.
* Add many more type annotations.
* Use `dbconfig-pgsql
  <https://www.debian.org/doc/manuals/dbconfig-common/>`__ for database
  configuration, avoiding services restarting indefinitely after initial
  installation.
* Ensure that Debusine starts after and stops before a PostgreSQL service
  running on the same machine.
* Make task-killing tests more reliable.

.. _release-0.4.1:

0.4.1 (2024-06-28)
------------------

Server
~~~~~~

* Make ``debusine:test`` artifact instantiable.

Web UI
~~~~~~

* Introduce a common base layout with a right sidebar.
* Implement labels for artifacts.
* Add specialized view for showing build log artifacts.

Worker
~~~~~~

* Run ``sbuild`` with ``--bd-uninstallable-explainer=dose3`` and parse its
  output.

Quality
~~~~~~~

* Fix license classifier in ``setup.cfg``.

.. _release-0.4.0:

0.4.0 (2024-06-24)
------------------

Server
~~~~~~

* Add API endpoint to retry work requests.
* Implement retrying workflows.
* Give the scheduler Celery worker a different node name.
* Switch to ``RedisPubSubChannelLayer``.

Web UI
~~~~~~

* Add UI to retry work requests.

Worker
~~~~~~

* Add binary-only NMU support to ``sbuild`` task.
* Use ``arch-test`` to provide better defaults for ``system:architectures``.

Signing
~~~~~~~

* Add a new signing service.  This currently supports generating keys
  (though currently only in software, as opposed to an HSM) and signing UEFI
  Secure Boot images with them.  A few more pieces still need to be
  assembled before this is useful.

Documentation
~~~~~~~~~~~~~

* Document HTTPS setup.
* Document signing worker.

Quality
~~~~~~~

* Remove now-unnecessary autopkgtest schroot creation from integration
  tests.
* Add a "playground" system to manage test object creation and to allow
  discussion of UI prototypes.
* Use HTTPS in integration tests.
* Bump timeout for ``mmdebstrap`` integration tests.
* Reorganize test cases for improved type-safety.
* Fix cleanup order in an integration test which caused failures on slow
  architectures.

.. _release-0.3.2:

0.3.2 (2024-06-03)
------------------

Server
~~~~~~

* Rename some leftovers of "internal" naming for server tasks.
* Added method to check if a work request can be retried.
* Fix ``Architecture: all`` matching in ``sbuild`` workflow.

Web UI
~~~~~~

* Second iteration on collection UI design.
* Add base template support for ``django.contrib.messages``.

Quality
~~~~~~~

* Fix several race conditions and timeouts that caused autopkgtest failures
  on slow architectures.

.. _release-0.3.1:

0.3.1 (2024-05-28)
------------------

Server
~~~~~~

* Namespace collections under workspaces.
* Refresh worker from database before marking it disconnected, so that we
  don't lose changes made using ``debusine-admin edit_worker_metadata``.
* Add backend capability to retry aborted or failed work requests.
* ``sbuild`` workflow:

  * Fix task data for ``Architecture: all`` work requests.
  * Specify the backend in environment lookups.
  * Defer environment resolution.

Web UI
~~~~~~

* Fix typo resulting in HTTP 500 error in collection detail view.

Worker
~~~~~~

* Handle systemd 256 in ``incus-lxc`` executor.
* Handle dangling ``/etc/resolv.conf`` symlinks in environments in the
  ``unshare`` executor.
* Fix ``mmdebstrap`` task to specify the architecture of the chroot.

Documentation
~~~~~~~~~~~~~

* Fix several errors in the "Getting started with Debusine" tutorial.
* Adjust "The debusine command" reference to refer to self-documenting
  ``--help`` output.

Quality
~~~~~~~

* Skip some integration tests for architectures that weren't in bookworm.
* Add enums for artifact and collection categories, to guard against typos.

.. _release-0.3.0:

0.3.0 (2024-05-23)
------------------

Highlights:

* The focus of this milestone is on automatic orchestration of building
  blocks, to allow tasks to be scheduled for all items of a collection.  For
  example, Debusine can now automatically schedule Lintian tasks for all
  packages in a suite.
* Added collections and workflows.
* Added a new lookup syntax, taking advantage of collections.

Server
~~~~~~

* Add infrastructure for collections.
* Implement :collection:`debian:environments` collection.
* Implement ``debian:suite-lintian`` collection.
* Add ``debusine-admin create_collection`` command.
* Store tokens only in a hashed form.
* Implement :collection:`debian:suite` collection.
* Move the scheduler to a dedicated Celery worker.
* Generalize work request notifications into event reactions.
* Implement basic building blocks of workflows.
* Implement synchronization points.
* Implement workflow orchestrators.
* Implement workflow callbacks.
* Add ``--default-file-store`` options to ``debusine-admin
  create_workspace`` and ``debusine-admin manage_workspace``.
* Restrict creation of non-worker tasks via the API.
* Add ``debusine-admin create_file_store`` command.
* Implement scheduling priorities.
* Implement ``update-collection-with-artifacts`` event reaction.
* Implement collection item lookup syntax and semantics.
* Implement ``aptmirror`` server task.
* Implement ``updatesuitelintiancollection`` task to update a
  ``debian:suite-lintian`` collection from :collection:`debian:suite`.
* Implement :collection:`debusine:workflow-internal` collection.
* Add ``debusine-admin create_work_request`` command.
* Implement ``sbuild`` and ``update_environments`` workflows.
* Add a ``_system`` user for use by scripts.
* Implement expiry of collection items.
* Add APIs to create workflow templates and workflows.
* Add ``debusine-admin create_workflow`` command.
* Add ``debusine-admin delete_workspace`` command.
* Implement expiry of work requests.

Web UI
~~~~~~

* Fix ordering of work requests by task name.
* Improve rendering of multi-line strings in task data.
* Show workflow information for work requests that are part of workflows.
* Show task type in work request lists.
* Improve handling of expired artifacts in ``autopkgtest``/``lintian``
  views.
* Order a work request's artifacts by ID within each category.
* Show the user who created a work request in the work request detail view.
* Show a notice when a work request's artifacts have expired.
* Add workspace detail and collection views.

Client
~~~~~~

* Separate YAML input and output more clearly when running ``debusine
  create-artifact`` or ``debusine create-work-request``.
* Add ``debusine manage-work-request`` command to adjust work request
  priorities.
* Add ``debusine create-workflow-template`` and ``debusine create-workflow``
  commands.

Worker
~~~~~~

* Add support for passing extra packages to the ``sbuild`` task.
* Exit cleanly on failure to report a completed work request to the server.
* Restrict ``mmdebstrap`` and ``simplesystemimagebuild`` tasks to workers
  that support the requested architecture, as was done for other tasks in
  0.2.1.
* Only consider the ``autopkgtest`` task to have succeeded on exit codes 0,
  2, and 8.
* Remove network-related files that ``mmdebstrap`` copies from the host.
* Allow ``sbuild`` to produce no ``.changes`` file, so that users can
  examine the log files of failed builds.
* Improve "Unexpected artifact type" error from the image cache.
* Rename ``autopkgtest`` task's ``environment`` key to
  ``extra_environment``.
* Rename ``environment_id`` to ``environment`` in all tasks, and support the
  new lookup syntax.
* Drop insecure ``sbuild_options`` from ``sbuild`` task.
* Rename task data fields in ``autopkgtest``, ``blhc``, ``lintian``,
  ``piuparts``, ``sbuild``, and ``updatesuitelintiancollection`` tasks to
  support the new lookup syntax, removing ``_id`` from key names and
  accepting single or multiple lookups as appropriate.
* Correctly tag ``sid`` tarballs and images as ``codename=sid``.
* Don't purge build-dependencies after build in the ``sbuild`` task.

Documentation
~~~~~~~~~~~~~

* Move unimplemented features to a new "Development blueprints" section.
* Add design practices.
* Rework "Where to start" section in "Contribute to Debusine".
* Clarify parameters to ``piuparts`` task.
* Clarify the role of Incus when installing a Debusine instance.
* Add design for tasks that update collections.
* Document work request scheduling and associated worker metadata.
* Add design for workflows.
* Document image caching and cleanup.
* Add design for scheduling priorities.
* Add design for collection item lookups.
* Add design for ``sbuild`` workflow.
* Add design for ``update_environments`` workflow.
* Add how-to for setting up APT mirroring.
* Add example script to automate Incus configuration for workers.
* Document packages required for Incus VMs.
* Add example script to populate a Debusine instance with example data.
* Document environment requirements for executor backends.
* Update "Getting started with Debusine" tutorial to use workflows and
  collections.
* Add more documentation of worker behaviour.

Quality
~~~~~~~

* Validate the summary in :artifact:`debian:lintian` artifacts.
* Drop compatibility with Debian bullseye; Debusine now requires Python >=
  3.11.
* Enforce pydantic models for ``WorkRequest.workflow_data`` and
  ``WorkRequest.event_reactions``.
* Use pydantic models for ``autopkgtest`` and ``lintian`` views.
* Fix some tests on non-amd64 architectures.
* Auto-format HTML templates using djlint.
* Add infrastructure for more semantic testing of HTML output.

.. _release-0.2.1:

0.2.1 (2024-03-07)
------------------

Server
~~~~~~

* Add a Celery worker for server-side tasks.

Client
~~~~~~

* Trim down dependencies slightly.

Worker
~~~~~~

* Require KVM access for ``simplesystemimagebuild`` task.
* Change ``container`` to ``instance`` in Incus templates.
* Log task completion.
* Restrict tasks to workers that support the requested architecture.

Documentation
~~~~~~~~~~~~~

* Improve home page slightly.

Quality
~~~~~~~

* Enforce mypy project-wide, including all Django components.

.. _release-0.2.0:

0.2.0 (2024-02-29)
------------------

Highlights:

* Added artifact file storage system.
* Debian developers can use Debusine to run various QA tasks against
  packages they are preparing.  Those tasks can be scheduled through the API
  or through the web UI.

Note that it is not possible to directly migrate a database installed using
0.1.0.  Migrations from this release to future releases will be possible.

Server
~~~~~~

* Implement file storage.
* Implement artifact handling.
* Implement expiration of artifacts and their files.
* Run database migrations on ``debusine-server`` package upgrade.
* Add ``debusine-admin monthly_cleanup`` command, run from a systemd timer.
* Link work requests to workspaces.
* Add ``debusine-admin create_user``, ``debusine-admin list_users``, and
  ``debusine-admin manage_user`` commands.
* Link tokens to users.
* Allow email notifications if a work request fails.
* Depend on ``python3-daphne``.
* Ensure all local artifacts are JSON-serializable.
* Add ``debusine-admin create_workspace``, ``debusine-admin
  list_workspaces``, and ``debusine-admin manage_workspace`` commands.
* Use WorkRequest workspace in artifacts.
* Add default expiration delay to workspaces.
* Add API to list work requests.
* Make sure the Django app's secret key is never publicly readable.
* Mark workers as disconnected on ``debusine-server`` startup.
* Use ``Restart=on-failure`` rather than ``Restart=always`` in
  ``debusine-server.service``.
* Add ``debusine-admin info`` command to help with setting up deployments.
* Add daily artifact cleanup timer.
* Use pydantic models for artifact data.
* Add remote, read-only file storage backend for :file-backend:`external
  Debian archives <ExternalDebianSuite>`.

Web UI
~~~~~~

* Add web UI for work requests and workspaces.
* Add login/logout support to web UI, allowing access to non-public
  workspaces.
* Allow registering/removing user API keys using the web UI.
* Allow uploading artifacts using the web UI.
* Refinements to web UI for work requests.
* Make Django aware of HTTP/HTTPS state of requests.
* Fix download error with empty artifact file and document mmap usage.
* Implement integration with Salsa Single Sign-On.
* Add ``lintian`` view.
* Polish various aspects of the web UI.
* Add ``autopkgtest`` view.
* Fetch images for tasks directly, not via a tarball.

Client
~~~~~~

* Rename client's configuration key from ``debusine`` to ``api-url``.
* Add ``--data`` option to ``debusine create-work-request``.
* Rename ``debusine work-request-status`` to ``debusine show-work-request``.
* Add ``debusine on-work-request-completed`` to allow running a command when
  a work request completes.
* ``debusine.client``: Drop obsolete ``silent`` keyword, and stricter
  prototype tests.
* Add ``debusine --debug`` option to debug HTTP traffic.
* Implement a package downloader (``dget``).
* Implement a paginated listing API client.
* Add API client method for listing all work requests.
* Add ``debusine list-work-requests`` command.
* Add ``debusine import-debian-artifact`` command.

Worker
~~~~~~

* Modify ``sbuild`` task to use artifacts.
* Add pre-upload consistency checks on sbuild results.
* Rename worker's configuration key from ``debusine-url`` to ``api-url``.
* Upload ``sbuild`` log files even if the .dsc file did not exist.
* Add ``piuparts`` task.
* Add ``lintian`` task.
* Add ``autopkgtest`` task.
* Add ``mmdebstrap`` task.
* Avoid trying to add ``debusine-worker`` user in postinst if it already
  exists.
* Add image caching for executor backends.
* Add ``unshare`` executor.
* Port the ``autopkgtest`` and ``piuparts`` tasks to ``unshare``.
* Use ``Restart=on-failure`` rather than ``Restart=always`` in
  ``debusine-worker.service``.
* Make tasks check whether their tools are installed.
* Use a lock to protect execution of the work request.
* Add ``blhc`` task.
* Add ``simplesystemimagebuild`` task.
* Use pydantic models for task data.
* Log exceptions in task preparation and clean-up.
* Add Incus executor (for both containers and VMs).
* Add a ``qemu`` executor, currently only for ``autopkgtest`` and ``sbuild``
  tasks.

Documentation
~~~~~~~~~~~~~

* Drop the "slug" field and the "repository" type.
* Document :artifact:`debian:package-build-log` artifact in ontology.
* Document using ``local.py`` to change settings.
* Create an overview document with an elevator-pitch-style introduction.
* Add initial design for ``autopkgtest`` and ``lintian`` tasks.
* Add initial design for system tarball artifacts and debootstrap-like
  tasks.
* Add initial design for tasks building system disk images.
* Update the description of the ``sbuild`` task.
* Restructure the documentation following the Diátaxis principles.
* Clarify copyright notice, contributor status and list of contributors.
* Enable the Sphinx copybutton plugin.
* Add some documentation for the Python client API.
* Improve the "Getting started with Debusine" tutorial.
* Add documentation for ``debusine-admin`` commands.
* Add "Install your first Debusine instance" tutorial.
* Add initial design for collections.
* Refine design for workflows.

Quality
~~~~~~~

* Harmonize license to be GPL-3+ everywhere.
* Support pydantic 1 and 2.
* Apply mypy, pyupgrade, and shellcheck consistently.
* Sync ``(Build-)Depends`` with ``setup.cfg``.

.. _release-0.1.0:

0.1.0 (2022-09-09)
------------------

Initial release.  Includes a server that can drive many workers over a
worker-initiated websocket connection, where the workers use the server's
API to get work requests and provide results.  There is an ``sbuild`` task
that workers can run.
