I've been working on a project that is investigating using Spack
(
https://spack.io/) to deploy a common development environment across HPC centers. Like
many other ports collections, Spack began as a build system but has developed its own
packaging format, referred to as build caches. I've made a prototype pass at using
koji plugins to generate these build caches, which has worked well enough to demonstrate
that we can share the infrastructure and build functional caches, but has of course
spawned some questions.
1) Looking at the Content Generator docs, the model workflow only use Koji as a convenient
repository for artifacts and metadata built entirely outside of Koji. Is this API still
the right one to use if the builds are being done via a builder plug-in? Should I then
call CGImport() from the build task and use a post-import hub callback for hub-side
finalization, or does it make more sense to add a completion call on the hub, much like
it's done for existing builds?
2) Content Generators seem to still require an RPM-style NVR uniqifier. Spack relies only
on package names and a cryptographic hash of the sources, dependencies, and build options
-- somewhat akin to Nix. My plan is to use the hash as the package version, and the
release as a serial number, in case the same package hash needs to be rebuilt. This seems
like it should work, but I'm a bit worried that it's non-standard. How closely
are Content Generators expected to follow RPM NVR conventions, such as small string
lengths, and monotonically-increasing versions?
3) There are a number of classes/functions that currently live in kojid or kojihub.py,
which seem like they're broadly useful to plugins. In particular, I would like to
lean on the BuildRoot and BaseBuildTask classes from kojid, and the Host and Task classes
and get_tag(), get_user(), get_build_target(), and make_task() functions from kojihub.py.
Would it make sense to move these into the koji library?
4) Has any thought been given to how the web interface could be made more extensible?
While it mostly works with plugin-provided task types, things aren't perfect. For
instance, they do not show up in the "Method" filter, and there is no
"Watch task" support.
Thanks,
Jim