1
1
mirror of https://github.com/NixOS/mobile-nixos.git synced 2024-12-12 15:24:14 +03:00
mobile-nixos/bin/hydra-eval
Samuel Dionne-Riel dfd39a16cb bin/hydra-eval: Add hydra-like eval helper
This helper is intended to be used by contributors that are changing
parts of this project that are either touching `lib/` and the evaluation
helpers, or changing `release.nix`.

There are no facilities to *compare* evals, yet. But this can be done by
the contributor, they can go to any commit they want to compare to, run
the eval and save the output markdown report. Then they can compare
against their new markdown report.

Finally, splitting the eval errors like we do in the reports should make
it really obvious what errors happened during the eval.
2021-02-24 18:19:10 -05:00

113 lines
2.0 KiB
Ruby
Executable File

#!/usr/bin/env nix-shell
#!nix-shell -p ruby -i ruby
#!nix-shell -p hydra-unstable
# This script uses hydra's `hydra-eval-jobs` to evaluate a given expression,
# defaulting to `release.nix`.
require "open3"
require "json"
require "shellwords"
module MD
extend self
def _title(s, level)
"\n#{"#" * level} #{s}\n\n"
end
def title(s)
"\n#{s}\n#{s.gsub(/./, "=")}\n\n"
end
def section(s)
"\n#{s}\n#{s.gsub(/./, "-")}\n\n"
end
def list_item(s)
" * #{s}"
end
def code(s)
"`#{s}`"
end
def pre(s)
"```\n#{s}\n```"
end
def paragraph(s)
"#{s.strip}\n\n"
end
def subtitle(s)
_title(s, 3)
end
end
def usage(io=$stdout)
io.puts "Usage: bin/hydra-eval [args...]"
io.puts ""
io.puts "Arguments are passed-through to `hydra-eval-jobs`."
io.puts ""
io.puts "You are likely to want to use:"
io.puts ""
io.puts %q{ $ bin/hydra-eval release.nix --arg systems '[ "x86_64-linux" "aarch64-linux" ]' > out.md}
io.puts ""
end
# No arguments, or `--help`?
if ARGV.length == 0 || ARGV.grep(/^--help/).length > 0
usage()
exit 0
end
# We're only keeping `NIX_PATH` from the env.
env = ENV.filter do |k, v|
[
"NIX_PATH",
].include?(k)
end
args = []
# Allow access to files in CWD
args << "-I"
args << "./"
# Run the eval
out, ret = Open3.capture2(env, "hydra-eval-jobs", *args, *ARGV)
# Read the output JSON
hydra_eval = JSON.parse(out)
errors, valid_jobs = hydra_eval.partition do |k, v|
v.has_key?("error")
end.map(&:to_h)
out = $stdout
out.puts MD.title "Hydra-like evaluation"
out.puts MD.paragraph "Command used to generate this report:"
out.puts MD.pre " $ " + (["bin/hydra-eval"] + ARGV).shelljoin()
out.puts MD.section "#{valid_jobs.length} valid jobs"
valid_jobs.each do |attrname, job|
out.puts MD.list_item(
MD.code(attrname) +
"" +
MD.code(job["drvPath"])
)
end
out.puts MD.section "#{errors.length} errors"
errors.each do |attrname, obj|
out.puts MD.subtitle(MD.code(attrname))
out.puts MD.pre(obj["error"])
end
# vim: ft=ruby