Drone Pipelines
Summary
Every Aetos repository ships a Drone CI definition at .drone.yml. There is
exactly one standard per repository, and there are two types of file,
chosen by what the repository produces:
| Type | File | Produces | Repos |
|---|---|---|---|
| A — PyPI package | templates/drone/python-lib.yaml |
A wheel + sdist on the private index | dagpipe, doc-forge, hexa, mail-intake, mongo-ops, omniread, openapi-first, py-jwt |
| B — Docker deployment | templates/drone/service-docker.yaml |
An image pushed to the registry and run as a container | auth-server, docs, mcp |
Both templates run on platform: linux / arm64 with the workspace at
/drone/src. Copy the matching template to <repo>/.drone.yml; the Type A file
needs no edits, the Type B file needs its placeholders filled in (below).
Conventions:
.drone.yml(not.yaml), one file per repo, secrets injected withfrom_secret— never commit credentials.
Type A — PyPI package (python-lib.yaml)
For internal libraries. The file contains two pipelines:
build-and-publish-pypi— triggered ontag:check-version— guard: fail unless$DRONE_TAGequals the version inpyproject.toml; then readname/versionand query$PIP_REPO_URL/simple/<package>/; if that version already exists, exit78and skip the whole build (see 11 – Versioning & Changelog).quality-gate— install the package with its[dev]extras from the private index, thenblack --check,ruff check,mypy,pydoclint,pytest.build-package—python -m buildintodist/.upload-to-private-pypi—twine uploadto$PIP_REPO_URL.backfill-pypi-from-tags— triggered oncustom:fetch-tags—git fetch --tags --force.build-and-upload-missing— walk every tag in version order, skip the ones already on the index,git checkoutthe rest, verifytag == pyproject versionat that commit, build, and upload. This is the disaster-recovery / replay path.
Secrets: PIP_REPO_URL, PIP_USERNAME, PIP_PASSWORD.
- Ship as-is. Package name and version come from
pyproject.toml, so the same file is reused verbatim across every library.
Type B — Docker deployment (service-docker.yaml)
For services and sites that ship a container image. The file contains two pipelines, each mirroring a repo family:
build-and-deploy-service— triggered ontag(a long-running API/worker service, e.g.auth-server):fetch-tags— resolve the latest tag intoLATEST_TAG.txt; fail if there are no tags.check-version— guard: fail unless$DRONE_TAGequals the repo-rootVERSIONfile (see 11 – Versioning & Changelog).check-remote-image— ifaetos/<app>:<tag>already exists locally, exit78and skip the build.quality-gate— install fromrequirements.txtand runblack/ruff/mypy/pytest.build-image—docker buildwith the private-index build args, taggedaetos/<app>:<tag>and:latest.push-image— login, re-tag with$REGISTRY_HOST, push both tags.stop-old—docker rm -f <app>.run-container—docker run -d --name <app> -p <host>:<container> --restart alwayswith the service's-eenvironment.build-and-deploy-site— triggered onpush(a static/HTTP site, e.g.docs,mcp):build-image→push-image→stop-old→run-container, with no tag resolution, no quality gate, and no version guard (it ships:latestonly).
Secrets: PIP_REPO_URL, PIP_USERNAME, PIP_PASSWORD (service build args),
REGISTRY_HOST, REGISTRY_USER, REGISTRY_PASS, plus the service runtime env
(for example MONGO_*, JWT_SECRET).
Placeholders to fill in per repo:
| Placeholder | Meaning | Example |
|---|---|---|
<app> |
service image / container name | auth-server |
aetos/<app> |
image repository on the registry | aetos/auth-server |
<host-port> / <container-port> |
published : in-image port | 9003:8000 |
<site> |
site image / container name | docs |
<ENV_VAR> |
runtime environment variable | MONGO_HOST |
What not to do
- Do not hand-roll a third shape. A repo is either Type A or Type B, never both.
- Do not inline secrets; always use
from_secret. - Do not drop the
check-version/check-remote-imageskip — it guards the index and the running container against duplicate publishes. - Do not drop the tag↔version guard. A package needs its
pyproject.tomlversion to equal the tag; a service needs a rootVERSIONfile that equals the tag. See 11 – Versioning & Changelog. - Do not rename the pipelines; tooling and runbooks key off
build-and-publish-pypi,build-and-deploy-service, andbuild-and-deploy-site.