about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2019-09-21T14·04+0100
committerVincent Ambo <github@tazj.in>2019-09-21T14·25+0100
commit0000b956bb2333cc09fb52fb063d383ec1fd90e3 (patch)
treef4d8a8f1d8e4e0f8da83902cfe7f845dc16494ec
parentc391a7b7f81f30de59b3bf186bf0e51ad0e308ce (diff)
feat(server): Log Nix output live during the builds
Instead of dumping all Nix output as one at the end of the build
process, stream it live as the lines come in.

This is a lot more useful for debugging stuff like where manifest
retrievals get stuck.
-rw-r--r--tools/nixery/server/builder/builder.go15
1 files changed, 12 insertions, 3 deletions
diff --git a/tools/nixery/server/builder/builder.go b/tools/nixery/server/builder/builder.go
index b2e183b5a2b7..a5744a85348a 100644
--- a/tools/nixery/server/builder/builder.go
+++ b/tools/nixery/server/builder/builder.go
@@ -18,6 +18,7 @@
 package builder
 
 import (
+	"bufio"
 	"bytes"
 	"context"
 	"encoding/json"
@@ -107,6 +108,15 @@ func convenienceNames(packages []string) []string {
 	return packages
 }
 
+// logNix logs each output line from Nix. It runs in a goroutine per
+// output channel that should be live-logged.
+func logNix(name string, r io.ReadCloser) {
+	scanner := bufio.NewScanner(r)
+	for scanner.Scan() {
+		log.Printf("\x1b[31m[nix - %s]\x1b[39m %s\n", name, scanner.Text())
+	}
+}
+
 // Call out to Nix and request that an image be built. Nix will, upon success,
 // return a manifest for the container image.
 func BuildImage(ctx *context.Context, cfg *config.Config, cache *LocalCache, image *Image, bucket *storage.BucketHandle) (*BuildResult, error) {
@@ -149,6 +159,7 @@ func BuildImage(ctx *context.Context, cfg *config.Config, cache *LocalCache, ima
 		if err != nil {
 			return nil, err
 		}
+		go logNix(image.Name, errpipe)
 
 		if err = cmd.Start(); err != nil {
 			log.Println("Error starting nix-build:", err)
@@ -157,11 +168,9 @@ func BuildImage(ctx *context.Context, cfg *config.Config, cache *LocalCache, ima
 		log.Printf("Started Nix image build for '%s'", image.Name)
 
 		stdout, _ := ioutil.ReadAll(outpipe)
-		stderr, _ := ioutil.ReadAll(errpipe)
 
 		if err = cmd.Wait(); err != nil {
-			// TODO(tazjin): Propagate errors upwards in a usable format.
-			log.Printf("nix-build execution error: %s\nstdout: %s\nstderr: %s\n", err, stdout, stderr)
+			log.Printf("nix-build execution error: %s\nstdout: %s\n", err, stdout)
 			return nil, err
 		}