func (p *AWSProvider) buildWait(a *structs.App, b *structs.Build, cmd *exec.Cmd, stdout io.ReadCloser) { // scan all output out := "" scanner := bufio.NewScanner(stdout) for scanner.Scan() { text := scanner.Text() out += text + "\n" p.kinesis().PutRecord(&kinesis.PutRecordInput{ Data: []byte(text), PartitionKey: aws.String(string(time.Now().UnixNano())), StreamName: aws.String(a.Outputs["Kinesis"]), }) } if err := scanner.Err(); err != nil { helpers.Error(nil, err) // send internal error to rollbar } // and wait for a return code werr := cmd.Wait() // reload build item to get data from BuildUpdate callback b, err := p.BuildGet(b.App, b.Id) if err != nil { helpers.Error(nil, err) // send internal error to rollbar return } // Wait / return code are errors, consider the build failed if werr != nil { b.Status = "failed" } // save final build logs / status b.Logs = string(out) err = p.BuildSave(b) if err != nil { helpers.Error(nil, err) // send internal error to rollbar return } }
func (p *AWSProvider) buildWait(a *structs.App, b *structs.Build, cmd *exec.Cmd, stdout io.ReadCloser) { // scan all output scanner := bufio.NewScanner(stdout) out := "" for scanner.Scan() { text := scanner.Text() out += text + "\n" } if err := scanner.Err(); err != nil { helpers.Error(nil, err) // send internal error to rollbar } var cmdStatus string waitErr := make(chan error) timeout := time.After(1 * time.Hour) go func() { err := cmd.Wait() switch err.(type) { case *exec.ExitError: waitErr <- err default: waitErr <- nil } }() select { case werr := <-waitErr: // Wait / return code are errors, consider the build failed if werr != nil { cmdStatus = "failed" } case <-timeout: cmdStatus = "timeout" // Force kill the build container since its taking way to long killCmd := exec.Command("docker", "kill", fmt.Sprintf("build-%s", b.Id)) killCmd.Start() } // reload build item to get data from BuildUpdate callback b, err := p.BuildGet(b.App, b.Id) if err != nil { helpers.Error(nil, err) // send internal error to rollbar return } if cmdStatus != "" { // Careful not to override the status set by BuildUpdate b.Status = cmdStatus } // save final build logs / status b.Logs = out err = p.BuildSave(b) if err != nil { helpers.Error(nil, err) // send internal error to rollbar return } }