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.
This commit is contained in:
Vincent Ambo 2019-10-05 22:33:41 +01:00 committed by Vincent Ambo
parent 95abb1bcde
commit 6912658c72
4 changed files with 48 additions and 11 deletions

View file

@ -19,13 +19,22 @@
with pkgs; with pkgs;
rec { 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 # Go implementation of the Nixery server which implements the
# container registry interface. # container registry interface.
# #
# Users will usually not want to use this directly, instead see the # Users will usually not want to use this directly, instead see the
# 'nixery' derivation below, which automatically includes runtime # 'nixery' derivation below, which automatically includes runtime
# data dependencies. # data dependencies.
nixery-server = callPackage ./server { }; nixery-server = callPackage ./server {
srcHash = nixery-src-hash;
};
# Implementation of the Nix image building logic # Implementation of the Nix image building logic
nixery-build-image = import ./build-image { inherit pkgs; }; nixery-build-image = import ./build-image { inherit pkgs; };

View file

@ -12,21 +12,45 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
{ buildGoPackage, lib }: { buildGoPackage, go, lib, srcHash }:
buildGoPackage { buildGoPackage rec {
name = "nixery-server"; name = "nixery-server";
goDeps = ./go-deps.nix; goDeps = ./go-deps.nix;
src = ./.; src = ./.;
goPackagePath = "github.com/google/nixery/server"; goPackagePath = "github.com/google/nixery/server";
# Enable checks and configure check-phase to include vet:
doCheck = true; doCheck = true;
preCheck = ''
for pkg in $(getGoDirs ""); do # The following phase configurations work around the overengineered
buildGoDir vet "$pkg" # Nix build configuration for Go.
done #
# 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 = { meta = {

View file

@ -27,7 +27,6 @@ type reportLocation struct {
var nixeryContext = serviceContext{ var nixeryContext = serviceContext{
Service: "nixery", Service: "nixery",
Version: "TODO(tazjin)", // angry?
} }
// isError determines whether an entry should be logged as an error // 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() { func init() {
nixeryContext.Version = version
log.SetReportCaller(true) log.SetReportCaller(true)
log.SetFormatter(stackdriverFormatter{}) log.SetFormatter(stackdriverFormatter{})
} }

View file

@ -47,6 +47,10 @@ import (
// https://docs.docker.com/registry/spec/manifest-v2-2/ // https://docs.docker.com/registry/spec/manifest-v2-2/
const manifestMediaType string = "application/vnd.docker.distribution.manifest.v2+json" 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 // Regexes matching the V2 Registry API routes. This only includes the
// routes required for serving images, since pushing and other such // routes required for serving images, since pushing and other such
// functionality is not available. // functionality is not available.
@ -243,7 +247,7 @@ func main() {
Pop: pop, 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. // All /v2/ requests belong to the registry handler.
http.Handle("/v2/", &registryHandler{ http.Handle("/v2/", &registryHandler{