diff options
author | Quentin Dufour <quentin@deuxfleurs.fr> | 2021-10-04 18:27:57 +0200 |
---|---|---|
committer | Quentin Dufour <quentin@deuxfleurs.fr> | 2021-10-19 16:56:07 +0200 |
commit | dc017a0cab40cb2f33a01b420bb1b04038abb875 (patch) | |
tree | 239b6a9245b842a4daaceead93b71d8ddbeab498 /nix | |
parent | 1acf7e4c66aab0a0b5bcce8eb2965b35d587dd2a (diff) | |
download | garage-feature/static.tar.gz garage-feature/static.zip |
Build Garage with Nixfeature/static
Diffstat (limited to 'nix')
-rw-r--r-- | nix/build_index.nix | 146 | ||||
-rw-r--r-- | nix/common.nix | 27 | ||||
-rw-r--r-- | nix/kaniko.nix | 23 | ||||
-rw-r--r-- | nix/nix.conf | 7 |
4 files changed, 203 insertions, 0 deletions
diff --git a/nix/build_index.nix b/nix/build_index.nix new file mode 100644 index 00000000..5107324e --- /dev/null +++ b/nix/build_index.nix @@ -0,0 +1,146 @@ +{ + path ? "/../aws-list.txt", +}: + +with import ./common.nix; +let + pkgs = import pkgsSrc {}; + lib = pkgs.lib; + + /* Converts a key list and a value list to a set + + Example: + listToSet [ "name" "version" ] [ "latex" "3.14" ] + => { name = "latex"; version = "3.14"; } + */ + listToSet = keys: values: + builtins.listToAttrs + (lib.zipListsWith + (a: b: { name = a; value = b; }) + keys + values); + + /* Says if datetime a is more recent than datetime b + + Example: + cmpDate { date = "2021-09-10"; time = "22:12:15"; } { date = "2021-02-03"; time = "23:54:12"; } + => true + */ + cmpDate = a: b: + let da = (builtins.head a.builds).date; + db = (builtins.head b.builds).date; + in + if da == db then (builtins.head a.builds).time > (builtins.head b.builds).time + else da > db; + + /* Pretty platforms */ + prettyPlatform = name: + if name == "aarch64-unknown-linux-musl" then "linux/arm64" + else if name == "armv6l-unknown-linux-musleabihf" then "linux/arm" + else if name == "x86_64-unknown-linux-musl" then "linux/amd64" + else if name == "i686-unknown-linux-musl" then "linux/386" + else name; + + /* Parsing */ + list = builtins.readFile (./. + path); + entries = lib.splitString "\n" list; + + elems = builtins.filter + (e: (builtins.length e) == 4) + (map + (x: builtins.filter (e: e != "") (lib.splitString " " x)) + entries); + + keys = ["date" "time" "size" "path"]; + parsed = map (entry: listToSet keys entry) elems; + + subkeys = ["root" "version" "platform" "binary" ]; + builds = map (entry: entry // listToSet subkeys (lib.splitString "/" entry.path)) parsed; + + /* Aggregation */ + builds_per_version = lib.foldl (acc: v: acc // { ${v.version} = if builtins.hasAttr v.version acc then acc.${v.version} ++ [ v ] else [ v ]; }) {} builds; + + versions = builtins.attrNames builds_per_version; + versions_release = builtins.filter (x: builtins.match "v[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?" x != null) versions; + versions_commit = builtins.filter (x: builtins.match "[0-9a-f]{40}" x != null) versions; + versions_extra = lib.subtractLists (versions_release ++ versions_commit) versions; + + sorted_builds = [ + { + name = "Release"; + hide = false; + type = "tag"; + description = "Release builds are the official builds, they are tailored for productions and are the most tested."; + builds = builtins.sort (a: b: a.version > b.version) (map (x: { version = x; builds = builtins.getAttr x builds_per_version; }) versions_release); + } + { + name = "Extra"; + hide = true; + type = "tag"; + description = "Extra builds are built on demand to test a specific feature or a specific need."; + builds = builtins.sort cmpDate (map (x: { version = x; builds = builtins.getAttr x builds_per_version; }) versions_extra); + } + { + name = "Development"; + hide = true; + type = "commit"; + description = "Development builds are built periodically. Use them if you want to test a specific feature that is not yet released."; + builds = builtins.sort cmpDate (map (x: { version = x; builds = builtins.getAttr x builds_per_version; }) versions_commit); + } + ]; + +in + pkgs.writeText "index.html" '' +<!doctype html> +<html> + <head> + <meta charset="utf-8" /> + <title>Garage releases</title> + <style> + html, body { margin:0; padding: 0 } + body { font-family: 'Helvetica', Sans; } + section { margin: 1rem; } + ul { padding:0; margin: 0.2rem } + li { + border-radius: 0.2rem; + display: inline; + border: 2px #0b5d83 solid; + padding: 0.5rem; + line-height: 3rem; + color: #0b5d83; + } + li:hover { background-color: #0b5d83; color: #fff; } + li a, li a:hover { color: inherit; text-decoration: none } + </style> + </head> + <body> + ${ builtins.toString (lib.forEach sorted_builds (r: '' + <section> + <h2>${r.name} builds</h2> + + <p>${r.description}</p> + + ${if r.hide then "<details><summary>Show ${r.name} builds</summary>" else ""} + ${ builtins.toString (lib.forEach r.builds (x: '' + <h3> ${x.version} (${(builtins.head x.builds).date}) </h3> + <p>See this build on</p> + <p> Binaries: + <ul> + ${ builtins.toString (lib.forEach x.builds (b: '' + <li><a href="/${b.path}">${prettyPlatform b.platform}</a></li> + ''))} + </ul></p> + <p> Sources: + <ul> + <li><a href="https://git.deuxfleurs.fr/Deuxfleurs/garage/src/${r.type}/${x.version}">gitea</a></li> + <li><a href="https://git.deuxfleurs.fr/Deuxfleurs/garage/archive/${x.version}.zip">.zip</a></li> + <li><a href="https://git.deuxfleurs.fr/Deuxfleurs/garage/archive/${x.version}.tar.gz">.tar.gz</a></li> + </ul></p> + '')) } + ${ if builtins.length r.builds == 0 then "<em>There is no build for this category</em>" else "" } + ${if r.hide then "</details>" else ""} + </section> + ''))} + </body> +</html> +'' diff --git a/nix/common.nix b/nix/common.nix new file mode 100644 index 00000000..aee38bd8 --- /dev/null +++ b/nix/common.nix @@ -0,0 +1,27 @@ +rec { + /* + * Fixed dependencies + */ + pkgsSrc = fetchTarball { + # As of 2021-10-04 + url ="https://github.com/NixOS/nixpkgs/archive/b27d18a412b071f5d7991d1648cfe78ee7afe68a.tar.gz"; + sha256 = "1xy9zpypqfxs5gcq5dcla4bfkhxmh5nzn9dyqkr03lqycm9wg5cr"; + }; + cargo2nixSrc = fetchGit { + # As of 2021-10-06 + url = "https://github.com/superboum/cargo2nix"; + rev = "1364752cd784764db2ef5b1e1248727cebfae2ce"; + }; + rustOverlaySrc = fetchGit { + # As of 2021-10-05 + url = "https://github.com/oxalica/rust-overlay"; + rev = "9c2fc6a62ccbc6f420d71ecac6bf0b84dbbee64f"; + }; + + /* + * Shared objects + */ + rustOverlay = import rustOverlaySrc; + cargo2nix = import cargo2nixSrc; + cargo2nixOverlay = import "${cargo2nixSrc}/overlay"; +} diff --git a/nix/kaniko.nix b/nix/kaniko.nix new file mode 100644 index 00000000..140328b8 --- /dev/null +++ b/nix/kaniko.nix @@ -0,0 +1,23 @@ +pkgs: +pkgs.buildGoModule rec { + pname = "kaniko"; + version = "1.6.0"; + + src = pkgs.fetchFromGitHub { + owner = "GoogleContainerTools"; + repo = "kaniko"; + rev = "v${version}"; + sha256 = "1fnclr556avxay6pvgw5ya3xbxfnf2gv4njq2hr4fd6fcjyslq5h"; + }; + + vendorSha256 = null; + + checkPhase = "true"; + + meta = with pkgs.lib; { + description = "kaniko is a tool to build container images from a Dockerfile, inside a container or Kubernetes cluster."; + homepage = "https://github.com/GoogleContainerTools/kaniko"; + license = licenses.asl20; + platforms = platforms.linux; + }; +} diff --git a/nix/nix.conf b/nix/nix.conf new file mode 100644 index 00000000..8764eb3e --- /dev/null +++ b/nix/nix.conf @@ -0,0 +1,7 @@ +substituters = https://cache.nixos.org https://nix.web.deuxfleurs.fr +trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= nix.web.deuxfleurs.fr:eTGL6kvaQn6cDR/F9lDYUIP9nCVR/kkshYfLDJf1yKs= +max-jobs = auto +cores = 4 + +# required for containers +sandbox = false |