BuildService
Last validated: 2026-05-20
BuildService provides remote image-build orchestration and build status/log surfaces.
RPC Surface
| RPC | HTTP annotation | Purpose |
|---|---|---|
CreateBuild | POST /v1/ignite/builds | Start a build job |
GetBuild | GET /v1/ignite/builds/{build_id} | Get build detail |
ListBuilds | GET /v1/ignite/builds | List builds with filters/pagination |
StreamBuildLogs | GET /v1/ignite/builds/{build_id}/logs/stream | Stream log output |
CancelBuild | POST /v1/ignite/builds/{build_id}/cancel | Cancel build |
SaveBuildSecrets | PUT /v1/ignite/builds/secrets | Save org-level build credentials/secrets |
UploadBuildContext | gRPC stream only | Upload context in chunks and receive context_id |
Build Sources
CreateBuildRequest supports one source at a time:
context_id(from priorUploadBuildContext)- inline
zipped_code git_source(URL/ref/context directory)
Build Status Lifecycle
Build status enum includes:
PENDINGRUNNINGSUCCEEDEDFAILEDCANCELLED
Important Notes
build_tierfield is currently deprecated/ignored by service logic and retained for compatibility.- BuildService availability can be disabled at runtime startup when required build infrastructure initialization fails.
SaveBuildSecretscovers build-specific credential storage; this is distinct from typed customerSecretServiceentries.
Operational Advice
- Use
UploadBuildContextfor large sources. - Stream logs for long-running builds rather than polling only.
- Capture
build_idin automation pipelines and always query terminal status before promotion actions.
gRPC and HTTP Examples
Create build from git source (gRPC)
grpcurl \
-H "authorization: Bearer $TOKEN" \
-d '{
"name":"my-app",
"registry":"ghcr.io",
"repository":"acme/my-app",
"tags":["latest"],
"git_source":{
"url":"https://github.com/acme/my-app.git",
"reference":"main",
"context_dir":"."
}
}' \
rpc.dev.dodil.io:443 dodil.ignite.v1.BuildService/CreateBuildCreate build from git source (HTTP)
curl -sS -X POST \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
"https://api.dev.dodil.io/v1/ignite/builds" \
-d '{
"name":"my-app",
"registry":"ghcr.io",
"repository":"acme/my-app",
"tags":["latest"],
"git_source":{
"url":"https://github.com/acme/my-app.git",
"reference":"main"
}
}'Get build status (gRPC)
grpcurl \
-H "authorization: Bearer $TOKEN" \
-d '{"build_id":"<build_id>"}' \
rpc.dev.dodil.io:443 dodil.ignite.v1.BuildService/GetBuildList builds (HTTP)
curl -sS \
-H "Authorization: Bearer $TOKEN" \
"https://api.dev.dodil.io/v1/ignite/builds"Stream build logs (gRPC)
grpcurl \
-H "authorization: Bearer $TOKEN" \
-d '{"build_id":"<build_id>","from_start":true}' \
rpc.dev.dodil.io:443 dodil.ignite.v1.BuildService/StreamBuildLogsSave build secrets (HTTP)
curl -sS -X PUT \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
"https://api.dev.dodil.io/v1/ignite/builds/secrets" \
-d '{
"registry_credentials":{
"ghcr.io":"{\"username\":\"bot\",\"password\":\"<token>\"}"
},
"build_secrets":{
"PIP_INDEX_URL":"https://pypi.example.internal/simple"
}
}'Upload build context (streaming note)
UploadBuildContext is client-streaming and usually easier through CLI (dodil ignite build upload) or SDK wrappers than raw shell tooling.