前回の(1)はこちらから。
CIツールの活用──テストの自動実行による品質維持
CPAN Testersを使うと、コミュニティによってさまざまな環境でテストが行われます。しかし、これだけでは高品質なPerlモジュールをリリースするには不十分です。高品質なPerlモジュールをリリースするには、CI(Continuous Integration、継続的インテグレーション)ツールを使うのがお勧めです。
CIツールとは
CPAN Testersは便利ですが、次の欠点があります。
- テスト結果がすぐにわからない
- CPANにリリースしないとテストが実行されない
CPAN Testersのテストは有志によって行われているため、いつテストが実行されるかは保証されません。また、テストが実行されるのは、リリースが行われたあとです。これでは、コードの修正からテストまで時間がかかり、効率的な開発が行えません。
この問題はCIツールで解決できます。CIは継続的に行うソフトウェアの品質向上、工数削減を目的とした習慣のことです。狭義ではテストやビルドを自動実行し、品質向上、工数削減を達成することを指します。本稿では狭義の意味でCIという言葉を用います。
JenkinsとSaaS型CI
CIツールと言うとJenkinsを思い浮かべる人が多いでしょう。JenkinsはJavaで書かれたCIツールで、OSSで開発されています。Jenkinsをクラウドでホスティングしてもらえるサービスもありますが、社内やプロジェクトごとにサーバを立てて動作させるのが一般的です。自前でサーバを立てる必要があるため、小規模なOSS開発での利用には向いていません。
そんなときにお勧めなのは、SaaS(Software as a Service)として提供されているCIサービスです。本稿では、代表的なCIサービスであるTravis CIとAppVeyorをPerlで使う方法を紹介します。どちらもOSS開発では無料で利用できます。
Travis CIによるテストの自動実行
本項では、Travis CIを使ったテストの方法を説明します。以降は、テスト対象のリポジトリはGitHubで管理されているものとして説明します。
Travis CIとは
Travis CIは公式にPerlに対応しており、複数バージョンのPerlでのテストが容易です。List::MoreUtilsやDBIなどの著名な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
には、次のような記述を行います。
この設定では、Perl 5.26を用いて、prove
コマンドによるテストprove -lvr t
を行います。
これで、リポジトリにgit push
を行うと自動でprove-lvr t
が実行され、Travis CI上に結果が表示されます(図4)。テスト対象のブランチにGitHubのPull Requestが紐付いている場合、Pull Request側にテスト結果が表示されます。
複数のPerlバージョンでのテストの実行
Perlのモジュールを開発している場合、ある特定のバージョンのPerlのみでテストするだけでは不十分です。そのモジュールがサポートしているPerlのバージョンすべてで、テストを行う必要があります。
Travis CIを使うと、.travis.yml
に記述しておくだけで、任意のバージョンのPerlで自動テストを行えます。たとえばPerl 5.12~5.26でテストを実行したい場合、先ほどの.travis.yml
を次のように書き換えてください[1]。
この.travis.yml
でテストを実行すると、Travis CI上では図5のように表示されます。
たとえば、ここでPerl 5.14で入った正規表現の非破壊修飾子s///r
を使ったコードをコミットしてみます。そうすると、図6のように特定のバージョン以下でテストが失敗しました。
なお、現在公式にサポートされている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]。
travis
コマンドが動作したら、次のコマンドでトークンを暗号化します。domain
は連携したいSlackチームのドメインに、token
は取得したトークンに置き換えてください。
❸の.travis.yml
には、次のような記述を行います。XXX
は先ほどtravis
コマンドで暗号化したトークンです。
これで、リポジトリにgit push
を行うとテストが実行され、結果がSlackに通知されます(図7)。
バッジの追加
Travis CIのテスト結果を一目でわかる画像で表す、「バッジ」と呼ばれるものをドキュメントに貼ることができます(図8)。これにより、モジュールがきちんとテストされていることを利用者にアピールできます。
バッジの情報は、図4~6のようなTravis CIのページへいき、リポジトリ名の右に表示されている画像をクリックすることで取得できます。
CPANオーサリングツールであるMinillaを使って開発を行っている場合、Travis CIのバッジを貼るのはより簡単です。Minillaの設定ファイルであるminil.toml
に次の設定を追記します。
こうすることで、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ディストリビューションを利用するのが一般的です。有名なものとして、ActivePerlとStrawberry Perlがあります。
ActivePerlはWindows向けにコンパイルされたPerlに拡張を加えたものです。独自のパッケージマネージャPPM(Perl Package Manager)や、WSH(Windows 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
には、次の記述を行います。
appveyor.xml
で重要なのはinstall
ステップです。①で、Windows向けのパッケージマネージャであるChocolateyを使って、Strawberry Perlをインストールしています。Chocolateyを使うと、さまざまなコマンドラインツール、デスクトップアプリがコマンド経由でインストールできます。Strawberry Perlの場合、公式に提供されている.msi形式のインストーラのサイレントインストールの処理が走ります。②では、Strawberry Perlがインストールした実行ファイルにパスを通しています。これにより、cpanm
やprove
がフルパスを書かずに実行できます。
これで、リポジトリにgit push
を行うと自動でprove -lvrt
が実行され、AppVeyor上に結果が表示されます(図9)。
<続きの(3)はこちら。>
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現!
- 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう
- 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT