Picking up DBD::Mock
A few months ago I started using the DBD::Mock Perl module as part of some
unit tests for a project I was working on. It was pretty simple to pick up and
use, but I found that there was a feature missing that would make it easier for
me to use. As it’s open source I was able to dig into the module’s code and
figure out how to add the new functionality. The internals of the module are
logically structured so it only took about an hour to prepare a patch, but when
I tried to submit the patches back to the source I discovered that the module
was no longer being actively maintained. This discovery triggered a chain of
events which resulted in me taking on a maintainer role for the module.
As the new maintainer, the first task I had to undertake was to get the
codebase into a repository that I controlled. This involved cloning the old
GitHub repository with git’s --bare option and then using the --mirror
option to push it up to the new GitLab repository.
Once that was done I needed to build a development environment around it, starting with migrating the build process to be consistent with my other CPAN modules (i.e. get it set up with Minilla).
Migrating the build process to using Minilla left one last step to do before
the development environment was ready, Continuous Integration (CI). In GitLab
the CI logic is controlled by the .gitlab-ci.yml file, and I didn’t need
anything complicated, so I first went with:
image: perl:latest
before_script:
- cpanm Minilla
stages:
- test
unitTests:
stage: test
script:
- minil test
Quick explanation of this .gitlab-ci.yml file:
-
Imagetells GitLab’s CI which Docker image to use (in this case the latest Perl image from Docker Hub -
before_scriptsets a series of commands to prepend to each job’sscript -
stageslist the stages in our CI pipeline (in this case just theteststage) -
unitTestsis a job with the following properties:stagethe stage this job is part of (this one’s part theteststage)scriptthe script that commands that get run to perform the job
Now I had a development environment ready, I could get started with figuring out what to tackle for my first release. Reviewing the module’s RT queue showed a number of issues that needed investigating and resolving. I decided to keep it simple for the my first release and targeted three easy issues:
-
Adding in details about the module’s Git repository
-
Fixing a spelling mistake in the POD
-
Adding in my patches
Once they were done I used Minilla to release a new version (v1.46). A few hours later and the new version was available on CPAN and could be installed in the usual way for CPAN modules.
The next day I got an email from CPAN Testers
, a group of people who test CPAN modules against different versions of Perl on
different operating systems. The new version was failing on versions of Perl
below v5.10.0. Sure enough I’d used a defined-or (//) which isn’t available
in Perl v5.8.
The first thing to do was to fix my CI pipeline to make sure that I tested
against Perl v5.8 as well as the latest version, so I wouldn’t make this
mistake again. After a bit of playing with the .gitlab-ci.yml file, it looked
like the following:
stages:
- test
before_script:
- cpanm Module::Build::Tiny Test::Pod Test::Pod::Coverage
- cpanm --installdeps .
- perl Build.PL
- perl Build
unitTestsLatest:
image: perl:latest
stage: test
script:
- perl Build test
unitTestsV5.8:
image: perl:5.8-threaded
stage: test
script:
- perl Build test
There were three key changes:
-
Removal of Minilla in the build and testing process, the
before_scriptnow consisted of 4 commands to install dependencies, optional modules, runBuild.PLand use theBuildfile produced to build the module so it’s ready for testing -
A new
unitTestsV5.8job for testing against Perl v5.8 -
The
imageproperty has moved into the jobs as each job needs to use a different Perl docker image depending on the version being tested
These changes made it a lot easier to extend the versions of Perl being tested against by simply adding a new job (hint: the latest version of DBD::Mock tests against 13 different versions of Perl).
Once the CI was testing against Perl v5.8 as well as the latest, I could actually get around to fixing the bug and preparing the next release (v1.47). As development of the module had progressed in the time up to the point that CPAN Testers reported the issue with Perl v5.8, the new release also contained the following changes:
-
Max Carey’s patch from rt86294
-
Addition of a new experimental Connection Callback feature
Over the next month, two additional release of DBD::Mock were made, which
resolved the last of the open issues in it’s RT queue. I’m now holding off on
development for a little while to give time for any bugs to be found and
reported.