New to Kestra?
Use blueprints to kickstart your first workflows.
Trigger Liquibase database migrations from a release webhook with Kestra. Apply changelogs with liquibase update and confirm every migration in Slack.
Schema migrations that run as a manual psql session are invisible, unrepeatable, and easy to skip. This blueprint turns them into an orchestrated release step: your CI pipeline calls a Kestra webhook when a release ships, io.kestra.plugin.liquibase.CLI runs liquibase update against the target database, and Slack confirms the migration in the same channel that watched the deploy. The changelog travels with the task through inputFiles, and the JDBC URL and credentials never appear in the flow because Liquibase reads them from environment variables populated by Kestra secrets.
release_webhook (io.kestra.plugin.core.trigger.Webhook) starts the flow when your release pipeline calls the webhook URL with the configured key. Replace change-me-strong-webhook-key with a strong random value before use.run_migration (io.kestra.plugin.liquibase.CLI) receives the YAML changelog through inputFiles and runs liquibase update in the plugin's container image, which ships with the liquibase binary on the PATH.LIQUIBASE_COMMAND_URL, LIQUIBASE_COMMAND_USERNAME, and LIQUIBASE_COMMAND_PASSWORD environment variables, each filled from a Kestra secret, so the flow file contains no credentials.confirm_migration posts a Slack confirmation with the flow and execution identifiers, and the errors block posts a distinct alert when the update fails.Liquibase knows how to apply a changelog, but not when a release happened, who should be told, or what to do on failure. Kestra supplies the trigger, the secret injection, the retry and error handling, and the notification, all around an unchanged liquibase update command. The webhook makes the migration a first-class release step that any CI system can call with one HTTP request.
DB_URL secret to jdbc:h2:file:./demo-db with username sa and an empty password, the plugin image bundles the H2 driver. For production, point it at your real database, for example jdbc:postgresql://db-host:5432/app or jdbc:mysql://db-host:3306/app.DB_URL: JDBC URL of the target database.DB_USERNAME: database username.DB_PASSWORD: database password.SLACK_WEBHOOK_URL: Slack incoming webhook URL.namespaceFiles instead of inline inputFiles, so the same files drive local development and production.tagDatabase, then pair this flow with the tagged rollback blueprint for one-click reversals.