14.1 The MintPress action pack
packs:mintpress
After this you can: use the licensed MintPress action pack — prerequisites, templates, actions as changes, composing, workflows, the runner image.
Before you start — tick each one:
- Lesson 3.1 — Your first change (
opschain learn 3.1)
In the GUI: the pack's actions appear on the Run form of a MintPress-backed asset, and the asset's MintModel tab shows the stored model and its history.
MintPress is LimePoint's commercial automation pack for enterprise
middleware estates: model-driven actions rendered from a MintModel —
a declarative model of the target system — and executed by the MintPress
SDK. With the pack licensed, MintPress actions appear in your asset
catalogs and run through exactly the same machinery as everything else
you have met on the core path: changes, workflows, YAML composition,
properties and the vault. This lesson is only applicable to existing
MintPress customers and those using the MintPress SDK or the
packs:mintpress feature.
This lesson covers only what is different when MintPress is in the picture. Every section names the lesson that owns the underlying feature — read those first; this lesson assumes them.
Licence entitlement. Everything here requires the
packs:mintpressentitlement on your server's licence (apply licences as inopschain docs entitlements). Enforcement is per step at the change-create funnel every MintPress-backed change passes through: without the entitlement, invoking a Ruby-lane action (actions.rb, stored-catalog or MintModel), retrying one, rendering a MintModel and deriving an actions catalog all refuse with a named 422 — while assets on MintModel-backed templates still create, re-pin and run all their YAML actions, catalogs stay listed withentitlement_requiredmarkers, and the server's docs surfaces hide the MintPress pack pages. Nothing already running is interrupted by licence expiry mid-run.
1. What you need before starting
- A server whose licence carries
packs:mintpress(checkopschain admin status, orGET /api/info→licence_status.features). - A template repository containing a MintModel folder (your LimePoint
engagement supplies this), reachable through a configured Git remote —
remotes and templates work exactly as in
opschain learn 3.3. - A runner built from the MintPress SDK runner image
(
examples/mintpress-runner-imagein the distribution) — the only runner that carries the SDK and its Ruby toolchain. Plain runners fromopschain learn 6.1cannot execute MintPress work.
2. MintPress-backed asset templates
You create templates and pin versions the normal way
(opschain learn 3.4). A version whose tree carries a MintModel folder is
MintModel-backed, and that adds one step to the lifecycle: before the
asset can run MintPress actions, the model must be concretised — the
runner renders the MintModel against the asset's converged properties and
stores the result with its derived action trees.
- Concretisation happens automatically with a catalog refresh (Generate
Actions), or explicitly through the asset's
mintmodels/generatelink (follow the asset'slinks.mintmodels— never hand-build the path). - A stored MintModel stays valid until its inputs move: repointing the template version to a new commit, or changing a property that feeds the render, invalidates it. An invalid MintModel refuses new changes with a message naming the reason; regenerating restores it.
- Pinning an asset onto a MintModel-backed version is itself gated: asset create/update and bulk version assignment refuse without the entitlement.
See opschain docs resources/mintmodel for the stored-model and history
endpoints the GUI's MintModel tab reads.
3. Running MintPress actions as changes
After concretisation the asset's action catalog lists the MintPress
actions (Startup, Shutdown, per-component installs — whatever the model
defines) beside any YAML actions. Browse and run them exactly as in
opschain learn 3.1:
opschain actions list projects/acme/environments/prod/assets/oam
opschain runs create change projects/acme/environments/prod/assets/oam --action Startup --follow
created change 01a2fd00-7e8f-7a9b-8c0d-1e2f3a4b5c6d (Startup on projects/acme/environments/prod/assets/oam) — pending
Two differences from the YAML actions you authored on the core path:
- MintPress actions are property-driven. They take no typed inputs;
shape a run with
property_overrideson the change, and with the properties overlay generally (opschain learn 1.3). - They execute on the Ruby lane. A MintPress action's steps — per-host children included — run inside the MintPress SDK runner, and the whole run is run-scoped: pinned to one runner, sharing one workspace, so files staged by one step are there for the next.
4. Composing MintPress steps into YAML actions
A YAML action on a MintPress-backed asset can graft one of the asset's
MintPress catalog actions into its own tree with the mintpress# scheme
(composition with uses: is core material — opschain learn 2.2):
action: provision_stack
steps:
- name: preflight
run: ./scripts/preflight.sh
- name: bring_up
uses: "mintpress#Startup"
- name: verify
run: ./scripts/verify.sh
Feature-specific points, in the order they will bite:
<ref>resolves like everywhere else: catalog full path, wire identity (mintmodel:<name>— stored identities keep the upstream spelling), or bare action name, case-insensitively.- The referenced subtree is grafted server-side at change creation from the stored MintPress catalog; the plan shows the grafted children before you approve anything.
- Validation is eager and loud: a dangling reference is a named 422 at
create, and the composed action lists as
invalidin the catalog until fixed. A stale MintModel refuses the change first. with:is rejected on amintpress#step — property-driven lane; useproperty_overrides.- MintPress steps routinely report child steps while running; those children are adopted and executed on the same Ruby lane.
The full scheme reference — every error message, the resolution rules,
where the scheme is unavailable (git-remote changes, --local,
for_each) — is opschain docs packs-mintpress.
5. MintPress in workflows
A workflow type: change step may target a MintPress-backed asset with
any of its catalog actions — the nested change goes through the same
create funnel, so entitlement and MintModel-validity gates apply to it
for free. Author and run workflows as in opschain learn 4.1; nothing
MintPress-specific appears in the workflow grammar itself.
6. The runner image, placement and sizing
MintPress work needs the SDK runner image, and you almost always want it
fenced off as its own fleet (runner mechanics: opschain learn 6.1;
groups and placement: opschain learn 6.3):
-
Create an exclusive group (say
mintpress) and start the SDK image's runners into it. Exclusive is what makes the fence two-sided: SDK runners take only work that names the group, and work that names it can only land on them. -
Route the Ruby assets to the group with a settings block on the asset (or the environment/project when a whole subtree is MintPress):
{"runner": {"group": "mintpress"}}Catalog refreshes for the routed asset follow the same placement, so Generate Actions also lands on the SDK fleet.
-
The SDK runner resolves vault secrets at render and execution time: MintModel templates call the secret vault for passwords, so the fleet is started with an
OPSCHAIN_VAULT_*provider in its environment — vault credentials live with the runner, never in the settings system. The vault itself, andsecret-vault://references in properties, are core material:opschain learn 3.5.
Sizing. A MintPress change is run-scoped: one runner owns the whole
run. By default its steps execute serially; set
runner.max_parallel_steps (same runner settings block, nearest node
wins) above 1 to let the pinned runner execute that many of the run's
steps concurrently in the shared workspace — this is how parallel
branches of a MintPress tree (per-host fan-outs especially) regain their
concurrency. Size it to what one runner host can bear, not to the fleet:
a run never spreads past its one runner, so fleet width buys you
concurrent changes, while max_parallel_steps buys parallelism
inside each change. See opschain docs settings and
opschain docs dispatch for the resolution and claim-admission detail.
Check yourself
- Which runner image does a MintPress action need, and what must happen to a MintModel-backed asset after its template version is pinned before its MintPress actions can run?
What you learned
- MintPress rides the stack you already know: templates pin a MintModel, concretisation stores the rendered model and its actions.
- Changes and workflows run them through the ordinary funnels, where
the
packs:mintpressentitlement is enforced;uses: mintpress#grafts them into your YAML actions. - Properties and the vault shape them; a dedicated exclusive SDK runner
fleet executes them — run-scoped, sized with
runner.max_parallel_steps.
Deep references: opschain docs packs-mintpress (the composition
scheme), opschain docs resources/mintmodel (stored models and
history), opschain docs entitlements (licensing),
opschain docs dispatch (placement and the run pin).
Next: this closes the module Packs — back to your track (opschain learn).