Overhaul CI pipeline to use a custom Ubuntu-based Docker image.
The first step of this CI pipeline builds a custom Docker image (based on Ubuntu Focal) and pushes it to this repo's container registry. If the image already exists, it's used as a cache to speed the build. Subsequent CI steps then use this custom image to run the jobs.