Perl Hackers Hub

第65回 依存モジュールの更新 ―update-cpanfile,GitHub Actionsで実現!(1)

この記事を読むのに必要な時間:およそ 3.5 分

モジュールの管理につきまとう問題

次に,モジュールの管理をどう実現するかを考えます。モジュールの管理にあたっては,cpanfile.snapshotをGitなどのリポジトリに含めてバージョン管理するかどうかが大きな判断ポイントとなります。

cpanfile.snapshotをバージョン管理しない手法は,CPANに公開されるようなモジュールを作っているときに採られる方式です。cpanfileだけをリポジトリにコミットします。インストール時に,cpanfileの要求範囲内で最新のモジュールがインストールされます。

cpanfile.snapshotをバージョン管理する手法は,アプリケーションを作っているときに採られる方式です。cpanfile,cpanfile.snapshotともにリポジトリにコミットします。cpanfile.snapshotに記載された固定のバージョンのモジュールがインストールされます。

それぞれのメリット,デメリットを説明します。

snapshotを管理しないと本番一発勝負となる

cpanfile.snapshotをバージョン管理しない場合,cpanfileでの要求範囲から,CPANで公開されている最新のモジュールがインストールされます。

最新のモジュールがインストールされると聞くと,自動で更新されて便利そうにも思いますが,これには問題があります。

アプリケーションのデプロイ時に最新のモジュールをインストールするので,本番環境のアプリケーションが新しいモジュールとともに期待どおりに動くかどうかは,デプロイするまでわかりません。つまり,本番環境での一発勝負となります。最新のバージョンでの動作に問題があった場合,バージョンを戻そうにも,どのモジュールをどこまで戻せばよいかを調べるのは困難です。

以上の理由で,アプリケーションを開発している場合,この方式はお勧めしません。

ただし,モジュールを開発している場合は,この方式を採ります。モジュールを開発しているときは,後方互換性を重視し,なるべく幅広いバージョンのモジュールとともに動くべきです。そのため,cpanfileでのバージョン指定には,問題なく動作する限り古いバージョンを指定します。詳しくは,本連載の第50回Minillaを使ったモダンなCPANモジュール開発を参考にしてください。

snapshotを管理すると更新が必要となる

cpanfile.snapshotをリポジトリに含めておけば,インストールすべきバージョンがリポジトリで管理されます。そのため,本番環境で動かしたいバージョンを使って事前に自動テストを動かしたり,動作確認を行ったりと,リリース前の準備ができます。安全な更新を行える点で,本稿ではこの方式をお勧めします。

ただし,このままではインストールされるモジュールは常に固定となってしまいます。モジュールの更新は開発者の仕事となるので,手作業や,のちに紹介するツールなどを使って,モジュールを最新に追従する方法を考える必要があります。

以降では,cpanfile.snapshotはリポジトリにコミットして管理するものとして話を進めていきます。

アプリケーションの依存モジュールの更新方法

アプリケーションの依存モジュールの更新手順は,cpanfile.snapshotを更新し,動作確認を行い,本番環境にデプロイするという3つのステップに分かれています。

snapshotを更新する

まずは,新しいモジュールがインストールされたcpanfile.snapshotを用意します。これには,cpanfileを手作業で編集する方法と,carton updateコマンドを使う方法があります。

cpanfileを手作業で編集する方法

cpanfileを書き換えて,新しいバージョンを要求することで,cpanfile.snapshotを更新できます。

まず,cpanfileに記録しているモジュールから,更新したいモジュールを選び,CPANに公開されている最新のバージョンを調べます。筆者はmetacpanを利用しています。

次に,cpanfileをテキストエディタで編集し,requires 'List::MoreUtils', '0.428';のようにバージョンを変更して保存します。これは,List::MoreUtilsの0.428以上を要求する」という意味です。==0.428にすると,0.428ぴったりに固定という意味になります。編集によって,cpanfile.snapshotでの記録は,cpanfileでのバージョン要求を満たせない状態となりました。

続いて,carton installコマンドを実行すると,Cartonコマンドは,cpanfileでの要求を満たす形でCPANから新しいバージョンのモジュールをインストールし,cpanfile.snapshotにインストールされた新しいバージョンを記録します。cpanfileとcpanfile.snapshotの両方が新しいバージョンを指し示し,2ファイル間の整合性が保たれた形になったので,これら2ファイルをリポジトリにコミットします。

carton updateを使う方法

Cartonのサブコマンドであるcarton updateコマンドは,cpanfileに指定しているモジュールを,バージョン要求の範囲内で更新してインストールし,cpanfile.snapshotを書き換えます。

carton updateコマンドはcpanfileを書き換えず,cpanfileでのバージョン指定を満たす範囲での更新が行われます。'JSON::XS', '<= 3.00'のように上限のある指定や,'JSON::XS', '== 3.00'のように完全一致でのバージョンを指定している場合には,CPANで公開された最新バージョンではなく,cpanfileでの指定を上限とした更新になります。

すべてのモジュールがまとめて最新化されるので更新手順としては簡単ですが,変更が多岐にわたると,どこに着目して動作確認すればよいかわかりづらい,という扱いづらさがあります。

前項の手作業での更新のようにモジュールを一つずつ更新したい場合は,carton update List::MoreUtilsとして特定のモジュールのみを更新することもできます。

更新によって書き換えられたcpanfile.snapshotは,リポジトリにコミットしましょう。

正しく更新できたか動作確認する

新しいバージョンのモジュールをインストールした環境で,自動テストを動かしたり,実際に手もとや開発環境などでアプリケーションを動かしたりして,挙動を確認します。

CIContinuous Integration継続的インテグレーション)環境を用意している場合は,新しいモジュールで自動テストが通ることを確認してからマージできるような開発フローを用意しておくと便利です。

本番環境へのデプロイ

こうして更新の用意ができたら,アプリケーションのデプロイ時に新しいモジュールをインストールします。

carton install --deploymentを実行すると,cpanfile.snapshotに記録されたバージョンのみに従ってモジュールをインストールします。モジュールのインストール後,本番環境のアプリケーションを再起動すれば,本番環境でのモジュールの更新の完了です。

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

WEB+DB PRESS

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

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

  • 特集1
    詳解Visual Studio Code
    実践的な操作,カスタマイズ,拡張機能開発
  • 特集2
    [3年ぶりのLTS]
    速攻Java 17
    言語仕様やJVMの進化を体感!
  • 特集3
    [今こそ始める]
    クラウド移行大作戦
    計画,構築,運用のポイント

著者プロフィール

hitode909

株式会社はてな所属。ブログサービスやマンガサービスの開発に携わる。

趣味はサウナ。京都中の銭湯を巡り,サウナのために旅行に出かける。

GitHub:hitode909
URL:https://blog.sushi.money/