From b0259542e486b216e85c3e4c065d628d8c3dc18d Mon Sep 17 00:00:00 2001 From: clerie Date: Sat, 2 Sep 2023 21:47:45 +0200 Subject: [PATCH] pkgs/update-from-hydra: Add script that updates paths based on hydra builds --- flake.nix | 1 + modules/default.nix | 1 + modules/update-from-hydra/default.nix | 95 +++++++++++++++++++++ pkgs/overlay.nix | 1 + pkgs/update-from-hydra/default.nix | 12 +++ pkgs/update-from-hydra/update-from-hydra.sh | 74 ++++++++++++++++ 6 files changed, 184 insertions(+) create mode 100644 modules/update-from-hydra/default.nix create mode 100644 pkgs/update-from-hydra/default.nix create mode 100644 pkgs/update-from-hydra/update-from-hydra.sh diff --git a/flake.nix b/flake.nix index aa15219..dbe1216 100644 --- a/flake.nix +++ b/flake.nix @@ -106,6 +106,7 @@ nixfiles-update-ssh-host-keys pyexcel-xlsx pyexcel-webio + update-from-hydra uptimestatus wetter; }; diff --git a/modules/default.nix b/modules/default.nix index 018d0cd..4e3c341 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -13,6 +13,7 @@ ./monitoring ./nginx-port-forward ./nixfiles + ./update-from-hydra ./wg-clerie ]; } diff --git a/modules/update-from-hydra/default.nix b/modules/update-from-hydra/default.nix new file mode 100644 index 0000000..93d8a16 --- /dev/null +++ b/modules/update-from-hydra/default.nix @@ -0,0 +1,95 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.services.update-from-hydra; + + repositoryOpts = { config, ... }@moduleAttrs: { + options = { + + enable = mkEnableOption "Make a hydra build output availiable with a symlink and keep it up to date"; + + resultPath = mkOption { + type = types.path; + description = '' + Path to the symlink pointing to the hydra build output store path + ''; + }; + + hydraUrl = mkOption { + type = types.str; + description = '' + ''; + }; + + hydraProject = mkOption { + type = types.str; + description = '' + Hydra project name + ''; + }; + + hydraJobset = mkOption { + type = types.str; + description = '' + Hydra jobset name + ''; + }; + + hydraJob = mkOption { + type = types.str; + description = '' + Hydra job name + ''; + }; + + nixStoreUri = mkOption { + type = types.str; + description = '' + ''; + }; + + startAt = mkOption { + type = with types; either str (listOf str); + default = "hourly"; + description = '' + How often the directory should be updated. + Formatspecified by `systemd.time 7`. + This value can also be a list of `systemd.time 7` formatted + strings, in which case the service will be started on multiple + schedules. + ''; + }; + + }; + }; + +in { + options = { + services.update-from-hydra = { + + paths = mkOption { + type = with types; attrsOf (submodule repositoryOpts); + default = {}; + }; + + }; + }; + + config = { + systemd.services = (mapAttrs' (name: path: nameValuePair "update-from-hydra-${name}" (mkIf path.enable { + inherit (path) startAt; + + wantedBy = [ "multi-user.target" ]; + + script = '' + ${pkgs.update-from-hydra}/bin/update-from-hydra --hydra-url "${path.hydraUrl}" --hydra-project "${path.hydraProject}" --hydra-jobset "${path.hydraJobset}" --hydra-job "${path.hydraJob}" --nix-store-uri "${path.nixStoreUri}" --gcroot-name "${name}" "${path.resultPath}" + ''; + }) + ) cfg.paths); + }; +} + + diff --git a/pkgs/overlay.nix b/pkgs/overlay.nix index 6bcabf7..af97541 100644 --- a/pkgs/overlay.nix +++ b/pkgs/overlay.nix @@ -8,6 +8,7 @@ self: super: { nixfiles-update-ssh-host-keys = self.callPackage ./nixfiles/nixfiles-update-ssh-host-keys.nix {}; pyexcel-xlsx = self.python3.pkgs.callPackage ./pyexcel-xlsx {}; pyexcel-webio = self.python3.pkgs.callPackage ./pyexcel-webio {}; + update-from-hydra = self.callPackage ./update-from-hydra {}; uptimestatus = self.python3.pkgs.callPackage ./uptimestatus {}; wetter = self.python3.pkgs.callPackage ./wetter { inherit (self) pkg-config libsass; diff --git a/pkgs/update-from-hydra/default.nix b/pkgs/update-from-hydra/default.nix new file mode 100644 index 0000000..94ae1a3 --- /dev/null +++ b/pkgs/update-from-hydra/default.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: + +pkgs.writeShellApplication { + name = "update-from-hydra"; + text = builtins.readFile ./update-from-hydra.sh; + runtimeInputs = with pkgs; [ + curl + jq + nix + ]; +} + diff --git a/pkgs/update-from-hydra/update-from-hydra.sh b/pkgs/update-from-hydra/update-from-hydra.sh new file mode 100644 index 0000000..8d0a9af --- /dev/null +++ b/pkgs/update-from-hydra/update-from-hydra.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash + +set -euo pipefail + +while [[ $# -gt 0 ]]; do + case $1 in + --hydra-url) + HYDRA_URL="$2" + shift + shift + ;; + --hydra-project) + HYDRA_PROJECT="$2" + shift + shift + ;; + --hydra-jobset) + HYDRA_JOBSET="$2" + shift + shift + ;; + --hydra-job) + HYDRA_JOB="$2" + shift + shift + ;; + --nix-store-uri) + NIX_STORE_URI="$2" + shift + shift + ;; + --gcroot-name) + GCROOT_NAME="$2" + shift + shift + ;; + -*) + echo "Unknown option $1" + exit 1 + ;; + *) + ARGS+=("$1") + shift + ;; + esac +done + +set -- "${ARGS[@]}" + +HYDRA_JOB_URL="${HYDRA_URL}/job/${HYDRA_PROJECT}/${HYDRA_JOBSET}/${HYDRA_JOB}/latest-finished" +RESULT_PATH="$1" + +echo "Updating ${RESULT_PATH} from ${HYDRA_PROJECT}:${HYDRA_JOBSET}:${HYDRA_JOB}" + +echo "Make sure symlink directory exist" +mkdir -p "$(dirname "${RESULT_PATH}")" + +echo "Fetching job output" +STORE_PATH="$(curl -s -L -H "Accept: application/json" "${HYDRA_JOB_URL}" | jq -r .buildoutputs.out.path)" + +echo "Copying path" +nix copy --from "${NIX_STORE_URI}" "${STORE_PATH}" + +echo "Activate path" +ln -fsn "${STORE_PATH}" "${RESULT_PATH}" + +if [[ -n $GCROOT_NAME ]]; then + GCROOT_PATH="/nix/var/nix/gcroots/update-from-hydra/${GCROOT_NAME}" + echo "Add to gcroot ${GCROOT_PATH}" + mkdir -p "$(dirname "${GCROOT_PATH}")" + + ln -fsn "${RESULT_PATH}" "${GCROOT_PATH}" +fi +