about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2019-10-11T00·28+0100
committerVincent Ambo <github@tazj.in>2019-10-11T11·37+0100
commit0693e371d66bfe3de2d97ab80e9c9684ec8abc34 (patch)
tree6df4668f712d45dbc32a23a795096bd47a6ee36b
parentbf2718cebbd1c7af15c54c6da5685ed6d933cab4 (diff)
feat(server): Apply GZIP compression to all image layers
This fixes #62
-rw-r--r--tools/nixery/build-image/build-image.nix4
-rw-r--r--tools/nixery/server/builder/archive.go14
-rw-r--r--tools/nixery/server/builder/builder.go2
-rw-r--r--tools/nixery/server/manifest/manifest.go4
4 files changed, 15 insertions, 9 deletions
diff --git a/tools/nixery/build-image/build-image.nix b/tools/nixery/build-image/build-image.nix
index 68a061290ed5..b78ee6626464 100644
--- a/tools/nixery/build-image/build-image.nix
+++ b/tools/nixery/build-image/build-image.nix
@@ -126,9 +126,9 @@ let
   # Image layer that contains the symlink forest created above. This
   # must be included in the image to ensure that the filesystem has a
   # useful layout at runtime.
-  symlinkLayer = runCommand "symlink-layer.tar" {} ''
+  symlinkLayer = runCommand "symlink-layer.tar.gz" {} ''
     cp -r ${contentsEnv}/ ./layer
-    tar --transform='s|^\./||' -C layer --sort=name --mtime="@$SOURCE_DATE_EPOCH" --owner=0 --group=0 -cf $out .
+    tar --transform='s|^\./||' -C layer --sort=name --mtime="@$SOURCE_DATE_EPOCH" --owner=0 --group=0 -czf $out .
   '';
 
   # Metadata about the symlink layer which is required for serving it.
diff --git a/tools/nixery/server/builder/archive.go b/tools/nixery/server/builder/archive.go
index 63ea9c73814d..55b3c2a8b79c 100644
--- a/tools/nixery/server/builder/archive.go
+++ b/tools/nixery/server/builder/archive.go
@@ -9,6 +9,7 @@ package builder
 
 import (
 	"archive/tar"
+	"compress/gzip"
 	"io"
 	"os"
 	"path/filepath"
@@ -16,10 +17,11 @@ import (
 	"github.com/google/nixery/server/layers"
 )
 
-// Create a new tarball from each of the paths in the list and write the tarball
-// to the supplied writer.
-func tarStorePaths(l *layers.Layer, w io.Writer) error {
-	t := tar.NewWriter(w)
+// Create a new compressed tarball from each of the paths in the list
+// and write it to the supplied writer.
+func packStorePaths(l *layers.Layer, w io.Writer) error {
+	gz := gzip.NewWriter(w)
+	t := tar.NewWriter(gz)
 
 	for _, path := range l.Contents {
 		err := filepath.Walk(path, tarStorePath(t))
@@ -32,6 +34,10 @@ func tarStorePaths(l *layers.Layer, w io.Writer) error {
 		return err
 	}
 
+	if err := gz.Close(); err != nil {
+		return err
+	}
+
 	return nil
 }
 
diff --git a/tools/nixery/server/builder/builder.go b/tools/nixery/server/builder/builder.go
index 78d09b55b1ec..748ff5f67d7b 100644
--- a/tools/nixery/server/builder/builder.go
+++ b/tools/nixery/server/builder/builder.go
@@ -270,7 +270,7 @@ func prepareLayers(ctx context.Context, s *State, image *Image, result *ImageRes
 		} else {
 			lh := l.Hash()
 			lw := func(w io.Writer) error {
-				return tarStorePaths(&l, w)
+				return packStorePaths(&l, w)
 			}
 
 			entry, err := uploadHashLayer(ctx, s, lh, lw)
diff --git a/tools/nixery/server/manifest/manifest.go b/tools/nixery/server/manifest/manifest.go
index 2f236178b65f..8e65fa223b18 100644
--- a/tools/nixery/server/manifest/manifest.go
+++ b/tools/nixery/server/manifest/manifest.go
@@ -15,7 +15,7 @@ const (
 
 	// media types
 	manifestType = "application/vnd.docker.distribution.manifest.v2+json"
-	layerType    = "application/vnd.docker.image.rootfs.diff.tar"
+	layerType    = "application/vnd.docker.image.rootfs.diff.tar.gzip"
 	configType   = "application/vnd.docker.container.image.v1+json"
 
 	// image config constants
@@ -102,7 +102,7 @@ func Manifest(layers []Entry) (json.RawMessage, ConfigLayer) {
 
 	hashes := make([]string, len(layers))
 	for i, l := range layers {
-		l.MediaType = "application/vnd.docker.image.rootfs.diff.tar"
+		l.MediaType = layerType
 		layers[i] = l
 		hashes[i] = l.Digest
 	}