As more and more people have started to use GitHub Actions to test their CPAN modules, a pretty standard version of a basic configuration file has emerged. It looks something like this:
name: CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
workflow_dispatch:
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: ['ubuntu-latest', 'macos-latest', 'windows-
latest']
perl: [ 'latest' ]
name: Perl ${{ matrix.perl }} on ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- name: Set up perl
uses: shogo82148/actions-setup-perl@v1
with:
perl-version: ${{ matrix.perl }}
- name: Perl version
run: perl -V
- name: Install modules
run: cpanm --installdeps .
- name: Run tests
run: prove -lv t
I've been slowly adding something similar to this to all of the GitHub repos that contain my CPAN modules. And it mostly works pretty well. There are just a few problems that I'm ironing out.
One of them is a problem where some of the required CPAN modules don't install cleanly, so the run is aborted. But I think I've found a tool that is going to help me fix this problem.
You'll see that I use cpanm
to install the modules that are required to run the tests. And cpanm
writes a detailed log of what it is doing which is invaluable when something goes wrong - as you can get the error messages from the log file. Unfortunately, this doesn't work well in a CI environment like GitHub Actions. All I see in the log of the run is something like this:
Building and testing Inline-C-0.81 ... FAIL
! Installing Inline::C failed. See /home/runner/.cpanm/work/1609767557.4781/build.log for details.
Retry with --force to force install it.
! Installing the dependencies failed: Module 'Inline::C' is not installed
That build.log
file is the one we need to see. But it's on the container that has been used to run your tests, and by the time you're looking at that error, the container has vanished into the ether taking your build log with it.
But we can stop it being removed. GitHub Actions has a feature called "artifacts" where you can store items that are created in a job run so that you can examine them in more detail later on. We can use that to archive our build logs.
I've started adding this step to my GitHub Action config files:
- name: Archive CPAN logs
if: ${{ failure() }}
uses: actions/upload-artifact@v2
with:
name: cpan_log
path: .cpanm/work/*/build.log
This adds another step into my process. It only runs if another step fails in some way. It uses the standard action actions/upload-artifact@v2
to archive my build logs. Now, when something goes wrong in my tests the job page will have a link labelled "cpan_log" which I can click on to download a copy of the cpanm
build log which I can then examine at my leisure to work out what the problem is.
Now I just need to add this to all of my existing CI workflows so that I can start to fix some of the issues I can see on my CPAN Dashboard.
Top comments (2)
Your solution is elegant and I learnt something, thank you 👍
There is also another (elegant) solution, the
--show-build-log-on-failure
option ofcpm
handles this use case :Along with speed, this is one of the two killer features of
cpm
for me !Nice. I am not sure if it is important, but you might also want to set the retention policy to something short so these log will be removed after a short period of time.
retention-days: 5