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:
-
Image
tells GitLab’s CI which Docker image to use (in this case the latest Perl image from Docker Hub -
before_script
sets a series of commands to prepend to each job’sscript
-
stages
list the stages in our CI pipeline (in this case just thetest
stage) -
unitTests
is a job with the following properties:stage
the stage this job is part of (this one’s part thetest
stage)script
the 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_script
now consisted of 4 commands to install dependencies, optional modules, runBuild.PL
and use theBuild
file produced to build the module so it’s ready for testing -
A new
unitTestsV5.8
job for testing against Perl v5.8 -
The
image
property 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.