GitHub Actions で Perl を動かすときのテンプレート

この記事は Perl Advent Calendar 2020 の14日目のものです。

最近、久しぶりに Perl のリポジトリをメンテする中で Travis CI から GitHub Actions に載せ替えたので、そのときに整理した Perl で GitHub Actions を使うときのテンプレを紹介します。 それだけだと量が微妙な気がしたため Actions の一部を切り出してみた話も書きます。

テンプレート

Carton を使用する場合のテンプレです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
name: test

on:
push:
branches: [master]
pull_request:
branches: [master]

jobs:
test:
name: Run Test with Perl ${{ matrix.perl }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
perl:
- '5.30'
- '5.32'
steps:
- uses: actions/checkout@v2
- name: Setup perl
uses: shogo82148/actions-setup-perl@v1
with:
perl-version: ${{ matrix.perl }}
- name: Cache local files
uses: actions/cache@v2
with:
path: ./local
key: ${{ runner.os }}-perl-${{ matrix.perl }}-${{ hashFiles('./cpanfile.snapshot') }}
- name: Coveralls
uses: mihyaeru21/actions-report-coveralls-perl@v1
with:
flag-name: perl-${{ matrix.perl }}
- run: carton install
- name: Run tests
env:
HARNESS_PERL_SWITCHES: '-MDevel::Cover=+ignore,^local/|^t/'
run: carton exec -- prove -lrv t

やっていることを箇条書すると以下のような感じです。

  • 複数のバージョンの Perl で実行する
    • fail-fast が true だと1つのバージョンで失敗したときに CI 全体が止まる
    • 独立して動かしたかったからこれは false にする
  • 依存モジュールをキャッシュする
    • 依存モジュールは OS x Perl バージョン x snapshot をキーにして独立させる
  • Coveralls にカバレッジを投げる

Actions に切り出す

もともとは、カバレッジに関するモジュールである Devel::Cover::Report::CoverallsDevel::Cover を cpanfile の on 'test' として追加していましたが、あらためて考えたらこれらは CI でしか使わないものだったので開発環境に入れる必要はありませんでした。 GitHub Actions の共通のやつを何か作ってみたかったので、インストールしたりカバレッジを送信する部分を切り出すという小粒なネタはちょうどよかったです。

作ったのは https://github.com/mihyaeru21/actions-report-coveralls-perl です。 こいつは以下のことをします。

  • uses を書いたステップで Devel::Cover::Report::Coveralls をインストールする
  • 通常のステップがすべて終了した後のタイミングでカバレッジデータを送信する

ぶっちゃけ CI 設定の yaml が数行短くなって、カバレッジに関する依存を明示しなくてよくなるだけなので自己満足感は否めないです😇

やり残し

インストールする部分を毎回実行するのが無駄なのでいい感じに cache できればなーと考えています。

最後に

切り出すやつを作る上では Perl というより TypeScript を書くことになりました。 Perl については CI というか Actions でどこまで面倒を見るのか調べる過程で prove が標準モジュールなのをいまさらながら知りました。 そして自分が Perl から離れている間に Test2 という新しいテストのフレームワークが出てきていることを知り、 Perl の進化がまだまだ止まっていないことを実感しました。