linuxbuilddebianrpmisolation

Build environment isolation and file system diffing


Alright so after trying to chase down the dependencies for various pieces of software for the n-th time and replicating work that various people do for all the different linux distributions I would like to know if there is a better way of bundling various pieces of software into one .rpm or .deb file for easier distribution.

My current set up for doing this is a frankenstein monster of various tools but mainly Vagrant and libguestfs (built from source running in Fedora because none of the distributions actually ship it with virt-diff). Here are the steps I currently follow:

  1. Spin up a base OS using either a Vagrant box or by create one from live CDs.
  2. Export the .vmdk and call it base-image.
  3. Spin up an exact replica of the previous image and go to town: use the package manager, or some other means, to download, compile, and install all the pieces that I need. Once again, export the .vmdk and call it non-base-image.
  4. Make both base images available to the Fedora guest OS that has libguestfs.
  5. Use virt-diff to diff the two images and dump that data to file called diff.
  6. Run several ruby scripts to massage diff into another format that contains the information I need and none of the stuff I don't like things in /var.
  7. Run another script to generate a command script for guestfish with a bunch of copy-out commands.
  8. Run the guestfish script.
  9. Run another script to regenerate the symlinks from diff because guestfish can't do it.
  10. Turn the resulting folder structure into a .deb or .rpm file and ship it.

I would like to know if there is a better way to do this. You'd think there would be but I haven't figured it out.


Solution

  • I would definitely consider something along the lines of:

    A)

    or B)

    first two steps as above, then pack the rpms into an archive build a package that contains all of the above and kicks off the actual install of the rpms (along the lines of rpm -Uvh /tmp/repo/*) as a late script (in the cleanup phase, maybe). Dunno if this can be done avoiding locks on the rpm database.