DEV Community

Cover image for Archiving CPAN logs in GitHub Actions
Dave Cross
Dave Cross

Posted on

4 1

Archiving CPAN logs in GitHub Actions

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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.

Do your career a big favor. Join DEV. (The website you're on right now)

It takes one minute, it's free, and is worth it for your career.

Get started

Community matters

Top comments (2)

Collapse
 
thibaultduponchelle profile image
Tib • Edited

Your solution is elegant and I learnt something, thank you 👍

There is also another (elegant) solution, the --show-build-log-on-failure option of cpm handles this use case :

cpm install Your:Module --show-build-log-on-failure
Enter fullscreen mode Exit fullscreen mode

Along with speed, this is one of the two killer features of cpm for me !

Collapse
 
szabgab profile image
Gabor Szabo

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

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Dive into an ocean of knowledge with this thought-provoking post, revered deeply within the supportive DEV Community. Developers of all levels are welcome to join and enhance our collective intelligence.

Saying a simple "thank you" can brighten someone's day. Share your gratitude in the comments below!

On DEV, sharing ideas eases our path and fortifies our community connections. Found this helpful? Sending a quick thanks to the author can be profoundly valued.

Okay