Archiving CPAN logs in GitHub Actions
Tags: cpan, perl, githubactions, logs
Published: 2021-01-04 14:49:51

---
title: Archiving CPAN logs in GitHub Actions
published: true
description: For those times when you need to work out why your CPAN modules haven't installed successfully.
tags: cpan, perl, githubactions, logs
cover_image: https://dev-to-uploads.s3.amazonaws.com/i/10vcgms2fqsvmo6pl5bi.jpg
---

As more and more people have started to use [GitHub Actions](https://github.com/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](https://cpandashboard.com/DAVECROSS/).