It’s easy to test Perl modules in various scenarios via GitHub Actions!
See below …
linux:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
perl-version:
- '5.36'
- '5.34'
- '5.32'
- '5.30'
- '5.28'
- '5.26'
- '5.24'
- '5.22'
- '5.20'
- '5.18'
- '5.16'
- '5.14'
- '5.12'
- '5.10'
container:
image: perldocker/perl-tester:${{ matrix.perl-version }}
steps:
- uses: actions/checkout@main
with:
submodules: recursive
- run: perl -V
- run: cpanm --notest --installdeps --verbose .
- run: perl Makefile.PL
- run: make
- run: prove -wlvmb t
Assuming your module only depends on CPAN modules, the above will test it against all standard perls from 5.10 to 5.36.
At some point early in your steps
, add apt install -y ...
, where ...
is your list of apt packages to install.
Coverage Testing via Coveralls
Under matrix
, include this:
include:
- perl-version: '5.32' # or whichever version you want to scope this to
os: ubuntu-latest
coverage: true
… then, instead of the prove
line in the original steps
, do:
- name: Run Tests (no coverage)
if: ${{ !matrix.coverage }}
run: make test
- name: Run tests (with coverage)
if: ${{ matrix.coverage }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cpanm -n Devel::Cover::Report::Coveralls
cover -test -report Coveralls
Then, ensure that Coveralls is set up to receive coverage reports from your repository.
Even easier than Linux:
macOS:
runs-on: macOS-latest
… then the same steps
as above.
brew install ...
where on Linux you did apt
.
As easy as macOS:
windows:
runs-on: windows-latest
Use Chocolatey; however, I’ve not gotten this to work for, e.g., linking XS modules against other C libraries.
The magic of QEMU makes this possible …
big-endian:
runs-on: ubuntu-latest
steps:
- name: Get the qemu container
run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- name: Run tests on s390x/ubuntu
run: docker run --rm --interactive s390x/ubuntu bash -c "apt update; apt install -y git cpanminus make; git clone --recurse-submodules $GITHUB_SERVER_URL/$GITHUB_REPOSITORY; cd $( echo $GITHUB_REPOSITORY | cut -d/ -f2 ); cpanm --notest --installdeps --verbose .; perl Makefile.PL; make; prove -wlvmb t"
Just tweak the big-endian example above to say arm32v7
rather than s390x
.
Linux, musl libc
Sometimes it’s useful to test against “alternative” libc implementations. Alpine Linux has you covered:
musl:
runs-on: ubuntu-latest
container:
image: alpine
steps:
- run: apk add perl-app-cpanminus
# ...
Via unofficial builds courtesy of simcop2387:
linux-alt-perl:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
perl-version:
- '5.020.003-main-longdouble-buster'
- '5.020.003-main-quadmath-buster'
container:
image: simcop2387/perl-tester:${{ matrix.perl-version }}
steps:
… with the same steps
you usually do.
Check simcop2387’s perl containers for possible values of perl-version
.
cygwin:
runs-on: windows-latest
steps:
- name: Set up Cygwin
uses: cygwin/cygwin-install-action@master
with:
packages: perl_base perl-ExtUtils-MakeMaker make gcc-g++ libcrypt-devel libnsl-devel bash
- uses: actions/checkout@main
with:
submodules: recursive
- shell: C:\cygwin\bin\bash.exe --login --norc -eo pipefail -o igncr '{0}'
run: |
perl -V
cpan -T App::cpanminus
cd $GITHUB_WORKSPACE
cpanm --verbose --notest --installdeps --with-configure --with-develop .
perl Makefile.PL
make test
Note the with
.packages
; see Cygwin’s package repository for names of available packages. (Unlike plain Windows, this does work seamlessly to text XS modules’ integrations with external C libraries.)
BSDs:
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
os:
- name: freebsd
version: '13.0'
pkginstall: pkg install -y p5-ExtUtils-MakeMaker
- name: openbsd
version: '7.1'
pkginstall: pkg_add p5-ExtUtils-MakeMaker
steps:
- uses: actions/checkout@main
with:
submodules: recursive
- name: Test on ${{ matrix.os.name }}
uses: cross-platform-actions/action@master
with:
operating_system: ${{ matrix.os.name }}
version: ${{ matrix.os.version }}
shell: bash
run: |
sudo ${{ matrix.os.pkginstall }}
curl -L https://cpanmin.us | sudo perl - --verbose --notest --installdeps --with-configure --with-develop .
perl Makefile.PL
make
prove -wlvmb t
Note the pkginstall
option to install any external dependencies; it may not be needed for your case.
Also, FreeBSD does have a p5-App-cpanminus
port, but OpenBSD has no such port.