(ctx context.Context, w io.Writer, client *codersdk.Client, buildID uuid.UUID)
| 180 | } |
| 181 | |
| 182 | func 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 { |
no test coverage detected