前の記事で紹介したパラレルESI(pesi)など、様々なVMODがあるのですが、残念なことにパッケージで提供されているVMODはほとんどありません。
自分がメンテしているカスタムでカウンタを作るもの(xcounter)とかは、勉強がてらGithub actionsでdebを作るようにしてみたのですが、なかなかめんどくさいのが実情でこれは提供したがらないよなぁと思ってました。
なんなら公式のvarnish-modulesも公式ではパッケージ提供されていません。
では、VMODを使いたい場合はどうしてたのかというと、自分でパッケージを作るか.so配布するかとか、利用者・作者共ににも辛い状態だったわけです。
誰かが作るんじゃないかなと思ってたんですが、だれも作らなかったのと急に思い立ったのでえいやでdebとかrpmが作れるツールを作りました。
https://github.com/xcir/vmod-packager
使いかたは簡単で、docker, curl, jqが使える環境で
xcir@build01:~/git/vmod-packager$ cd src
xcir@build01:~/git/vmod-packager/src$ git clone https://github.com/varnish/varnish-modules.git
xcir@build01:~/git/vmod-packager/src$ cd ..
xcir@build01:~/git/vmod-packager$ ./vmod-packager.sh -e 0.19 varnish-modules
...
##################################################
docker image: vmod-packager/focal:7.0.0-1
Dist: focal
Varnish Version: 7.0.0
Varnish VRT: 140
VMOD name: varnish-modules
VMOD Version: 140.0.19
Status: SUCCESS
xcir@build01:~/git/vmod-packager$ ls pkgs/debs/varnish-modules/
varnish-modules_140.0.19~focal-1_amd64.build varnish-modules_140.0.19~focal-1_amd64.changes varnish-modules-dbgsym_140.0.19~focal-1_amd64.ddeb
varnish-modules_140.0.19~focal-1_amd64.buildinfo varnish-modules_140.0.19~focal-1_amd64.deb
こんな感じでパッケージを作れます。
もちろんrpmも
xcir@build01:~/git/vmod-packager$ ./vmod-packager.sh -d centos8 -e 0.19 varnish-modules
...
##################################################
docker image: vmod-packager/centos8:7.0.0-1
Dist: centos8
Varnish Version: 7.0.0
Varnish VRT: 140
VMOD name: varnish-modules
VMOD Version: 140.0.19
Status: SUCCESS
xcir@build01:~/git/vmod-packager$ ls pkgs/rpms/varnish-modules/
varnish-modules-140.0.19-1.el8.src.rpm varnish-modules-140.0.19-1.el8.x86_64.rpm
作れます。
もちろん、このように簡単にビルドできるのは
- ./autogen.sh(もしくは./bootstrap) + ./configure + makeで作れるもの
- 依存パッケージがないもの
上記を満たす必要がありますが、追加パッケージが必要だったり、ちょっと特殊なビルドが必要なものでも
カスタムスクリプトでパッケージにすることが可能です。
実際に先の記事で紹介したlibvdp-pesiをパッケージにしてみましょう。
xcir@build01:~/git/vmod-packager$ cd src/
xcir@build01:~/git/vmod-packager/src$ git clone https://gitlab.com/uplex/varnish/libvdp-pesi.git
xcir@build01:~/git/vmod-packager/src$ cd libvdp-pesi/
xcir@build01:~/git/vmod-packager/src/libvdp-pesi$ git checkout -b 7.0 remotes/origin/7.0
xcir@build01:~/git/vmod-packager/src$ cat libvdp-pesi_init.sh
#!/bin/sh
cp -rp ${VMP_ROOT_DIR}/src/m4 ${VMP_WORK_DIR}/src/m4
xcir@build01:~/git/vmod-packager/src$ cat libvdp-pesi_config.sh
#!/bin/sh
./autogen.sh
./configure VARNISHSRC=/tmp/varnish/src
xcir@build01:~/git/vmod-packager$ ./vmod-packager.sh -f src/libvdp-pesi
...
##################################################
docker image: vmod-packager/focal:7.0.0-1
Dist: focal
Varnish Version: 7.0.0
Varnish VRT: 140
VMOD name: libvdp-pesi
VMOD Version: 140.0.1
Enable fixed mode
Status: SUCCESS
xcir@build01:~/git/vmod-packager$ dpkg --info pkgs/debs/libvdp-pesi/libvdp-pesi_140.0.1~focal-1_amd64.deb
new Debian package, version 2.0.
size 56760 bytes: control archive=816 bytes.
309 bytes, 11 lines control
711 bytes, 10 lines md5sums
Package: libvdp-pesi
Version: 140.0.1~focal-1
Architecture: amd64
Maintainer: libvdp-pesi <example@localhost>
Installed-Size: 141
Depends: libc6 (>= 2.14), varnish (= 7.0.0)
Replaces: libvdp-pesi (<< 140)
Section: web
Priority: optional
Homepage: https://github.com/xcir/
Description: packed by vmod-packager
ビルド時に事前準備が必要な場合は[VMODの名前]_init.shにその内容を書きます。
今回はm4をコピーしていますが、ここでビルドに必要なパッケージをインストールすることも可能です。
この例では使っていませんが、dependsに追加が必要な場合は[VMODの名前]_env.shという別のファイルに入れる形になります。
また、libvdp-pesiはconfigureでvarnishのソースパスを指定する必要があるので [VMODの名前]_config.shで記述できるようにしています。
ちなみに-fオプションというのを使っていますが、これはlibvdp-pesiがVarnishのバージョンが厳密に一致する必要があるためでバージョンを固定するオプションになります。
こんな感じで割と複雑な手順が必要なVMODでも簡単にパッケージ化が可能です。
とはいえ、細かい指定はまぁいろいろできるんですが、自分は今のところsrc以下に使ってるvmodをcloneした後に
for i in `find src/ -mindepth 1 -maxdepth 1 -type d` ; do echo $i;cd $i ;git pull; cd ..;cd .. ; done
./vmod-packager.sh -v 7.0.1 -t -e `date +%Y%m%d` `find src/ -mindepth 1 -maxdepth 1 -type d`
find pkgs/debs/ -type f -name *.deb|grep `date +%Y%m%d`| xargs -i cp -p {} [コピー先]
みたいな感じで、更新した後に一気にバージョンを日付でビルドしてあとはよしなにするといった感じです。
何はともあれ、使いかたはREADMEを見てほしいです。
今のところよく使われてそうなものはビルドを試しており、大体いけるんじゃないかなと考えています。
が、もしビルド出来ないVMODや気になる点があったら指摘してもらえると嬉しかったりします。
なお、このツールでパッケージにしたものは外部に配布することを想定していません。
これはcopyrightとかdescriptionとかまでカスタマイズできるするのが面倒だったというのがあるので、そのうちなんとかするかもしれないです。
が、現時点では自身の環境にインストールするパッケージを作るのに使うぐらいが良いでしょう。