Blog

CPAN module を release するための docker image を作った

https://github.com/tokuhirom/docker-minil-release

CPAN module をリリースするには、色々と前準備が必要というか、、色々な CPAN module をインストールしなきゃいけなくてちょっと手間だった。最近は年に数回しかしないのだが、、リリースのたびに準備の時間がかかるので、ちょっと時間がかかって面倒なのだった。 面倒なので、ある程度設定した状態の VPS を維持していたのだが、それもなぁ、という。 このブログなども k8s に移行したので、VPS を維持する必要がなくなったのでその VPS を廃止したい。

本来なら github actions などからリリースできるようにしたいのだが、その手間もまぁまぁデカイということで、コスパないしタイパが良い範囲でやろうかなと。。 ということで、ある程度設定された状態の docker image を作っておこうかなと言う感じ。

実装の解説

FROM perl:latest

とすることにより、perl の docker image を利用する。正直、常に最新版を使ってリリースすりゃいいので、latest image を利用。

RUN apt update
RUN apt upgrade -y
RUN apt install -y vim

vim がはいってないと minil の機能である Changes の編集機能がつかえないので、vim を入れる。

ENV PERL_CPANM_OPT="--notest --no-man-pages --with-recommends --with-suggests --with-all-features --with-configure --with-develop"

ENV を設定して、とにかく依存っぽいやつをガンガン入れるように設定する。こうしないとテストコケることが多くなる。

続いて肝心の minilla を入れる。

RUN cpanm Minilla

あとは、インストールに時間かかる感じの依存をガンガン入れていく。

RUN cpanm Amon2
RUN cpanm DBD::SQLite LWP::Protocol::https DBD::mysql
RUN cpanm Catalyst::Runtime
RUN cpanm DBIx::Class
RUN cpanm Dist::Milla
RUN cpanm Tiffany
RUN cpanm Task::BeLike::TOKUHIROM
RUN cpanm Test::Perl::Critic Perl::Critic
RUN cpanm HTTP::Server::Simple::CGI Spiffy WWW::MobileCarrierJP

minilla はリリースプロセスの中で git commit するので、user.email, user.name を設定しておく。

RUN git config --global user.email "[email protected]"
RUN git config --global user.name "Tokuhiro Matsuno"

起動時に、/target/ にマウントされたソースコードを対象に、cpanm を使って依存を入れて、minil release が実行されるようにする。

WORKDIR /target/

CMD [ "/bin/bash", "-c", "cpanm --installdeps . && minil release" ]

利用方法

docker pull してイメージを取得する。

docker pull ghcr.io/tokuhirom/docker-minil-release:latest

あとは適当に volume を mount しながら実行するだけ。簡単。

docker run -it --rm -v $PWD:/target/ -v $HOME/.pause:/root/.pause -v $HOME/.ssh:/root/.ssh --name minil-release-app ghcr.io/tokuhirom/docker-minil-release:latest