RedmineのtrunkのDockerイメージを毎日自動でビルドする

この記事はRedmine Advent Calendar 2019の4日目です。

3日目の記事はankosoftさんの権限のない一般ユーザーがRedmineのマイページのカレンダーを乗っ取った件でした。一般ユーザーが自由にRedmineの機能を拡張できるようになるといろいろ捗りそうな現場はたくさんありそうですね。

最初にまとめ

RedmineのDockerイメージいろいろ

今年の11月に開催されたRedmine.tokyoの参加者アンケートでは、DockerでRedmine環境を構築している人は1割未満、増加傾向にあるものの普及はこれからという状況のようです。

すでにDocker Hubには実運用が可能なDockerイメージがいくつか公開されています。

公式のイメージとしてhttps://hub.docker.com/_/redmineが提供されています。「公式」といってもredmine.orgのコアメンバーが管理しているわけではなく、docker.comとしての公式イメージという位置づけです。GitHubリポジトリhttps://github.com/docker-library/redmine)がありますが、RedmineというよりDockerのコミュニティーに近そうな人のコミットも目立ちます。

sameersbn/redmineは人気のあるサードパーティのイメージです。SSL対応なども組み込まれているので、手間をかけずに実運用に乗せたいときには便利かもしれません。

trunkのソースコードを差し込む

今回は手軽に新機能の動作検証ができるイメージを作りたかったので、Dockerの公式のRedmineイメージをベースにします。

シンプルなRailsアプリであれば一からDockerfileを書いてもよさそうですが、公式のDockerfileはRedmineの特殊な挙動(database.ymlの内容によってGemfileの評価結果が変わる)にがんばって対応しているので、その成果をそのまま使わせていただくことにしました。*1

Dockerfileの中でソースコードのtarballをwgetで取得している箇所をsvn coに書き換えるだけです。 中間証明書が抜けていたり、新しめのDebianではTSL 1.0が無効化されているあたりもagileware-jp/redmine-plugin-orbのやりとりを参考にしつつ、まじめに実装しました

TravisCIで毎日ビルドする

Dockerの公式のRedmineイメージのリポジトリでは、TravisCIを使った自動テストを行っています。イメージがビルドできるか確認してから、Redmineのサービスが正常に起動することも検証しています。

テストコードとその呼び出し処理は以下のあたりです。

CIの設定はリポジトリ.travis.ymlに記述されていて、cloneすればそのまま使えます*2。あとは定期的にCIのジョブを実行してイメージをpushする仕組みを付け足すだけで完成です。

TravisCIではCron Jobという機能を使うとジョブを定期的に実行することができます。

Docker Hubにイメージをpushするシェルスクリプトscript/deploy.bashに置いています。仕組みを作った当時はdocker loginにアカウントのパスワードをそのまま使うしかなくてやや不安だったのですが、2019年9月にDocker HubにPersonal Access Tokenが追加されて、いい感じになりました。

Herokuにデプロイする

Dockerイメージが作れたらどこかにデプロイしたくなりますね。今回は無料で手軽に使えるという理由でHerokuを選びました。Dockerイメージがpushされるとhttps://redmine-trunk-demo.herokuapp.com/に自動でデプロイされるようにしています。

デプロイ手順の詳細はここでは省きます。Heroku appと連携しているリポジトリhttps://github.com/vzvu3k6k/heroku-redmine-trunkです。関心のある方はご参照ください。

Redmineのメール通知、ファイルアップロード、リポジトリなどの機能をHeroku上で動かすには個別の設定やプラグインが必要になります。デモ環境では一部の機能が欠けていても差し障りはないだろうということでデフォルトのままにしています。Herokuではデプロイ後にファイルシステムに加えた変更が永続化されないので、おそらくファイルをアップロードしても数時間後には消えてしまうはずです。

また、デプロイ後にbin/rails db:fixtures:loadでテスト用のデータを流し込んで、DBのデータもリセットするようにしています。リセット直後にトップページを開くと、ニュース欄に「John Smith さんが13年以上前に追加」というテキストが表示されていて、コードベースの歴史を感じてしまいますね。

明日はak.iwasakiさんの「新プラグインリリース」です。

*1:公式のDockerfileのライセンスはGPL 2なので、今回のDockerfileのライセンスも同じくGPL 2としています。

*2:Dockerイメージの名前をキーにしてテストコードを探す仕組みになっています。ネームスペースは無視されるので、イメージ名をfoobar/redmineという形にしておけばRedmineのテストが実行されます。