Caching and the travis-perl Helpers

The travis-perl helpers are great. If you haven’t heard about them before, what they do is let you test your Perl projects on Travis with a much wider range of Perls than Travis provides natively. They also run your tests from the perspective of end users. What that means is that if you’re using Dist::Zilla or another module builder tool, the helpers will build a distribution tarball, then unpack that and test it. This is a great way of ensuring that your dzil configuration does what you think it does and that it produces something usable when uploaded to CPAN.

However, one of the big downsides of the helpers is that they make your Travis runs quite a bit slower. It’d be nice to speed these up. Fortunately, Travis has a nice caching system that lets you cache part of the filesystem from a build to re-use later.

For Perl projects, one of the best things to cache is the tree of installed modules. If your distribution has a lot of dependencies, not re-installing these each time can be a big win.

But in the past, this wasn’t a good idea when using travis-perl. The reason is that it always ran cpanm with the --skip-satisfied argument. This options tells cpanm that it should not upgrade modules that are already installed unless a newer version is explicitly asked for. When you combine this with caching, it means that your cached libraries will get more and more out of date as time goes on. When caching is enabled we want to run cpanm without the --skip-satisfied argument.

Fortunately, the helpers now do just that if you pass --always-upgrade-modules to the init script like this:

  - eval $(curl --auto --always-upgrade-modules

If you’re not using the init --auto form of the helpers, you can pass --update-prereqs to each cpan-install call instead.

In my testing of one project, this shaved about a minute off each job’s run for each version of Perl when the cache is populated. I think this could be greatly improved by also caching the modules that are installed to build the distro (at least for dzil-based distributions). That’s a little trickier, since from my delving into the helpers, there are installed in a random temp dir. Making that cacheable presumably means not using a temp dir and instead putting the modules into a predictable location. That could probably save another 30-60 seconds for dzil distros. It won’t make much (if any) difference for distros using ExtUtils::MakeMaker or Module::Build, however.

If you have any issues with this feature, please report an issue in the travis-perl helpers project. Tag me in the issue text with @autarch and I’ll try to take a look and see if I can help.