Shogo's Blog

Sep 18, 2019 - 2 minute read - perl github

Setup Perl GitHub Action を公開しました

GitHub Actions の公式レポジトリには Perl のセットアップアクションが無いぞ! ということで三連休+αで書きました。

使い方

Marketplaceの設定例は間違えているので以下を参照。(これ書いていて気がついた) 必要な Perl のバージョンを渡すだけです。簡単!

steps:
- uses: actions/checkout@master
- uses: shogo82148/actions-setup-perl@v1
  with:
    perl-version: '5.30'
- run: cpanm --installdeps .
- run: prove -lv t

Ubuntu, macOS, Windows 各種OSにも対応しています。

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: ['ubuntu-18.04', 'macOS-10.14', 'windows-2019']
        perl: [ '5.30', '5.28' ]
    name: Perl ${{ matrix.perl }} on ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v1
      - name: Setup perl
        uses: shogo82148/actions-setup-perl@v1
        with:
          perl-version: ${{ matrix.perl }}
      - run: perl -V
      - run: cpanm --installdeps .
      - run: prove -lv t

動作サンプル

ok macopy をこんな形で使うことになろうとは、あの当時は思っていなかった・・・

裏方の話

Actionでインストールされるperlについて

GitHub Actions の Runner にはキャッシュ領域が用意されていて、こういうバイナリはそこに入れるのがお作法のようです。 perlは付属するCPANモジュールのパスがバイナリに組み込まれているので、パスを変更したい場合は再ビルドが必要です。

そういうわけで、perl 5.8.5 から perl 5.30.0 までの全てのバージョンを再ビルドしました。 もちろん GitHub Actions で!

ビルド中の様子

調子に乗ってパッチレベルも全部そろえたので、perl46バージョン × OS 3platform + テスト2種 × OS 5platform = 158ジョブです。 (↑のスクショは perl 5.8.0 から perl 5.30.0 ビルド時のもの。後述するようにちょっとサポートバージョンを減らしたので、最終的なジョブ数は111です)

ビルドしたバイナリはS3にあげています。 なぜかmacOSにはawscliが入っていなかったので、S3からファイルを落とすだけのツールを作った で作成した s3cli-mini を使っています。 まさかこんな形で再び使うことになるとは。

perlのバージョン

CIに使うんだから、cpanmCarton くらい入れておくか、 というわけでsetup直後から cpanm コマンドと Carton コマンドが使えます。 Cartonのサポートが perl 5.8.5 からだったので、UbuntuとmacOSは perl 5.8.5 からのサポートです。

Windowsに関しては、 perl 5.24.0 からのサポートです。 GitHub Actions で提供されている Windows には Strawberry Perl がプリインストールされています。 そして、Strawberry Perlにはなんとgccがバンドルされているので(最近Windows触ってないので初めて知った) これを使ったら Perl のビルド自体は割と簡単にできました。 で、調子にのって過去のバージョンも試してみた(上のスクショ参照)のですが、 5.22.x 以前のバージョンでは GNU make が動きません。

Makefile:222: *** missing separator. Stop.

Visual Studio に付属する Microsoft NMAKE との互換性の問題です。 GNU make はコマンド行の先頭がタブでなければならないんですが、nmakeはなんだかよくわからないけど、いい感じにやってくれます。 GitHub Actions には Visual Studio 2017 Enterpriseがプリインストールされているらしいので、 探せば見つかる(?)気はするんですが、ちょっと力尽きました。 Windows詳しい人ヘルプ!

GitHub Actions 所感

これだけのマシンリソースを無料で使わせてもらえるなんていい時代になりました。 しかも Visual Studio 2017 Enterprise も入っているとは・・・。

ただ、ビルド環境の安定性という面では不安が残ります。 ジョブ数が少ないときはまあまあ安定してるんですが、「158ジョブ投入だ!」とか遊んでいるとなかなかジョブが始まりません。 まあ無料で使わせてもらっているので、多少キューが詰まるのは仕方ないかなと思うんですが、 ジョブの初期化中にエラーを吐いて死んでしまいました

Current runner version: '2.157.5'
Prepare workflow directory
Prepare all required actions
Download action repository 'actions/checkout@v1'
##[warning]Failed to download action 'https://api.github.com/repos/actions/checkout/tarball/v1'. Error Response status code does not indicate success: 401 (Unauthorized).
##[warning]Back off 14.374 seconds before retry.
##[warning]Failed to download action 'https://api.github.com/repos/actions/checkout/tarball/v1'. Error Response status code does not indicate success: 401 (Unauthorized).
##[warning]Back off 23.811 seconds before retry.
##[error]Response status code does not indicate success: 401 (Unauthorized).

もうちょっと粘って欲しい・・・。 結局158ジョブは走り切ることはありませんでした。

なんだかよくわからない対処療法として、ワークフローを分けると多少は改善する(?)みたいです。 158ジョブのときは同じワークフローにジョブを複数かいていましたが、 ubuntu, macOS, windows の3つのワークフローに分けたらうまくいきました。 それでも何回かリビルドを走らせたんですけどね。

まとめ

GitHub Actions で Perl のビルドが簡単にできるようになりました。

たぶん便利なので、ぜひ使ってみてください。