about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2019-10-05T21·33+0100
committerVincent Ambo <github@tazj.in>2019-10-06T22·05+0100
commit6912658c72291caefd7c7ea6312a35c3a686cf61 (patch)
tree47f41a4cb8ee9d1e7f3eda998471f1578d557e2d
parent95abb1bcde75253aa35669eed26f734d02c6a870 (diff)
feat(server): Use hash of Nixery source as version
Uses a hash of Nixery's sources as the version displayed when Nixery
launches or logs an error. This makes it possible to distinguish
between errors logged from different versions.

The source hashes should be reproducible between different checkouts
of the same source tree.
-rw-r--r--tools/nixery/default.nix11
-rw-r--r--tools/nixery/server/default.nix40
-rw-r--r--tools/nixery/server/logs.go2
-rw-r--r--tools/nixery/server/main.go6
4 files changed, 48 insertions, 11 deletions
diff --git a/tools/nixery/default.nix b/tools/nixery/default.nix
index c1a3c9f7dca5..20a5b50220e1 100644
--- a/tools/nixery/default.nix
+++ b/tools/nixery/default.nix
@@ -19,13 +19,22 @@
 with pkgs;
 
 rec {
+  # Hash of all Nixery sources - this is used as the Nixery version in
+  # builds to distinguish errors between deployed versions, see
+  # server/logs.go for details.
+  nixery-src-hash = pkgs.runCommand "nixery-src-hash" {} ''
+    echo ${./.} | grep -Eo '[a-z0-9]{32}' > $out
+  '';
+
   # Go implementation of the Nixery server which implements the
   # container registry interface.
   #
   # Users will usually not want to use this directly, instead see the
   # 'nixery' derivation below, which automatically includes runtime
   # data dependencies.
-  nixery-server = callPackage ./server { };
+  nixery-server = callPackage ./server {
+    srcHash = nixery-src-hash;
+  };
 
   # Implementation of the Nix image building logic
   nixery-build-image = import ./build-image { inherit pkgs; };
diff --git a/tools/nixery/server/default.nix b/tools/nixery/server/default.nix
index 573447a6c3df..d497f106b02e 100644
--- a/tools/nixery/server/default.nix
+++ b/tools/nixery/server/default.nix
@@ -12,21 +12,45 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{ buildGoPackage, lib }:
+{ buildGoPackage, go, lib, srcHash }:
 
-buildGoPackage {
+buildGoPackage rec {
   name = "nixery-server";
   goDeps = ./go-deps.nix;
   src = ./.;
 
   goPackagePath = "github.com/google/nixery/server";
-
-  # Enable checks and configure check-phase to include vet:
   doCheck = true;
-  preCheck = ''
-    for pkg in $(getGoDirs ""); do
-      buildGoDir vet "$pkg"
-    done
+
+  # The following phase configurations work around the overengineered
+  # Nix build configuration for Go.
+  #
+  # All I want this to do is produce a binary in the standard Nix
+  # output path, so pretty much all the phases except for the initial
+  # configuration of the "dependency forest" in $GOPATH have been
+  # overridden.
+  #
+  # This is necessary because the upstream builder does wonky things
+  # with the build arguments to the compiler, but I need to set some
+  # complex flags myself
+
+  outputs = [ "out" ];
+  preConfigure = "bin=$out";
+  buildPhase = ''
+    runHook preBuild
+    runHook renameImport
+
+    export GOBIN="$out/bin"
+    go install -ldflags "-X main.version=$(cat ${srcHash})" ${goPackagePath}
+  '';
+
+  fixupPhase = ''
+    remove-references-to -t ${go} $out/bin/server
+  '';
+
+  checkPhase = ''
+    go vet ${goPackagePath}
+    go test ${goPackagePath}
   '';
 
   meta = {
diff --git a/tools/nixery/server/logs.go b/tools/nixery/server/logs.go
index 55e0a13a03ea..9d1f17aed5cf 100644
--- a/tools/nixery/server/logs.go
+++ b/tools/nixery/server/logs.go
@@ -27,7 +27,6 @@ type reportLocation struct {
 
 var nixeryContext = serviceContext{
 	Service: "nixery",
-	Version: "TODO(tazjin)", // angry?
 }
 
 // isError determines whether an entry should be logged as an error
@@ -63,6 +62,7 @@ func (f stackdriverFormatter) Format(e *log.Entry) ([]byte, error) {
 }
 
 func init() {
+	nixeryContext.Version = version
 	log.SetReportCaller(true)
 	log.SetFormatter(stackdriverFormatter{})
 }
diff --git a/tools/nixery/server/main.go b/tools/nixery/server/main.go
index 878e59ff6d50..ca1f3c69f2d8 100644
--- a/tools/nixery/server/main.go
+++ b/tools/nixery/server/main.go
@@ -47,6 +47,10 @@ import (
 // https://docs.docker.com/registry/spec/manifest-v2-2/
 const manifestMediaType string = "application/vnd.docker.distribution.manifest.v2+json"
 
+// This variable will be initialised during the build process and set
+// to the hash of the entire Nixery source tree.
+var version string = "devel"
+
 // Regexes matching the V2 Registry API routes. This only includes the
 // routes required for serving images, since pushing and other such
 // functionality is not available.
@@ -243,7 +247,7 @@ func main() {
 		Pop:    pop,
 	}
 
-	log.Printf("Starting Nixery on port %s\n", cfg.Port)
+	log.Printf("Starting Nixery (version %s) on port %s\n", version, cfg.Port)
 
 	// All /v2/ requests belong to the registry handler.
 	http.Handle("/v2/", &registryHandler{