Every PLESTY module uses the plesty-standard-ci component from plesty-ci. A single include block configures the full four-stage pipeline.
The full CI architecture — the component-based model, runner images, gate tiers, the module-type matrix, and legacy setups — is documented in CI_ARCHITECTURE.md in the plesty-ci repository. This page covers the practical setup for a module author.
.gitlab-ci.yml
stages:
- check
- security
- deploy
- release
variables:
# Required for versioningit: the runner must fetch full Git history and tags.
GIT_DEPTH: "0"
include:
- component: $CI_SERVER_FQDN/plesty/plesty-ci/plesty-standard-ci@main
inputs:
standard: quantum
extra_branch: exp
access_token: $CI_BOT_TOKEN
This is the canonical form — plesty init scaffolds exactly this, pinned to @main. Do not add individual component includes (check-compliance, deploy-docs, etc.) — they are legacy and will be migrated. If an existing module still carries the legacy hub-module@exp include (produced by older scaffolds), swap it for plesty-standard-ci@main — the inputs are compatible — so its jobs run on the PLESTY runner image.
@main is the released component; a module pinned to @exp is tracking the CI project's own integration branch and will see template changes before they are released. A few modules still do — move them to @main unless you are deliberately testing a template change.
Pipeline stages
plesty check --standard quantum. All 11 numbered local gates plus the lettered gates for this module type. Fails fast on first gate failure.quantum, on merge requests, the default branch, exp, maintain/* and tags. No setup required.docs-build branch via CI_BOT_TOKEN. A tag deploys that release's docs; never on maintain/*.PYPI_TOKEN where one is set.Inputs
None is required; each has a default.
| Input | Default | Description |
|---|---|---|
standard |
nebula |
Compliance standard: pixel, nebula, or quantum |
extra_branch |
— | A branch besides the default one whose pushes run the check and deploy jobs — exp for a published module |
access_token |
$CI_JOB_TOKEN |
The token the deploy job pushes docs-build with — $CI_BOT_TOKEN for a published module |
pypi_token |
— | A PyPI token for the release job; leave it unset to publish through a trusted publisher |
docs_target_branch |
docs-build |
Where the built docs are pushed |
python_image |
the PLESTY runner image | The image the jobs run in |
check_stage, security_stage, deploy_stage, release_stage |
check, security, deploy, release |
Stage names, for a pipeline that names its stages differently |
artifact_expire_in |
— | How long job artifacts are kept |
CI_BOT_TOKEN
For a module under PLESTY's groups (plesty/hub, plesty/core, plesty/plesty-ai), CI_BOT_TOKEN is a group CI/CD variable: every project inherits it, and there is nothing to set up. Never create a per-project CI_BOT_TOKEN — it would shadow the group's and expire on its own schedule, and the symptom is a deploy-docs job failing with 403 while every other job is green.
The group token has the Maintainer role with read_repository + write_repository scopes. Without Maintainer, the deploy step gets 403 on git ls-remote even with read_repository scope.
Runner image
The CI runner uses the PLESTY runner image:
registry.gitlab.com/plesty/core/plesty-ci/runner:quantum
This image has Python, uv, and all required tools pre-installed. You do not need to install them in your pipeline.
Checking the pipeline locally
Before pushing, run the full check locally to catch failures before CI sees them:
uv run plesty check --standard quantum
The local check runs the same gates as the CI check stage, with three differences: gate 8 (semantic versioning) is advisory locally and authoritative in CI; the SPDX authorship check in gate 9 runs locally only; and gate 11 (docs build) is skipped in CI branch pipelines, where the deploy job builds the docs instead.