Commit 291b6d1cb650

Vincent Demeester <vincent@sbr.pm>
2020-05-06 08:40:39
builds/nixos: add ci.nix and use only on nixos build
Signed-off-by: Vincent Demeester <vincent@sbr.pm>
1 parent 86851d2
.builds/nixos.19.09.yml
@@ -1,9 +0,0 @@
-image: nixos/19.09
-sources:
-  - https://gitlab.com/vdemeester/home.git
-secrets:
-  - 0818d60d-b587-4d4e-81d8-dc15072ccb97
-tasks:
-- pkgs: |
-    export CACHIX_SIGNING_KEY=$(cat ~/.cachix.key)
-    nix-build home/pkgs | cachix push shortbrain
.builds/nixos.20.03.yml → .builds/nixos.yml
@@ -6,4 +6,4 @@ secrets:
 tasks:
 - pkgs: |
     export CACHIX_SIGNING_KEY=$(cat ~/.cachix.key)
-    nix-build home/pkgs | cachix push shortbrain
+    nix-build ci.nix -A cacheOutputs | cachix push shortbrain
pkgs/default.nix
@@ -1,7 +1,5 @@
-{ system ? builtins.currentSystem }:
-let
-  pkgs = import <nixpkgs> { inherit system; };
-in
+{ pkgs ? import <nixpkgs> {} }:
+
 rec {
   # pre nur-packages import
   scripts = pkgs.callPackage ./scripts {};
ci.nix
@@ -0,0 +1,58 @@
+# This file provides all the buildable and cacheable packages and
+# package outputs in you package set. These are what gets built by CI,
+# so if you correctly mark packages as
+#
+# - broken (using `meta.broken`),
+# - unfree (using `meta.license.free`), and
+# - locally built (using `preferLocalBuild`)
+#
+# then your CI will be able to build and cache only those packages for
+# which this is possible.
+
+{ pkgs ? import <nixpkgs> {} }:
+
+with builtins;
+let
+  isReserved = n: n == "lib" || n == "overlays" || n == "modules";
+  isDerivation = p: isAttrs p && p ? type && p.type == "derivation";
+  isBuildable = p: !(p.meta.broken or false) && p.meta.license.free or true;
+  isCacheable = p: !(p.preferLocalBuild or false);
+  shouldRecurseForDerivations = p: isAttrs p && p.recurseForDerivations or false;
+
+  nameValuePair = n: v: { name = n; value = v; };
+
+  concatMap = builtins.concatMap or (f: xs: concatLists (map f xs));
+
+  flattenPkgs = s:
+    let
+      f = p:
+        if shouldRecurseForDerivations p then flattenPkgs p
+        else if isDerivation p then [ p ]
+        else [];
+    in
+      concatMap f (attrValues s);
+
+  outputsOf = p: map (o: p.${o}) p.outputs;
+
+  nurAttrs = import ./pkgs/default.nix { inherit pkgs; };
+
+  nurPkgs =
+    flattenPkgs
+      (
+        listToAttrs
+          (
+            map (n: nameValuePair n nurAttrs.${n})
+              (
+                filter (n: !isReserved n)
+                  (attrNames nurAttrs)
+              )
+          )
+      );
+in
+rec {
+  buildPkgs = filter isBuildable nurPkgs;
+  cachePkgs = filter isCacheable buildPkgs;
+
+  buildOutputs = concatMap outputsOf buildPkgs;
+  cacheOutputs = concatMap outputsOf cachePkgs;
+}