I don’t have much direct experience, but we tend to rely on Chef a lot. It helps have consistent builds.
We used to have a local vagrant build a while back for testing, but we ended up ditching it because of the added complexity. Now we just use a standard local HTTP server that calls out to deployed staging/production services. Any differences there might be between local (dev) and production (prod) ultimately get caught in the path to production (dev -> ci automation -> qa -> prod).