New to Kestra?
Use blueprints to kickstart your first workflows.
Build a Docker image once, pause for human approval, then retag the exact image ID to production and push it with Kestra. No rebuild can slip in.
Promote the exact Docker image you tested, never a fresh rebuild. This blueprint builds a candidate image once, captures its immutable image ID, pauses for a human to approve, then retags that same ID to your production reference and pushes it to the registry. Because every downstream step works from the captured image ID instead of a mutable tag, a different or newer build can never slip into production. It closes the classic gap where staging and production tags drift apart and you ship bits nobody reviewed, giving you a safe, auditable Docker promotion gate with approval, notifications, and a webhook entry point.
io.kestra.plugin.core.trigger.Webhook (on_promotion_request), guarded by a secret key.io.kestra.plugin.docker.Build (build) builds the candidate image from the inline dockerfile, tags it with staging_tag, and exposes its immutable imageId as an output. push stays false so nothing ships yet.io.kestra.plugin.discord.DiscordIncomingWebhook (notify_approval) posts a message announcing that build {{ outputs.build.imageId }} is paused before promotion.io.kestra.plugin.core.flow.Pause (approve_promotion) halts the execution for up to approval_timeout (default PT4H) until a human resumes it.io.kestra.plugin.docker.Tag (tag_production) retags sourceImage: {{ outputs.build.imageId }} to targetImage: {{ inputs.production_tag }}.io.kestra.plugin.docker.Push (push_production) pushes the production tag to ghcr.io using registry credentials.A container registry and a Dockerfile have no concept of "the image I approved." Kestra adds the missing control plane: the Webhook trigger turns an external release event into a run, Pause provides a real human approval step with a timeout, retries can be attached to flaky pushes, and every execution captures lineage from build to push. The whole pipeline is declarative YAML you can version and review. Docker's own tooling can build and push, but it cannot pause for approval, notify a team, or guarantee that the pushed image is byte-for-byte the one that was reviewed. That promotion gate is the gap Kestra fills.
ghcr.io) you can push to.REGISTRY_USERNAME: username for the container registry push.REGISTRY_PASSWORD: password or token for the registry push.DOCKER_PROMOTE_WEBHOOK_KEY: key guarding the webhook trigger.DISCORD_WEBHOOK_URL: Discord incoming webhook URL for the approval notification.dockerfile with your real build, or adapt build to pull a prebuilt image.staging_tag and production_tag to your registry references.approve_promotion Pause to promote.build task for a pull of a prebuilt digest if your CI builds images elsewhere.push_production to absorb transient registry errors.