about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2020-08-31T00·36+0100
committertazjin <mail@tazj.in>2020-08-31T23·14+0000
commit9c482d6238cccbe038b11e71468ee73edd124309 (patch)
treee9685572cf0ba54eabd8aab3e9876126fad7f709
parent61d2d2d50379e8e445255ec7863f1610ce984b26 (diff)
feat(ci): Add subtarget support for builds r/1748
We have naturally evolved a distinction between logical and physical
targets.

Physical targets are those which correspond directly to a tree
location on disk and can be built with `-A path.to.files`, while
logical targets are those that are exported from within an expression
but do not have a corresponding file on disk.

This change adds support for exporting logical targets from any tree
location by adding a `meta.targets` attribute containing keys into
itself, which will be consumed by the CI target gathering logic and
included in the generated pipeline.

Note that the labels for subtargets are syntactically different to
emphasise that they do not correspond to a file location. For example,
this change enables 'ops.nixos.whitbySystem' as a subtarget, which is
labeled in CI as `ops/nixos:whitbySystem`.

Change-Id: Ied09647a62c2ba98e3914548e3742ad422c63ecf
Reviewed-on: https://cl.tvl.fyi/c/depot/+/1893
Tested-by: BuildkiteCI
Reviewed-by: glittershark <grfn@gws.fyi>
-rw-r--r--default.nix19
-rw-r--r--ops/nixos/default.nix1
-rw-r--r--ops/pipelines/depot.nix19
3 files changed, 31 insertions, 8 deletions
diff --git a/default.nix b/default.nix
index 151d8987ea3d..61821bce8fc2 100644
--- a/default.nix
+++ b/default.nix
@@ -50,10 +50,25 @@ let
 
   # Walk the tree starting with 'node', recursively extending the list
   # of build targets with anything that looks buildable.
+  #
+  # Any tree node can specify logical targets by exporting a
+  # 'meta.targets' attribute containing a list of keys in itself. This
+  # enables target specifications that do not exist on disk directly.
   gather = node:
     if node ? __readTree then
-      (if eligible node then [node] else []) ++
-      concatMap gather (attrValues node)
+      # Include the node itself if it is eligible.
+      (if eligible node then [ node ] else [])
+      # Include eligible children of the node
+      ++ concatMap gather (attrValues node)
+      # Include specified sub-targets of the node
+      ++ filter eligible (map
+           (k: (node."${k}" or {}) // {
+             # Keep the same tree location, but explicitly mark this
+             # node as a subtarget.
+             __readTree = node.__readTree;
+             __subtarget = k;
+           })
+           (node.meta.targets or []))
     else [];
 in fix(self: {
   config = config self;
diff --git a/ops/nixos/default.nix b/ops/nixos/default.nix
index 917a56b766da..5bd32e40685b 100644
--- a/ops/nixos/default.nix
+++ b/ops/nixos/default.nix
@@ -48,4 +48,5 @@ rec {
   # TODO(tazjin): Refactor the whole systems setup, it's a bit
   # inconsistent at the moment.
   whitbySystem = (nixosFor whitby).system;
+  meta.targets = [ "whitbySystem" ];
 }
diff --git a/ops/pipelines/depot.nix b/ops/pipelines/depot.nix
index 5d1f2babe123..ec7fb813278b 100644
--- a/ops/pipelines/depot.nix
+++ b/ops/pipelines/depot.nix
@@ -13,12 +13,19 @@ let
 
   # Create an expression that builds the target at the specified
   # location.
-  mkBuildExpr =
-    let descend = expr: attr: "builtins.getAttr \"${attr}\" (${expr})";
-    in foldl' descend "import ./. {}";
+  mkBuildExpr = target:
+    let
+      descend = expr: attr: "builtins.getAttr \"${attr}\" (${expr})";
+      targetExpr = foldl' descend "import ./. {}" target.__readTree;
+      subtargetExpr = descend targetExpr target.__subtarget;
+    in if target ? __subtarget then subtargetExpr else targetExpr;
 
   # Create a pipeline label from the targets tree location.
-  mkLabel = concatStringsSep "/";
+  mkLabel = target:
+    let label = concatStringsSep "/" target.__readTree;
+    in if target ? __subtarget
+      then "${label}:${target.__subtarget}"
+      else label;
 
   # Create a pipeline step from a single target.
   #
@@ -27,9 +34,9 @@ let
   # regardless, but this data is not accessible.
   mkStep = target: {
     command = ''
-      nix-build -E '${mkBuildExpr target.__readTree}' || (buildkite-agent meta-data set "failure" "1"; exit 1)
+      nix-build -E '${mkBuildExpr target}' || (buildkite-agent meta-data set "failure" "1"; exit 1)
     '';
-    label = ":nix: ${mkLabel target.__readTree}";
+    label = ":nix: ${mkLabel target}";
   };
 
   # Protobuf check step which validates that changes to .proto files