Authors
Jérémy Maire
Plugins and Ecosystem Engineer
Ecosystem vs. Plugins: Ecosystem relates to all the tools we build to manage and operate Kestra itself, while Plugins are how Kestra connects to the rest of the world. This post is about releasing the ecosystem tools.
We ship more than one thing. Alongside Kestra itself, we maintain a set of client SDKs in several languages, a command-line tool (kestractl), and an infrastructure-as-code provider (our Terraform provider). Over time, each of these had grown its own way of cutting a release.
Those differences added up to real friction. So we spent a morning making our releases boring, and the change is visible to anyone using these tools: whatever version you install was deliberately tagged and shipped.
Every component released slightly differently, and the inconsistency was its own kind of cost.
v prefix, some didn’t; some encoded the target language in the tag name. Depending on which project you opened, the same release could look like v1.2.3, 1.3.0, v1.2.3-python, or go-sdk/v1.1.0. Anyone moving between projects had to relearn the rules each time.None of this was broken, exactly. But every release carried a little tax of “wait, how does this one work again?”
One mental model, everywhere. The goals were simple:
We standardized on a single model: a release happens when, and only when, someone pushes a version tag.
That one sentence carries the whole design:
We also kept one important nuance: not every component publishes the same way under the hood. Different languages and ecosystems have genuinely different publishing mechanics. The Go SDK is built and released by GoReleaser, the Java SDK is pushed to Maven Central, the JavaScript SDK is published to npm, and the Python SDK is uploaded to PyPI. We didn’t try to flatten those real differences. What we unified was the trigger and the contract: everywhere, a tag means a release, and the tag names the version. How the artifact then gets built and published can stay native to each ecosystem.
One thing this model still asks you to stay mindful of: a release tag has to target the right Kestra version. Each ecosystem tool tracks the Kestra core it’s compatible with, so we cut releases from version-specific branches. The tag makes the version explicit but the person releasing needs to tag from the branch that matches the intended Kestra version, so a 1.3.0 tool release lines up with the right Kestra core.
The interesting part of this work wasn’t a clever new tool: it was removing cleverness. We traded a set of bespoke, partly-automated release flows for one boring, explicit rule that every engineer can hold in their head: push a tag to ship; the tag is the version.
Automation is great when it removes toil. But automation that quietly makes decisions for you, like what version to release and when, can cost more in confusion than it saves in keystrokes. Sometimes the best release process is the one that does exactly what you told it to, and nothing more.
Whether you’re exploring Kestra for the first time or already running it in production, the ecosystem tools around it (kestractl, client SDKs, and the Terraform provider) all follow the same release convention now: push a tag, the tag is the version. Whatever version you install, it was deliberately shipped.
Every ecosystem tool now releases the same way: a release happens only when someone pushes a version tag, and that tag states the version. Merging code no longer ships anything on its own.
No. Code can land on the main branch freely; nothing reaches users until someone deliberately pushes a version tag. Everyday development and the act of shipping are fully decoupled.
It’s stated explicitly on the tag. To release 1.3.0, you tag 1.3.0. There’s no inference from commit messages and no guessing from history. The tag is the single source of truth for the version.
No, and that’s intentional. The Go SDK uses GoReleaser, the Java SDK publishes to Maven Central, the JavaScript SDK to npm, and the Python SDK to PyPI. We unified the trigger and the contract (a tag means a release, and the tag names the version), not the per-ecosystem publishing mechanics.
Yes. Each ecosystem tool tracks the Kestra core it’s compatible with, so releases are cut from version-specific branches. The person releasing tags the branch that matches the Kestra version the release targets.
Stay up to date with the latest features and changes to Kestra