MCPcopy Index your code
hub / github.com/coder/coder / waitForBuild

Function waitForBuild

scaletest/workspacebuild/run.go:182–251  ·  view source on GitHub ↗
(ctx context.Context, w io.Writer, client *codersdk.Client, buildID uuid.UUID)

Source from the content-addressed store, hash-verified

180}
181
182func waitForBuild(ctx context.Context, w io.Writer, client *codersdk.Client, buildID uuid.UUID) error {
183 ctx, span := tracing.StartSpan(ctx)
184 defer span.End()
185 _, _ = fmt.Fprint(w, "Build is currently queued...")
186
187 // Wait for build to start.
188 for {
189 build, err := client.WorkspaceBuild(ctx, buildID)
190 if err != nil {
191 return xerrors.Errorf("fetch build: %w", err)
192 }
193
194 if build.Job.Status != codersdk.ProvisionerJobPending {
195 break
196 }
197
198 _, _ = fmt.Fprint(w, ".")
199 time.Sleep(500 * time.Millisecond)
200 }
201
202 _, _ = fmt.Fprintln(w, "\nBuild started! Streaming logs below:")
203
204 logs, closer, err := client.WorkspaceBuildLogsAfter(ctx, buildID, 0)
205 if err != nil {
206 return xerrors.Errorf("start streaming build logs: %w", err)
207 }
208 defer closer.Close()
209
210 currentStage := ""
211 for {
212 select {
213 case <-ctx.Done():
214 return ctx.Err()
215 case log, ok := <-logs:
216 if !ok {
217 build, err := client.WorkspaceBuild(ctx, buildID)
218 if err != nil {
219 return xerrors.Errorf("fetch build: %w", err)
220 }
221
222 _, _ = fmt.Fprintln(w, "")
223 switch build.Job.Status {
224 case codersdk.ProvisionerJobSucceeded:
225 _, _ = fmt.Fprintln(w, "\nBuild succeeded!")
226 return nil
227 case codersdk.ProvisionerJobFailed:
228 _, _ = fmt.Fprintf(w, "\nBuild failed with error %q.\nSee logs above for more details.\n", build.Job.Error)
229 return xerrors.Errorf("build failed with status %q: %s", build.Job.Status, build.Job.Error)
230 case codersdk.ProvisionerJobCanceled:
231 _, _ = fmt.Fprintln(w, "\nBuild canceled.")
232 return xerrors.New("build canceled")
233 default:
234 _, _ = fmt.Fprintf(w, "\nLogs disconnected with unexpected job status %q and error %q.\n", build.Job.Status, build.Job.Error)
235 return xerrors.Errorf("logs disconnected with unexpected job status %q and error %q", build.Job.Status, build.Job.Error)
236 }
237 }
238
239 if log.Stage != currentStage {

Callers 2

RunReturningWorkspaceMethod · 0.70
RunMethod · 0.70

Calls 8

StartSpanFunction · 0.92
WorkspaceBuildMethod · 0.80
ErrMethod · 0.80
CloseMethod · 0.65
NewMethod · 0.65
ErrorfMethod · 0.45
DoneMethod · 0.45

Tested by

no test coverage detected