Init repository
This commit is contained in:
commit
5177d942e4
27
flake.lock
Normal file
27
flake.lock
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1688679045,
|
||||
"narHash": "sha256-t3xGEfYIwhaLTPU8FLtN/pLPytNeDwbLI6a7XFFBlGo=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "3c7487575d9445185249a159046cc02ff364bff8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
37
flake.nix
Normal file
37
flake.nix
Normal file
@ -0,0 +1,37 @@
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
};
|
||||
outputs = { self, nixpkgs, ... }: {
|
||||
packages.x86_64-linux = let
|
||||
pkgs = import nixpkgs { system = "x86_64-linux"; };
|
||||
in {
|
||||
update-from-hydra = pkgs.python3Packages.buildPythonPackage rec {
|
||||
pname = "update-from-hydra";
|
||||
version = "0.0.1";
|
||||
|
||||
src = ./.;
|
||||
|
||||
format = "pyproject";
|
||||
|
||||
buildInputs = [ pkgs.python3Packages.hatchling ];
|
||||
propagatedBuildInputs = [ pkgs.python3Packages.requests ];
|
||||
};
|
||||
default = self.packages.x86_64-linux.update-from-hydra;
|
||||
};
|
||||
|
||||
apps.x86_64-linux = {
|
||||
update-from-hydra = {
|
||||
type = "app";
|
||||
program = self.packages.x86_64-linux.update-from-hydra + "/bin/update-from-hydra";
|
||||
};
|
||||
default = self.apps.x86_64-linux.update-from-hydra;
|
||||
};
|
||||
|
||||
hydraJobs = {
|
||||
inherit (self)
|
||||
packages;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
23
pyproject.toml
Normal file
23
pyproject.toml
Normal file
@ -0,0 +1,23 @@
|
||||
[build-system]
|
||||
requires = ["hatchling"]
|
||||
build-backend = "hatchling.build"
|
||||
|
||||
[project]
|
||||
name = "update-from-hydra"
|
||||
version = "0.0.1"
|
||||
authors = [
|
||||
{ name="clerie", email="hallo@clerie.de" },
|
||||
]
|
||||
description = ""
|
||||
requires-python = ">=3.7"
|
||||
classifiers = [
|
||||
"Programming Language :: Python :: 3",
|
||||
"Operating System :: OS Independent",
|
||||
]
|
||||
dependencies = [
|
||||
"requests"
|
||||
]
|
||||
|
||||
|
||||
[project.scripts]
|
||||
update-from-hydra = "update_from_hydra:cli"
|
89
update_from_hydra.py
Normal file
89
update_from_hydra.py
Normal file
@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
from pathlib import Path
|
||||
import requests
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
def get_hydra_store_path(url):
|
||||
"""
|
||||
Accepts an url to a hydra build.
|
||||
Can be:
|
||||
https://hydra.clerie.de/job/nixfiles/nixfiles/iso/latest-finished
|
||||
Or:
|
||||
https://hydra.clerie.de/build/917
|
||||
"""
|
||||
|
||||
r = requests.get(url, headers={"Accept": "application/json"})
|
||||
r.raise_for_status()
|
||||
|
||||
return Path(r.json()["buildoutputs"]["out"]["path"])
|
||||
|
||||
|
||||
def cli():
|
||||
parser = argparse.ArgumentParser(
|
||||
prog="update-from-hydra",
|
||||
description="Fetch the latest build of a Hydra job and set it as a specified symlink",
|
||||
)
|
||||
parser.add_argument("hydra_url")
|
||||
parser.add_argument("update_path")
|
||||
parser.add_argument("cache_store_uri")
|
||||
args = parser.parse_args()
|
||||
hydra_url = args.hydra_url
|
||||
update_path = Path(args.update_path).absolute()
|
||||
cache_store_uri = args.cache_store_uri
|
||||
|
||||
print("Update url:", hydra_url)
|
||||
print("Path to update:", update_path)
|
||||
|
||||
current_store_path = None
|
||||
|
||||
if update_path.exists():
|
||||
if not update_path.is_symlink():
|
||||
print("Path to update is not a symlink")
|
||||
exit(1)
|
||||
|
||||
current_store_path = update_path.readlink()
|
||||
print("Current store path:", current_store_path)
|
||||
else:
|
||||
print("No current store path, update path does not exist")
|
||||
|
||||
print("Look up Hydra build metadata")
|
||||
hydra_store_path = get_hydra_store_path(hydra_url)
|
||||
print("Store path in hydra:", hydra_store_path)
|
||||
|
||||
if current_store_path == hydra_store_path:
|
||||
print("Current store path is up to date")
|
||||
exit()
|
||||
|
||||
print("Downloading new store paths")
|
||||
subprocess.run(["nix", "copy", "--from", cache_store_uri, hydra_store_path])
|
||||
print("Finished downloading")
|
||||
|
||||
print("Updating path to update")
|
||||
update_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
tmp_update_path = update_path.parent / ( update_path.name + ".new")
|
||||
print("Creating temporary symlink:", tmp_update_path)
|
||||
tmp_update_path.symlink_to(hydra_store_path)
|
||||
print("Rename symlink to:", update_path)
|
||||
tmp_update_path.rename(update_path)
|
||||
|
||||
print("Adding to gcroot")
|
||||
try:
|
||||
gcroots_dir = Path("/nix/var/nix/gcroots/update-from-hydra")
|
||||
update_dir_hash = hashlib.sha256(bytes(update_path)).hexdigest()
|
||||
gcroots_dir.mkdir(parents=True, exist_ok=True)
|
||||
gcroots_symlink = gcroots_dir / update_dir_hash
|
||||
tmp_gcroots_symlink = gcroots_dir / (update_dir_hash + ".new")
|
||||
print("Creating temporary symlink:", tmp_gcroots_symlink)
|
||||
tmp_gcroots_symlink.symlink_to(update_path)
|
||||
print("Rename symlink to:", gcroots_symlink)
|
||||
tmp_gcroots_symlink.rename(gcroots_symlink)
|
||||
except PermissionError:
|
||||
print("Unable to create garbage collector root")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
cli()
|
Loading…
Reference in New Issue
Block a user