feat(ci): Add subtarget support for builds
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>
This commit is contained in:
parent
61d2d2d503
commit
9c482d6238
3 changed files with 31 additions and 8 deletions
19
default.nix
19
default.nix
|
@ -50,10 +50,25 @@ let
|
||||||
|
|
||||||
# Walk the tree starting with 'node', recursively extending the list
|
# Walk the tree starting with 'node', recursively extending the list
|
||||||
# of build targets with anything that looks buildable.
|
# 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:
|
gather = node:
|
||||||
if node ? __readTree then
|
if node ? __readTree then
|
||||||
(if eligible node then [node] else []) ++
|
# Include the node itself if it is eligible.
|
||||||
concatMap gather (attrValues node)
|
(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 [];
|
else [];
|
||||||
in fix(self: {
|
in fix(self: {
|
||||||
config = config self;
|
config = config self;
|
||||||
|
|
|
@ -48,4 +48,5 @@ rec {
|
||||||
# TODO(tazjin): Refactor the whole systems setup, it's a bit
|
# TODO(tazjin): Refactor the whole systems setup, it's a bit
|
||||||
# inconsistent at the moment.
|
# inconsistent at the moment.
|
||||||
whitbySystem = (nixosFor whitby).system;
|
whitbySystem = (nixosFor whitby).system;
|
||||||
|
meta.targets = [ "whitbySystem" ];
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,12 +13,19 @@ let
|
||||||
|
|
||||||
# Create an expression that builds the target at the specified
|
# Create an expression that builds the target at the specified
|
||||||
# location.
|
# location.
|
||||||
mkBuildExpr =
|
mkBuildExpr = target:
|
||||||
let descend = expr: attr: "builtins.getAttr \"${attr}\" (${expr})";
|
let
|
||||||
in foldl' descend "import ./. {}";
|
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.
|
# 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.
|
# Create a pipeline step from a single target.
|
||||||
#
|
#
|
||||||
|
@ -27,9 +34,9 @@ let
|
||||||
# regardless, but this data is not accessible.
|
# regardless, but this data is not accessible.
|
||||||
mkStep = target: {
|
mkStep = target: {
|
||||||
command = ''
|
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
|
# Protobuf check step which validates that changes to .proto files
|
||||||
|
|
Loading…
Reference in a new issue