はじめに
Gitlab Pagesに大きなファイルをデプロイしたい場合、基本的には設定のMaximum size of pagesを大きくすれば問題ありません。ただそうは言ってもその分サーバの容量は食ってしまうので、数GBのコンテンツをデプロイしたいようなケースでなんとか圧縮できないかやってみました。
動作確認したバージョンはGitLab Community Edition 10.4.2になります。
Support for statically compressed gzip content-encoding
このMRの通り、ブラウザがgzip圧縮をサポートしている場合、Gitlab Pagesは事前にgzip圧縮されたファイルを返すことができます。
例えば
index.html
index.html.gz
という構成になっているとき、gzipサポートされたブラウザでアクセスすればindex.htmlではなくindex.html.gzが表示され、gzipがサポートされていなければindex.htmlが表示されます。
つまりgzipサポートされたブラウザからアクセスする限りにおいてはindex.htmlは空でもよい、ということになります。
ただしindex.htmlが不要というわけではなく、存在しない場合は404エラーとなります。
.gitlab-ci.yml
というわけで以下のような.gitlab-ci.ymlでGitlab PagesをデプロイすればOKです。
find ...にてデプロイする全コンテンツをgzip圧縮し、ダミーの空ファイルを生成しています。
pages:
script:
- mkdir -p public
- touch public/large.html
- find public/* -type f | xargs -I {} sh -c "gzip {}; touch {}"
artifacts:
paths:
- public
単に空ファイルにするのではなくエラーメッセージ的なものを入れておいた方が後々混乱しにくいでしょう。
(下記の通りcurlで取りに行くと空ファイルが返ってきてびっくりするかもしれません)
curl/wgetでの取得
gzip非対応のブラウザというのはもはや想定しなくていい気がしますが、curl/wgetはデフォルトではgzipを受け取りません。そのため以下のようにAccept-Encoding:gzipヘッダを明示的に付けるか直接.gzファイルを取りに行く必要があります。
> wget --header="Accept-Encoding:gzip" -O index.html.gz http://.../index.html
> curl -H "Accept-Encoding:gzip" -o index.html.gz http://.../index.html
> wget -O index.html.gz http://.../index.html.gz
> curl -o index.html.gz http://.../index.html.gz