Webhook icon
XExecution icon
SlackIncomingWebhook icon

Announce a Product Release on X from a CI Webhook

Announce product releases on X automatically. CI fires a Kestra webhook, the flow posts an execution notification with version and highlights, and Slack confirms.

Categories
Business

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.

How it works

  1. 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.
  2. 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.
  3. Every dynamic fragment uses {{ trigger.body.version ?? inputs.version }} style fallbacks, so the same flow serves webhook-driven releases in production and manual runs during setup.
  4. 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.
  5. The 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.

What you get

  • Release announcements published seconds after CI finishes, with no human in the copy-paste loop.
  • Post copy assembled from reviewed inputs and CI payload fields, never improvised at publish time, with the version rendered as its own key-value line.
  • An internal Slack confirmation carrying the public copy's version, so the team sees what customers see.
  • A failure path that reports when the post did not go out, separating shipped from announced.

Who it's for

  • Product teams whose release announcements lag the release by hours because a human posts them.
  • Developer relations engineers who want changelog publishing wired into the delivery pipeline.
  • Anyone who has shipped a release and forgotten to tell the public about it.

Why orchestrate this with Kestra

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.

Prerequisites

  • An X developer app with OAuth 1.0a user context credentials for the account that posts.
  • A CI pipeline able to POST JSON to the webhook URL after a release.
  • A Slack incoming webhook for internal confirmations.

Secrets

  • 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.

Quick start

  1. Add the six secrets to your Kestra namespace.
  2. Execute the flow manually with the default inputs and confirm the post appears on the X account and the Slack confirmation arrives.
  3. Review the post copy carefully, it is public the moment the task runs.
  4. Add the webhook URL with its key to the CI release job and ship a release.

How to extend

  • Switch to app-only authentication by replacing the four OAuth properties with bearerToken, as shown in the plugin documentation.
  • Add a core.execution.Fail confirmation gate for high-stakes announcements, as shown in the incident notice blueprint.
  • Post the same announcement to Discord or LinkedIn style channels by adding their notification tasks after post_announcement.
  • Add more customFields entries, for example the commit SHA or build number, each renders as its own key-value line within the same 280 character cap.

Links

See How

New to Kestra?

Use blueprints to kickstart your first workflows.