about summary refs log tree commit diff
diff options
context:
space:
mode:
-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{