waitForBuild waits for a build with the given transition to reach a terminal state. It returns nil on success, or an error if the build fails, is canceled, or the context expires. If an unexpected transition is received, it returns an error immediately.
(ctx context.Context, logger slog.Logger, updates <-chan codersdk.WorkspaceBuildUpdate, transition codersdk.WorkspaceTransition)
| 199 | // fails, is canceled, or the context expires. If an unexpected transition |
| 200 | // is received, it returns an error immediately. |
| 201 | func waitForBuild(ctx context.Context, logger slog.Logger, updates <-chan codersdk.WorkspaceBuildUpdate, transition codersdk.WorkspaceTransition) error { |
| 202 | for { |
| 203 | select { |
| 204 | case <-ctx.Done(): |
| 205 | return ctx.Err() |
| 206 | case update, ok := <-updates: |
| 207 | if !ok { |
| 208 | return xerrors.New("build updates channel closed") |
| 209 | } |
| 210 | logger.Debug(ctx, "received build update", |
| 211 | slog.F("transition", update.Transition), |
| 212 | slog.F("job_status", update.JobStatus), |
| 213 | slog.F("build_number", update.BuildNumber)) |
| 214 | |
| 215 | if update.Transition != string(transition) { |
| 216 | return xerrors.Errorf("unexpected transition: expected %s, got %s (build_number=%d)", transition, update.Transition, update.BuildNumber) |
| 217 | } |
| 218 | switch codersdk.ProvisionerJobStatus(update.JobStatus) { |
| 219 | case codersdk.ProvisionerJobSucceeded: |
| 220 | return nil |
| 221 | case codersdk.ProvisionerJobFailed: |
| 222 | return xerrors.Errorf("workspace build failed (transition=%s, build_number=%d)", update.Transition, update.BuildNumber) |
| 223 | case codersdk.ProvisionerJobCanceled: |
| 224 | return xerrors.Errorf("workspace build canceled (transition=%s, build_number=%d)", update.Transition, update.BuildNumber) |
| 225 | default: |
| 226 | // Intermediate states (pending, running, canceling) |
| 227 | // are expected; keep waiting. |
| 228 | } |
| 229 | } |
| 230 | } |
| 231 | } |
| 232 | |
| 233 | func (r *Runner) Cleanup(ctx context.Context, id string, logs io.Writer) error { |
| 234 | if r.workspacebuildRunner != nil { |
no test coverage detected