Perl Hackers Hub

第49回CPANモジュールの品質を支えるCI技術(2)

前回の(1)こちらから。

CIツールの活用─⁠─テストの自動実行による品質維持

CPAN Testersを使うと、コミュニティによってさまざまな環境でテストが行われます。しかし、これだけでは高品質なPerlモジュールをリリースするには不十分です。高品質なPerlモジュールをリリースするには、CIContinuous Integration継続的インテグレーション)ツールを使うのがお勧めです。

CIツールとは

CPAN Testersは便利ですが、次の欠点があります。

  • テスト結果がすぐにわからない
  • CPANにリリースしないとテストが実行されない

CPAN Testersのテストは有志によって行われているため、いつテストが実行されるかは保証されません。また、テストが実行されるのは、リリースが行われたあとです。これでは、コードの修正からテストまで時間がかかり、効率的な開発が行えません。

この問題はCIツールで解決できます。CIは継続的に行うソフトウェアの品質向上、工数削減を目的とした習慣のことです。狭義ではテストやビルドを自動実行し、品質向上、工数削減を達成することを指します。本稿では狭義の意味でCIという言葉を用います。

JenkinsとSaaS型CI

CIツールと言うとJenkinsを思い浮かべる人が多いでしょう。JenkinsはJavaで書かれたCIツールで、OSSで開発されています。Jenkinsをクラウドでホスティングしてもらえるサービスもありますが、社内やプロジェクトごとにサーバを立てて動作させるのが一般的です。自前でサーバを立てる必要があるため、小規模なOSS開発での利用には向いていません。

そんなときにお勧めなのは、SaaSSoftware as a Serviceとして提供されているCIサービスです。本稿では、代表的なCIサービスであるTravis CIAppVeyorをPerlで使う方法を紹介します。どちらもOSS開発では無料で利用できます。

Travis CIによるテストの自動実行

本項では、Travis CIを使ったテストの方法を説明します。以降は、テスト対象のリポジトリはGitHubで管理されているものとして説明します。

Travis CIとは

Travis CIは公式にPerlに対応しており、複数バージョンのPerlでのテストが容易です。List::MoreUtilsDBIなどの著名なPerlモジュールを始めとして、幅広く利用されています。

Travis CIのテストはコンテナベースの仮想環境で動作します。そのため、毎回クリーンな状態からテストできます。現在、Perlのテストの実行にはUbuntu 14.04(Trusty)ベースのイメージが利用されています。

Travis CIでテストの実行

Travis CIを使うと、リポジトリの更新のタイミングでTravis CI上で任意のコマンドを実行し、テストできます。また、GitHubのPull RequestやSlackなどのチャットツールへ、結果を自動でフィードバックさせることができます。

Travis CIを使ってテストを実行するには、次のステップが必要です。

  • ❶ Travis CIへGitHubアカウントでログインし、連携する
  • ❷ Travis CIの管理画面からテスト対象のリポジトリを指定する
  • ❸ 対象のリポジトリの最上位のディレクトリに設定ファイル.travis.ymlをコミットする

❸の.travis.ymlには、次のような記述を行います。

language: perl
perl:
  - "5.26"

script:
  - prove -lvr t

この設定では、Perl 5.26を用いて、proveコマンドによるテストprove -lvr tを行います。

これで、リポジトリにgit pushを行うと自動でprove-lvr tが実行され、Travis CI上に結果が表示されます図4⁠。テスト対象のブランチにGitHubのPull Requestが紐付いている場合、Pull Request側にテスト結果が表示されます。

図4 Travis CIでのテスト結果
図4 Travis CIでのテスト結果

複数のPerlバージョンでのテストの実行

Perlのモジュールを開発している場合、ある特定のバージョンのPerlのみでテストするだけでは不十分です。そのモジュールがサポートしているPerlのバージョンすべてで、テストを行う必要があります。

Travis CIを使うと、.travis.ymlに記述しておくだけで、任意のバージョンのPerlで自動テストを行えます。たとえばPerl 5.12~5.26でテストを実行したい場合、先ほどの.travis.ymlを次のように書き換えてください[1]⁠。

language: perl
perl:
  - "5.12"
  - "5.14"
  - "5.16"
  - "5.18"
  - "5.20"
  - "5.22"
  - "5.24"
  - "5.26"

script:
  - prove -lvr t

この.travis.ymlでテストを実行すると、Travis CI上では図5のように表示されます。

図5 Travis CIでの複数Perlバージョンによるテスト
図5 Travis CIでの複数Perlバージョンによるテスト

たとえば、ここでPerl 5.14で入った正規表現の非破壊修飾子s///rを使ったコードをコミットしてみます。そうすると、図6のように特定のバージョン以下でテストが失敗しました。

図6 Travis CIで特定バージョンでテストが失敗した挙動
図6 Travis CIで特定バージョンでテストが失敗した挙動

なお、現在公式にサポートされているPerlのバージョンは5.24および5.26ですので、それに従う場合はこの2つのバージョンでテストするだけで十分です。

これで、手間をかけずにサポートしているPerlバージョンすべてで動作確認を行えます。

テスト実行結果のSlackへの通知

Travis CIでは、テストの実行結果をメールやチャットで通知できます。通知を行うと、テストが失敗したときにすぐ気付けて便利です。

ここでは、Travis CIとSlackを連携させる方法を説明します。Travis CIとSlackを連携させるには、次のステップが必要です。

  • Slackの設定画面からTravis CIを追加する
  • ❷ 取得したトークンをtravisコマンドで暗号化する
  • .travis.ymlに、暗号化したトークンを追加し、コミットする

❷で暗号化するのは、トークンをOSSに載せ公開すると、Slackへ任意の投稿を行えるためです。travisコマンドはRubyで記述されているため、gemコマンドを使ってインストールします[2]⁠。

$ gem install travis
$ travis --version
1.8.8

travisコマンドが動作したら、次のコマンドでトークンを暗号化します。domainは連携したいSlackチームのドメインに、tokenは取得したトークンに置き換えてください。

$ travis encrypt "domain:token"
Detected repository as pine/sample, is this correct? |yes| yes
Please add the following to your .travis.yml file:

  secure: "XXX"

Pro Tip: You can add it automatically by running with --add.

❸の.travis.ymlには、次のような記述を行います。XXXは先ほどtravisコマンドで暗号化したトークンです。

language: perl
perl:
  - "5.26"

script:
  - prove -lvr t

notifications:
travis:
  - secure: "XXX"

これで、リポジトリにgit pushを行うとテストが実行され、結果がSlackに通知されます図7⁠。

図7 Travis CIとSlackの連携
図7 Travis CIとSlackの連携

バッジの追加

Travis CIのテスト結果を一目でわかる画像で表す、⁠バッジ」と呼ばれるものをドキュメントに貼ることができます図8⁠。これにより、モジュールがきちんとテストされていることを利用者にアピールできます。

図8 README.mdにTravis CIのバッジを貼った状態
図8 README.mdにTravis CIのバッジを貼った状態

バッジの情報は、図4~6のようなTravis CIのページへいき、リポジトリ名の右に表示されている画像をクリックすることで取得できます。

CPANオーサリングツールであるMinillaを使って開発を行っている場合、Travis CIのバッジを貼るのはより簡単です。Minillaの設定ファイルであるminil.tomlに次の設定を追記します。

badges = ["travis"]

こうすることで、Minillaでモジュールをビルドするコマンドであるminil buildを実行したときに、README.mdに自動的にバッジが貼られます。

AppVeyorによるWindowsテストの自動実行

本項では、Windows上でテストが実行できるAppVeyorを使ったテストの方法を説明します。

AppVeyorとは

Travis CIを使うとLinux上で複数のPerlバージョンに対してテストを行えますが、開発するモジュールがWindows環境でも動作する必要がある場合、これだけでは不十分です。

AppVeyorはWindows環境でのテストをサポートした、数少ないSaaS型のCIサービスです。AppVeyorを使うと、Linux環境だけではなくWindows上でも継続的にテストを実行できます。

Windows向けPerlディストリビューション

Windows上でPerlを使うには、あらかじめコンパイルされインストーラとして提供されているPerlディストリビューションを利用するのが一般的です。有名なものとして、ActivePerlStrawberry Perlがあります。

ActivePerlはWindows向けにコンパイルされたPerlに拡張を加えたものです。独自のパッケージマネージャPPMPerl Package Managerや、WSHWindows Script HostスクリプトをPerl 記述できる機能など、Windowsで便利にPerlを使うための機能があります。

それに対してStrawberry Perlは、どちらかと言うと素のPerlに近いディストリビューションです。Cコンパイラによるビルドが必要なXSモジュールは、MinGWのGCCによってビルドされます。UNIX環境のPerlに慣れた人がWindowsでも同じようにPerlを使いたい場合、Strawberry Perlを使うと便利です。

今回はStrawberry Perlを使ってテストを実行する方法を解説します。

AppVeyorでテストの実行

Travis CIでテストを行ったときと同じ要領で、AppVeyorでもテストを実行してみましょう。

AppVeyorを使ってテストを実行するには、次のステップが必要です。

  • ❶ AppVeyorへGitHubアカウントでログインし、連携する
  • ❷ AppVeyorの管理画面からテスト対象のリポジトリを指定する
  • ❸ 対象のリポジトリのルートに設定ファイルappveyor.ymlをコミットする

❸のappveyor.ymlには、次の記述を行います。

init:
  - git config --global core.autocrlf input

install:
  - choco install strawberryperl -version 5.26.1.1  …①
  - SET PATH=C:\strawberry\c\bin;C:\strawberry\perl\site\b
in;C:\strawberry\perl\bin;%PATH%  …②
  - cpanm --installdeps --notest --quiet --with-configure
--with-develop .

build: off
test_script:
  - prove -lvr t

shallow_clone: true

appveyor.xmlで重要なのはinstallステップです。で、Windows向けのパッケージマネージャであるChocolateyを使って、Strawberry Perlをインストールしています。Chocolateyを使うと、さまざまなコマンドラインツール、デスクトップアプリがコマンド経由でインストールできます。Strawberry Perlの場合、公式に提供されている.msi形式のインストーラのサイレントインストールの処理が走ります。では、Strawberry Perlがインストールした実行ファイルにパスを通しています。これにより、cpanmproveがフルパスを書かずに実行できます。

これで、リポジトリにgit pushを行うと自動でprove -lvrtが実行され、AppVeyor上に結果が表示されます図9⁠。

図9 AppVeyorでテストが実行される様子
図9 AppVeyorでテストが実行される様子

<続きの(3)こちら。>

WEB+DB PRESS

本誌最新号をチェック!
WEB+DB PRESS Vol.130

2022年8月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-13000-8

  • 特集1
    イミュータブルデータモデルで始める
    実践データモデリング

    業務の複雑さをシンプルに表現!
  • 特集2
    いまはじめるFlutter
    iOS/Android両対応アプリを開発してみよう
  • 特集3
    作って学ぶWeb3
    ブロックチェーン、スマートコントラクト、NFT

おすすめ記事

記事・ニュース一覧