We currently use Argo Workflows (to express the pipelines) plus Argo Events (to start automatic tests on GitHub webhooks), which allows us control over the Kubernetes aspect, but it is a mess of YAML, and it requires us to first put the workflows into Kubernetes as "workflow templates" that are then executed to generate the running "workflows". Argo is also quite flaky and buggy. I've been thinking of using Jsonnet to make this less of a mess, but that doesn't solve all the complaints.
We also use CircleCI for some stuff, but it's much too limited; no support for running multiple nodes, for example. We've decided to just use it for normal building, unit tests, and linting.
Yaml mess? See https://cuelang.org