New to Kestra?
Use blueprints to kickstart your first workflows.
Clone, validate, and deploy Kestra flows from GitHub with a self-managed GitOps pipeline. No external CI tool needed, Kestra deploys Kestra.
Build a self-managed CI/CD pipeline for your Kestra flows where Kestra deploys Kestra. This blueprint clones a GitHub repository of flow definitions, validates every flow with the Kestra CLI, and pushes the validated flows to one or more production namespaces. It is a GitOps deployment pattern that keeps Git as the single source of truth for your orchestration code, without standing up an external CI tool such as GitHub Actions or Jenkins just to ship YAML.
All steps run inside a single io.kestra.plugin.core.flow.WorkingDirectory
task so the cloned files persist across the validate and deploy steps in one
shared workspace:
cloneRepository uses io.kestra.plugin.git.Clone to pull the main
branch of the GitHub repo containing your flow YAML files.validate_flows runs a io.kestra.plugin.scripts.shell.Commands task on
the io.kestra.plugin.core.runner.Process runner, calling
kestra flow validate flows/ to check the flows before anything ships.deploy_flows runs kestra flow namespace update against the prod and
prod.marketing namespaces with the --no-delete flag, so flows are
created or updated without removing flows that are not in the repo.prod and prod.marketing) from one run.--no-delete.Git hosts your code but cannot validate or roll out Kestra flows on its own. Kestra closes that gap: declarative YAML defines the pipeline, retries can be added to each task, every execution is logged with full lineage, and you can drive deployment from event triggers (for example a webhook on a GitHub push) instead of relying on a separate scheduler. The validate step gates the deploy step, so correctness is enforced inside the same execution graph.
kestra CLI available at /app/kestra (default in the official
Kestra Docker image).This blueprint clones a public repository and uses no secrets. To deploy
from a private repo, add a git authentication token (for example a
GITHUB_ACCESS_TOKEN secret) and reference it with
{{ secret('GITHUB_ACCESS_TOKEN') }} on the cloneRepository task.
url of cloneRepository at your own flows repository.deploy_flows to match your environment.io.kestra.plugin.core.trigger.Webhook trigger to deploy on every
GitHub push.inputs.