Applications with several artifacts#
An application is often made of several artifacts released separately: a frontend, a backend, the database migrations. Every artifact is a release of its own: environment configuration, queue, inventory, rollback, promotion and retention are per application, artifact and environment. The artifact is artifact.name, required in every descriptor.
# backend
application: shop
environment: prod
artifact: {type: war, name: shop-api, version: 1.5.0, source: https://repo.example.com/shop-api-1.5.0.war}
---
# frontend
application: shop
environment: prod
artifact: {type: tgz, name: shop-web, version: 3.2.0, source: https://repo.example.com/shop-web-3.2.0.tgz}
| Per application, artifact and environment | |
|---|---|
| Release in service (inventory) | one entry per artifact |
Queue partition (environment_concurrency) |
<app>+<artifact>/<env>: different artifacts deploy in parallel |
Rollback, promotion, requires |
of the artifact |
Retention keep_releases |
per artifact |
| Default schedule name | <app>-<artifact>-<env> |
artifact.name accepts letters, digits, ., _, : and - (at most 128 characters, starting with a letter or digit): it becomes part of queue partitions, keys and paths. The path of an image goes in source. An application with a single artifact usually names it after the application.
The order between artifacts (migrations, then backend, then frontend) is expressed with after or a composed release.
Environment configuration per artifact#
The templates of the providers contain {artifact}: one document per artifact, with nothing shared (common targets and secrets are repeated in every document).
envconfig:
required: true # a missing document is an error: it catches a misspelled artifact
providers:
- name: default
type: file
file:
path: "envconfig/{tenant}/{application}/{artifact}/{environment}.yml"
# consul:
# key: "manent/{tenant}/{application}/{artifact}/{environment}"
- Tenant:
untenantedis the tenant of the applications no tenant lists; the documents of a tenant's applications are under its name. - Names: an
artifact.namethat cannot be part of a path or key (e.g.team/api) is refused. - A template without
{artifact}reads one document per application/environment, shared by all its artifacts. descriptor_policy.secret_refsaccepts{artifact}:vault:secret/{tenant}/{application}/{artifact}/{environment}/*.manent env validate --artifact <name>checks a candidate document of an artifact.
Rollback, promotion and inventory#
manent inventory -a shop # one entry per artifact
manent rollback -a shop -e prod --artifact shop-api # -A for short
manent promote -a shop --from staging --to prod -A shop-web
manent list -a shop -A shop-db
manent dora -a shop -A shop-api
With a single artifact in the environment --artifact can be omitted; with more than one the request is refused and the error lists them. In a composed release with onFailure: rollback every deploy is rolled back on its own artifact. Imports of the release in service (imports.<name>.current) take artifact too, required when the application has more than one artifact in that environment.
Permissions and governance per artifact#
Bindings, rules and freezes accept an optional list of patterns on artifact.name:
rbac:
bindings:
- groups: [web-team]
role: deployer
applications: [shop]
environments: ["*"]
artifacts: ["shop-web*"] # only the deploys of these artifacts
governance:
rules:
- name: migrations
applications: ["*"]
environments: [prod]
artifacts: ["*-db"]
approvals: {required: 2}
freezes:
- name: frontend-freeze
applications: [shop]
environments: [prod]
artifacts: [shop-web]
from: 2026-12-20T00:00:00Z
to: 2027-01-07T00:00:00Z
- Bindings with
artifactsapply only to the deploys of those artifacts, never to the actions on the whole environment (freezes, schedules listing): those need a binding withoutartifacts. The same field is accepted in the grants of a permission policy (data.manent.rbac.bindings,grants). - Rules with
artifactsapply only to those artifacts; in Rego the library readsinput.artifact.name. - Freezes with
artifactsblock only those artifacts; where the artifact is unknown (e.g. custom steps checking the environment) a partial freeze still applies.manent freeze add -A shop-webcreates one at runtime.
Renaming an artifact#
A new artifact.name is a new release, without history. To keep it, rename the artifact in the history:
manent-server -c manent.yml admin rename-artifact [-t <tenant>] -a shop --from api --to shop-api [--dry-run]
It changes the artifact attribute of the ended deploys (and of their approvals and waits): inventory, rollbacks and promotions follow the new name, and a rollback releases the old version under the new name. Workflows not ended are listed in pending and left unchanged: run the command again when they end. The API processes rebuild their inventory within 10 minutes. Schedules keep the descriptor they were created with.