buildkite is a CI system where you provide the runners, and it (the SaaS) hosts the dashboards and schedulers. Builds can be triggered via webhook integration with a few code hosts, manually, cron, or via api.
Agents are what you run to run your builds. By themselves, they aren't isolated, relying on tools configured on the host. The build steps are just that, commands run on the host, which makes it awkward to do versioned / isolated tools.
The build pipeline is more interesting: the first pass of the pipeline is in the dashboard (configurable via api, eg terraform provider). Once running, the pipeline can then be extended/modified by uploading new parts.
In the dashboard:
1steps:
2 - label: ":pipeline: Pipeline upload"
3 command: buildkite-agent pipeline upload .buildkite/pipeline.yaml
Then in your repo's .buildkite/pipeline.yaml you can configure your builds in a way that's source controlled (and modifiable in prs...).
1steps:
2 - command: |
3 docker run --rm -it \
4 -v ${GOMODCACHE}:/go/pkg/mod \
5 -v ${GOCACHE}:/root/.cache/go-build \
6 -v ${BUILDKITE_BUILD_CHECKOUT_PATH}:/workspace \
7 -w /workspace \
8 $GOIMAGE \
9 go build ./...