Hi! I'm your Kestra AI assistant. Ask me anything about workflows.
EXAMPLE QUESTIONS
How to sync my flows with Git?
How to prevent concurrent execution of the same flow?
How to schedule flow?
Fire GitHub Actions on data, not commits.
Dispatch a workflow_dispatch from cron, S3 events, Kafka messages, dbt completions, or any HTTP signal. Pass typed inputs, listen for the workflow_run webhook back, auto-open issues on flow failure, and chain Actions output with Terraform, dbt, or ServiceNow in one execution history.
Replace cron triggers and reusable workflow YAML with a workflow engine that fires workflow_dispatch on dbt completions, S3 events, or Kafka messages, handles cross-repo dispatch with approval gates outside the workflow itself, and chains Actions output with Terraform, dbt, and ServiceNow. Dispatch the same workflow across every repo in one ForEach (matrices cannot span repos).
Trigger a GitHub Actions deploy when upstream data is ready
Open blueprint
Errors branch opens a GitHub issue with execution context
Open blueprint
Run the same workflow across every repo with a tag
Open blueprint
Above the runner, around the workflow.
GitHub Actions runs the job inside the runner. Kestra wraps everything around it: when a workflow_dispatch fires, what runs before, who approves the prod deploy, and where the cross-tool audit trail lives once the runner exits. The workflow YAML, the matrix, and the action marketplace stay where they are.
workflow_dispatch from triggers GitHub Actions cannot use
GitHub Actions fires on push, pull_request, schedule, or the workflow_dispatch UI. Kestra fires it on a Kafka message, an S3 file landing, a dbt Cloud job completing, a Fivetran sync, a Pylon ticket, or any HTTP webhook. The actions.RunWorkflow task sends the dispatch with a typed inputs payload, and the workflow YAML stays in the repo where it belongs.
Workflow output flows forward to non-GitHub tasks
The runner finishes, GitHub sends the workflow_run webhook back to Kestra's Webhook trigger, and the next flow step starts. Outputs from the Actions run, the test artifact, the built image digest, the deployment URL, become inputs to a Terraform apply, a dbt build, a ServiceNow ticket update, or a Slack release note. One execution ID across the chain.
Open issues, comment on PRs, raise PRs as flow steps
issues.Create opens an issue against the right repo when a critical upstream flow fails, with the execution URL and the failing step in the body. issues.Comment posts test results back to the PR that triggered the original run. pulls.Create raises a PR for auto-generated config changes (rotated secrets, new env values, dependabot-style updates) and waits for review.
Search-driven dispatch across the whole org
repositories.Search returns every repo matching an org + topic + language filter. code.Search finds every file with a pattern. A ForEach iterates over the result and dispatches the same workflow per repo. GitHub Actions matrices cannot span repositories, so security scans, dependency bumps, or compliance checks across 200 repos become one flow definition.
Approval gate before the prod deploy workflow fires
GitHub Environments offer protection rules per environment, but they live inside one workflow definition. Kestra's Pause task gates the dispatch itself: the flow runs pre-flight checks (Trivy scan, Cosign verify, staging tests), surfaces a summary in the Kestra UI with the candidate revision, and pauses. A named reviewer resumes and only then does actions.RunWorkflow fire the prod workflow.
One execution context across Actions, Terraform, dbt, ServiceNow
The GitHub Actions tab shows runs in isolation. Kestra shows the whole story: what upstream event fired the workflow, who approved each gate, what the Actions runner produced, what ran after, and which step in the broader pipeline failed. The execution history pages link directly to the Actions run, the Terraform plan, and the ServiceNow ticket created downstream.
How GitHub Actions teams use Kestra around the runner
Patterns engineering teams ship in production. Each one shows the flow end to end, with the real plugin classes in play.
Event-driven
Dispatch the deploy workflow when dbt finishes, not when a commit lands
A dbt Cloud job completes. Kestra picks up the completion via webhook, runs a quick freshness check on the new tables, then fires actions.RunWorkflow against deploy.yml with the new revision as a workflow_dispatch input. GitHub Actions builds, deploys, and sends its workflow_run webhook back. Slack confirms with the deploy URL. The commit that triggered everything is two upstream steps away from the runner.
Dispatch fires the moment upstream is ready
No git poll, no committed trigger file, no waiting on the next cron. dbt finishes at 11:47, the deploy starts at 11:47.
Typed inputs into workflow_dispatch
The new revision, the target environment, and the feature flag set all pass through as named workflow inputs.
workflow_run webhook closes the loop
GitHub fires workflow_run on completion. Kestra's Pause task resumes when the matching run ID arrives.
One execution ID covers dbt, GitHub Actions, and Slack
Debugging starts in the Kestra UI. The execution links directly to the dbt run, the Actions run, and the Slack message.
dbt completes
webhook
freshness check
validate tables
dispatch workflow
deploy.yml
wait for completion
workflow_run webhook
notify
Slack with deploy URL
Reactive
Open a GitHub issue automatically when a production flow fails
A scheduled flow that loads warehouse data fails on the dbt step. The errors branch runs issues.Create against the data-platform repo with the failing step name, the execution URL, the last 50 log lines, and an @-mention for the on-call rotation. The same branch comments on the most recent PR that touched the failing model. Engineers wake up to context, not a paging alert.
Cross-repo issue creation
The failure happens in the orchestrator. The issue opens in the repo that owns the model. GitHub Actions cannot easily do this across repos.
Context, not just an alert
The issue body has the execution URL, the failing step, the last logs, and a link back to the runtime view in Kestra.
PR comment with the same context
If the failing model was touched in a recent PR, the flow finds it via pulls.Search and posts the same context as a PR comment.
scheduled flow
cron
load + transform
main task chain
errors branch
on any failure
find recent PR
pulls.Search
open issue
issues.Create
comment on PR
issues.Comment
Multi-repo
Dispatch the same workflow to every repo with a tag
repositories.Search returns every repo in the org tagged platform-service. A ForEach iterates over the result. Per repo, actions.RunWorkflow fires the same security-scan.yml workflow with the scan profile as input. Each workflow_run webhook updates a running summary in Kestra. Slack posts the final report with per-repo pass or fail. GitHub Actions matrices cannot span repositories. Kestra can.
Search defines the fleet
Tag-based, language-based, or topic-based filters in repositories.Search. The list updates itself as repos are added or labeled.
Per-repo isolation
Each dispatched workflow runs in its own repo with the repo's own secrets and runners. Kestra coordinates, GitHub Actions executes.
One summary instead of N tabs
The flow aggregates per-repo results and posts a single Slack report. The Actions tab in each repo still shows the raw run.
schedule
nightly
find repos
topic:platform-service
ForEach repo
dispatch per repo
dispatch workflow
security-scan.yml
aggregate results
per-repo pass/fail
summary
Slack report
Promotion
Approval-gated prod deploy with full pre-flight
An image lands in the registry. Kestra runs Trivy for critical CVEs and Cosign for signature verify. It pulls the staging workflow_run status via the GitHub API to confirm tests passed there. The summary surfaces in the Kestra UI: scan result, sig status, staging test pass count, candidate digest. A Pause task waits for a named reviewer. On resume, actions.RunWorkflow fires deploy-prod.yml with the verified digest and the reviewer name baked into the workflow input.
Gate sits before the dispatch, not inside the workflow
GitHub Environments protect deployments inside a workflow. Kestra gates the dispatch itself, so the workflow_run never starts until pre-flight passes and a reviewer resumes.
Reviewer name passes into the workflow
The Pause output includes the reviewer identity. That value flows into the workflow_dispatch input, so the Actions log shows who approved the release.
Pre-flight evidence stays in one place
Trivy output, Cosign result, staging test summary, and the reviewer signature all live in the Kestra execution. The Actions log links back.
image push
registry webhook
trivy scan
CRITICAL check
cosign verify
signature check
fetch staging status
GitHub API
approval gate
named reviewer
dispatch prod
deploy-prod.yml
wait + notify
workflow_run + Slack
Terraform is quite a big deal for us because that's basically how we work most of the day to roll out changes. Kestra will be the entity to roll out everything. This should resolve the issues we are facing currently with everyone working in parallel.
BSI Software
Kestra vs GitHub Actions orchestration alternatives
issues.Create, issues.Comment, pulls.Create as flow tasks
Action steps inside the workflow only
Custom code
Inside the workflow only
Approval gate before dispatch (not inside workflow)
Pause + resume, named reviewer logged
GitHub Environments protect inside the workflow
Custom approval UI
GitHub Environments inside the called workflow
Chain Actions output with non-GitHub tasks
Outputs flow into Terraform, dbt, ServiceNow, Slack tasks
Action steps in the workflow only
Custom code per chain
Same workflow scope
One execution history across Actions, dbt, Terraform, ServiceNow
One execution ID, links to each system
Actions tab only
Custom dashboard
Actions tab only
Self-hosted, air-gapped, OSS edition
Self-hosted by default, OSS edition free
GHE Actions or hosted runners
Self-hosted
GHE or hosted
Beyond GitHub: orchestrate the rest of the stack
1300+ plugins, cross-stack
GitHub ecosystem only
Whatever you write
GitHub ecosystem only
GitHub Actions & Kestra: common questions
Find answers to your questions right here, and don't hesitate to Contact Us if you couldn't find what you're looking for.
No. GitHub Actions still runs the workflow inside the runner, with the matrix, the marketplace actions, and the secrets. Kestra calls the GitHub API through the io.kestra.plugin.github plugin to fire workflow_dispatch from events GitHub Actions cannot trigger on, to manage issues and PRs from flows, and to chain the workflow output with non-GitHub tasks. The workflow YAML stays where it is.
The actions.RunWorkflow task calls the GitHub REST API to send a workflow_dispatch event. You pass the repo, the workflow file (or ID), the ref (branch or tag), and a map of typed inputs that the workflow declares under on.workflow_dispatch.inputs. The workflow run starts in the target repo as if a maintainer clicked Run workflow in the UI, except the trigger source is the Kestra flow and the inputs come from the upstream context.
Two options. Option A, recommended: configure the workflow's final step to POST back to a Kestra Webhook trigger. The Pause task in the dispatching flow listens for the matching run ID and resumes. Option B: poll the Actions runs API from a follow-up http.Request task with a retry block. Option A is preferred because it is event-driven and consumes no API quota while waiting.
Yes, that is a common pattern. Put issues.Create in the errors branch of a flow. The body templating gives you the failing task, the execution URL, the namespace, and any output values you want to surface. issues.Comment lets the flow post back to an existing issue or PR (use pulls.Search first to find the most recent PR touching the affected code). pulls.Create raises a PR for auto-generated config changes.
Yes. repositories.Search returns matching repos for an org + topic + language + name pattern query. A ForEach iterates over the result list. Per repo, actions.RunWorkflow fires the same workflow file with the same or different inputs. GitHub Actions matrices stay inside one workflow run in one repo. The Kestra pattern crosses repositories and aggregates results in one place.
Three options, depending on your security posture. Personal access token (oauthToken) is the simplest for org-internal flows. GitHub App installation token (appInstallationToken) is recommended for production with fine-grained repo-scoped access. GitHub App JWT (jwtToken) authenticates as the App itself for org-level operations. Tokens go through Kestra's secrets backend and never appear in logs.
Before it. GitHub Environments protect deployment jobs inside a workflow run, after the runner has already started. Kestra's Pause task sits before actions.RunWorkflow, so the dispatch itself does not fire until a named reviewer resumes. Pre-flight checks (Trivy, Cosign, staging test summary) surface in the Kestra UI for the reviewer to inspect, and the reviewer identity is recorded against the execution.
No. The io.kestra.plugin.github plugin ships in the open-source edition with all the tasks: actions.RunWorkflow, issues.Create, issues.Comment, pulls.Create, repositories.Search, commits.Search, code.Search, and more. Kestra Enterprise adds Apps for self-service forms (engineers trigger dispatch through a typed form), namespace-scoped RBAC, audit logs, worker isolation, and SSO.
Yes. Set the endpoint property on the github plugin tasks to your GHE base URL (https://ghe.example.com/api/v3) and Kestra reaches your private GitHub. Kestra itself ships self-hosted on Docker or Kubernetes, air-gapped if needed. See Kestra for infrastructure automation for the broader picture across GitHub, GitLab, Terraform, and the rest of the stack.
Ready to fire GitHub Actions on what actually matters?
Dispatch workflows from data events instead of commits, gate the prod deploy with a named reviewer, auto-open issues from failed flows, and dispatch the same workflow across every repo with a tag. Open source, self-hosted, event-driven.