The basic Jenkins agent does not have the *python3-wheel* package
installed, which is required to fetch the dependencies for this web
application. Thus, a specific environment has to be defined that
includes all of the required tools.
In some cases, the default codec used by PyYAML is not UTF-8, so loading
the song quotes database fails. Using the `codecs.open` helper function
ensures that the contents of the file are always read with the correct
character set.
Since I took down my S3 bucket and CloudFront distribution, the images
on dustin.hatch.name do not display. They are small enough and the site
has so little traffic that serving them from the main server is fine.