From 6e68eb44f64d9ed975c2028f989bae1a2f5a2bb9 Mon Sep 17 00:00:00 2001
From: Franz Pletz <fpletz@fnordicwalking.de>
Date: Fri, 18 Aug 2023 00:29:03 +0200
Subject: [PATCH] ci: build docker image with cache

---
 .gitlab-ci.yml | 43 +++++++++++++++++++++++++++++++++++++++----
 flake.nix      | 18 +++++++++++++++---
 2 files changed, 54 insertions(+), 7 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8a735b120f..00e0d39536 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,15 +1,50 @@
 stages:
+  - prep
   - check
   - build
   - deploy
 
 variables:
   GIT_SUBMODULE_STRATEGY: recursive
+  CACHIX_CACHE_NAME: flow3r
+  BUILD_IMAGE_NAME: ${CI_REGISTRY_IMAGE}/flow3r-build:${CI_COMMIT_SHA}
 
 default:
-  # built via:
-  #     docker load < $(nix-build nix/docker-image.nix)
-  image: registry.k0.hswaw.net/q3k/flow3r-build:ymrsh8w1z9l89qvvksw52k7sl54lx73q
+  image: $BUILD_IMAGE_NAME
+
+.nix-build:
+  image: docker.nix-community.org/nixpkgs/nix-flakes
+  before_script:
+    - nix profile install .#cachix
+
+cache-devenv:
+  extends: .nix-build
+  stage: prep
+  script:
+    - set +e +o pipefail
+    - nix profile install .#jq
+    - |
+      nix flake archive --json \
+        | jq -r '.path,(.inputs|to_entries[].value.path)' \
+        | cachix push "$CACHIX_CACHE_NAME"
+    - nix develop -L --profile dev-profile -c true
+    - cachix push "$CACHIX_CACHE_NAME" dev-profile
+
+docker-image:
+  extends: .nix-build
+  stage: prep
+  needs: ["cache-devenv"]
+  script:
+    - set +e +o pipefail
+    - nix profile install .#skopeo .#jq
+    - |
+      nix build -L --json .#dockerImage \
+        | jq -r '.[].outputs | to_entries[].value' \
+        | cachix push "$CACHIX_CACHE_NAME"
+    - |
+      echo "${CI_REGISTRY_PASSWORD}" \
+        | skopeo login --username="${CI_REGISTRY_USER}" --password-stdin "${CI_REGISTRY}"
+    - skopeo copy --tmpdir /tmp --insecure-policy "docker-archive://${PWD}/result" "docker://${BUILD_IMAGE_NAME}"
 
 clang-tidy:
   stage: check
@@ -57,7 +92,7 @@ simulate:
   script:
     - python3 sim/run.py screenshot
   artifacts:
-    expose_as: 'Smulator Screenshot'
+    expose_as: 'Simulator Screenshot'
     paths: ['flow3r.png']
     expire_in: 5 hours
 
diff --git a/flake.nix b/flake.nix
index e206d71392..53a1e7102d 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,6 +1,17 @@
 {
   description = "flow3r badge flake";
 
+  nixConfig = {
+    substituters = [
+      "https://cache.nixos.org"
+      "https://flow3r.cachix.org"
+    ];
+    trusted-public-keys = [
+      "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
+      "flow3r.cachix.org-1:/v8059Hm6UdEVNKE15uxltpYM0z+pulaTpobjIvFM5A="
+    ];
+  };
+
   inputs = {
     nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
     flake-compat = {
@@ -66,6 +77,8 @@
     {
       overlays.default = import ./nix/overlay;
 
+      legacyPackages = forAllPkgs (pkgs: pkgs);
+
       packages = forAllPkgs (pkgs:
         {
           dockerImage = pkgs.dockerTools.buildImage {
@@ -81,9 +94,8 @@
               pathsToLink = [ "/bin" ];
             };
 
-            runAsRoot = ''
-              #!${pkgs.runtimeShell}
-              mkdir -p /tmp
+            extraCommands = ''
+              mkdir -m 1777 tmp
             '';
 
             config = {
-- 
GitLab