Since the article published by Neil Bowers on using Travis CI for CPAN distributions I fell in love with the service. It provides early feedback when I break something, and makes me pay more attention to the changes I make. I just wish they had more platforms available.

Anyway, one of my applications uses Geo::IP. I keep having problems installing it on my own machines and when I turned Travis-CI on for this particular distribution everything broke.

Luckily, after 2 hours of fighting I think I managed to establish the correct procedure.

In case you don't know what Travis-CI is, the CI stands for Continuous Integration. Once you configured the GitHub repository of your project, every time you push some changes to GitHub, Travis-CI will pick up the new commit, run whatever compilation and testing you configured and send you an e-mail if something broke.

It is awesome and it is free for Open Source projects.

Installing Geo::IP on Linux

Let's start installing Geo::IP. While my module declares Geo::IP as a prerequisite, cpanm, cannot install it. The Perl module itself has two non-perl prerequisites. One is C version of the GeoIP API, the other is the database holding the mapping used by GeoIP.

In order to install the C version of the API I had to visit GeoIP Legacy Downloadable Databases where under MaxMind-Supported APIs I found a link to the Source on GitHub of the C version. There I found the latest release, which was 1.6.2 at the time of this writing. It has a big green button saying "GeoIP-1.6.2.tar.gz". Instead of left-clicking on the button, I copied the link to use with wget.

Then my steps to install the C API were as follows:

$ wget https://github.com/maxmind/geoip-api-c/releases/download/v1.6.2/GeoIP-1.6.2.tar.gz
$ tar xzf GeoIP-1.6.2.tar.gz
$ cd GeoIP-1.6.2
$ ./configure --prefix /opt/geoip-1.6.2
$ make
$ make check
$ sudo make install

(Note, the make check step used to have some errors, but in 1.6.2 all the tests passed.)

Obviously one does not need to install it on /opt which is owned by root. The library could have been installed in ~/geoip/ as well, and then I would not need to use sudo in the last step.

Install GeoIP database

The next step is to fetch a copy of the GeoIP database required to install the Geo::IP Perl module.

The same page we visited earlier GeoIP Legacy Downloadable Databases also had a link to GeoIP Legacy Country that showed the URL where the database can be found. The steps I had to do are the following:

$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
$ gunzip GeoIP.dat.gz
$ sudo mkdir -p /opt/geoip-1.6.2/share/GeoIP/
$ sudo mv GeoIP.dat /opt/geoip-1.6.2/share/GeoIP/GeoIP.dat

Of coure, here I already assume the location of the GeoIP C library I've installed in the previous step. Here too, I only need to use sudo because I decided to install the C library in /opt.

The 3rd step is that I need to install the Geo::IP module manually. I still cannot rely on the default behavior or cpan-minus as I need to pass the (non-standard) location of the GeoIP C library to the Makefile.PL. I visited Geo::IP on MetaCPAN where I saw the latest version was 1.43. I also saw the Download linke. Again, instead of left-clicking it, I copied the URL to be used with wget.

These are the step I have to execute at the console:

$ wget https://cpan.metacpan.org/authors/id/B/BO/BORISZ/Geo-IP-1.43.tar.gz
$ tar xzf Geo-IP-1.43.tar.gz
$ cd Geo-IP-1.43
$ perl Makefile.PL LIBS='-L/opt/geoip-1.6.2/lib' INC='-I/opt/geoip-1.6.2/include'
$ make
$ make test
$ make install

This will test and install the Geo::IP Perl module.

Travis-CI configuration file

Once I know the correct steps I had to execute on the console, I could put together the Travis-CI configuration file. In the before_install section I simple had to list the same steps one-by-one.

branches:
  except:
    - gh-pages
language: perl
perl:
  - "5.20"
  - "5.18"
  - "5.16"
  - "5.14"
  - "5.12"
  - "5.10"
before_install:
  # get the C part of the GeoIP API
  - wget https://github.com/maxmind/geoip-api-c/releases/download/v1.6.2/GeoIP-1.6.2.tar.gz
  - tar xzf GeoIP-1.6.2.tar.gz
  - cd GeoIP-1.6.2
  - ./configure --prefix /opt/geoip-1.6.2
  - make
  - make check  #     (Used to have some errors, but not in 1.6.2)
  - sudo make install

  # get the GeoIP database needed for the tests
  - wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
  - gunzip GeoIP.dat.gz
  - sudo mkdir -p /opt/geoip-1.6.2/share/GeoIP/
  - sudo mv GeoIP.dat /opt/geoip-1.6.2/share/GeoIP/GeoIP.dat

  # install Geo::IP manually
  - wget https://cpan.metacpan.org/authors/id/B/BO/BORISZ/Geo-IP-1.43.tar.gz
  - tar xzf Geo-IP-1.43.tar.gz
  - cd Geo-IP-1.43
  - perl Makefile.PL LIBS='-L/opt/geoip-1.6.2/lib' INC='-I/opt/geoip-1.6.2/include'
  - make
  - make test