New to Kestra?
Use blueprints to kickstart your first workflows.
Announce product releases on X automatically. CI fires a Kestra webhook, the flow posts an execution notification with version and highlights, and Slack confirms.
The release is built, tagged, and deployed, and then someone remembers the announcement two hours later. This blueprint closes that gap. The CI pipeline POSTs version, highlights, and a release notes link to a Kestra webhook, and io.kestra.plugin.x.XExecution posts the release notification. The task is an execution notification poster, so the post always leads with the execution state and flow id, carries the announcement line from customMessage and a version line from customFields, and ends with a link to the execution, turning the account into a public record that the release flow ran. Slack receives an internal confirmation with the exact version that went public. Because posts on X are public and instant, the announcement line is assembled from reviewed inputs and payload fields rather than free-form generation, and the 280 character cap covers the full rendered post, status line and link included.
on_release (io.kestra.plugin.core.trigger.Webhook) exposes an endpoint guarded by a secret key. The CI pipeline POSTs a JSON body with version, highlights, and release_url after a successful deploy.post_announcement (io.kestra.plugin.x.XExecution) authenticates with the OAuth 1.0a credential set, consumer key and secret plus access token and secret, and posts the execution notification. The task renders its bundled execution template, so the post opens with the execution state and flow id, carries the customMessage announcement line and a version line from customFields, and closes with a link to the execution. The 280 character cap applies to that full rendered post, which keeps the highlights short by design.{{ trigger.body.version ?? inputs.version }} style fallbacks, so the same flow serves webhook-driven releases in production and manual runs during setup.confirm_internal (io.kestra.plugin.slack.notifications.SlackIncomingWebhook) posts the version and execution id to the team channel, so support and marketing know the announcement is live.errors block sends a distinct Slack alert when posting fails, because a release that shipped without its announcement is a silent failure someone must catch.A curl call at the end of a CI job can post to X, but it cannot fall back to manual inputs, keep an audit trail of every public post, or alert a channel when publishing fails. Kestra gives the announcement its own execution history, secrets management for the four OAuth credentials, and an errors block that guarantees a failed post never disappears quietly.
X_CONSUMER_KEY: X app consumer key (API key).X_CONSUMER_SECRET: X app consumer secret (API secret).X_ACCESS_TOKEN: OAuth 1.0a access token for the posting account.X_ACCESS_SECRET: OAuth 1.0a access secret for the posting account.SLACK_WEBHOOK_URL: Slack incoming webhook for internal confirmations and failure alerts.RELEASE_WEBHOOK_KEY: secret key guarding the release webhook endpoint.bearerToken, as shown in the plugin documentation.core.execution.Fail confirmation gate for high-stakes announcements, as shown in the incident notice blueprint.post_announcement.customFields entries, for example the commit SHA or build number, each renders as its own key-value line within the same 280 character cap.