Release Process#

Overview#

This document describes the release process for Conestack packages using zest.releaser for automated version management and PyPI uploads.

Prerequisites#

Required Tools#

zest.releaser: Install in the monorepo venv:

./venv/bin/pip install zest.releaser[recommended]

PyPI Configuration#

Configure ~/.pypirc with your PyPI credentials:

[distutils]
index-servers =
    pypi

[pypi]
username = __token__
password = pypi-YOUR-API-TOKEN

Pre-Release Validation#

Before releasing, ensure all packages pass validation:

make validate-all

Automated Release#

Using the Release Script#

Release all packages with unreleased changes:

./venv/bin/python scripts/release_packages.py --all

Script Options#

usage: release_packages.py [options]

options:
  --dry-run         Show what would be released without doing it
  --list            List packages needing release and exit (implies --all)
  --package PKG     Release only specified package (can be repeated)
  --skip PKG        Skip specified package (can be repeated)
  --no-upload       Prepare release but don't upload to PyPI
  --all             Process all packages (required unless --package is specified)
  -v, --verbose     Verbose output

Examples#

# List packages needing release
./venv/bin/python scripts/release_packages.py --list

# Preview what will be released (dry-run)
./venv/bin/python scripts/release_packages.py --all --dry-run

# Release all packages with changes
./venv/bin/python scripts/release_packages.py --all

# Release specific packages only
./venv/bin/python scripts/release_packages.py --package node --package odict

# Release all except specific packages
./venv/bin/python scripts/release_packages.py --all --skip cone.ldap

# Prepare releases without uploading
./venv/bin/python scripts/release_packages.py --all --no-upload

Manual Release (Single Package)#

For releasing a single package manually:

cd sources/<package>
fullrelease

This will interactively:

  1. Update version in pyproject.toml

  2. Update CHANGES.rst (remove “(unreleased)”, add date)

  3. Commit changes

  4. Create git tag

  5. Build wheel and sdist

  6. Upload to PyPI

  7. Bump to next development version

Release Order#

Packages are released in dependency order by group:

Order

Group

Packages

1

Base packages

odict, plumber, webresource, treibstoff

2

Node packages

node, node.ext.*

3

YAFOWIL packages

yafowil, yafowil.*, yafowil.widget.*

4

Cone tile

cone.tile

5

Cone app

cone.app

6

Cone packages

cone.*

Detection Logic#

A package needs release when its CHANGES.rst contains:

  • A version section marked (unreleased)

  • Actual change entries under that section

Packages are skipped if:

  • No CHANGES.rst file exists

  • The unreleased section contains “No changes yet”

Post-Release Verification#

After release, verify packages on PyPI:

# Check package is available
pip index versions <package>

# Test installation
pip install <package>==<version>

Troubleshooting#

Release Failed Mid-Way#

If a release fails after committing but before upload:

  1. Check git status in the package directory

  2. Manually upload: twine upload dist/*

  3. Or reset and retry: git reset --hard HEAD~2

PyPI Upload Errors#

  • 403 Forbidden: Check ~/.pypirc credentials

  • 400 Bad Request: Version may already exist on PyPI

  • Network Error: Retry with twine upload dist/*