Speedup Travis CI for PHP apps

At GRRR we use Travis as Continues Integration tool. Running unit tests, deploying and notifying are the three main tasks. To have a smooth workflow, speed is vital.


We already published a post about auto-deploying at GRRR. The last couple of months I improved the readability and speed of our Travis builds and deploys. Some optimizations are PHP specific, but others could be used for other stacks.

Xdebug

By default Travis enables Xdebug. It's useful to have when you want to generate code coverage reports. We don't use it, so let's disable it.

before_script:
  - phpenv config-rm xdebug.ini

Enable caching for Composer and Yarn

Downloading packages takes a lot of time so caching them improves build time a lot. Don't cache vendor/, because that can cause wrong package versions when dependencies change but the version constraints still match.

cache:
    yarn: true
    directories:
      - $HOME/.composer/cache/files  

Slow database migrations

Every build migrations must prepare the database. Most migrations are very fast – the database is empty and creating a table won't blow up your database server. But as the application ages the amount of migrations increases. 100 very fast migrations end up taking quite some time. Beside that, running those migrations again and again is useless so let's dump the database and import it.

Dump a database in the state of one month ago. You can choose your own time frame of course.

./migrate --until 1-month-ago # Or when your tool doesn't support it:
git checkout 'master@{2019-01-01}' # Go back in Git time and migrate your database

mysqldump -r database-until-1-month-ago.sql your-database

git add database-until-1-month-ago.sql
git commit -m "Add db dump to bypass migrations" 

We add these commands to the project Makefile. To make the date dynamic you can use date.
MacOS date -v-1m +%Y-%m-%d Linux date --date="-1 month" +%Y-%m-%d

Import the database dump before the migrations are executed. The migration up ‘til now needs to run.

before_script
  - mysql -e "source database-until-1-month-ago.sql" travis-database 
  - ./migrate

Auto Cancellation

Last, but not least. Enable Travis Auto Cancellation. It cancels builds for your branch or pull request that are waiting to run. When you and your colleagues merge multiple PRs at the same time a lot of builds for master are added to the queue. This feature allows you to only run builds for the latest commit, by removing waiting builds from the queue.