RedmineのtrunkのDockerイメージを毎日自動でビルドする
この記事はRedmine Advent Calendar 2019の4日目です。
3日目の記事はankosoftさんの権限のない一般ユーザーがRedmineのマイページのカレンダーを乗っ取った件でした。一般ユーザーが自由にRedmineの機能を拡張できるようになるといろいろ捗りそうな現場はたくさんありそうですね。
最初にまとめ
- Dockerの公式のRedmineのDockerfileをベースにして、trunk(開発最新版)のDockerfileを作りました。
- 毎朝最新のtrunkのDockerイメージがDocker Hubにpushされます。
- Herokuにもデプロイしています。
- 新しい機能を軽く触りたいときにどうぞ。
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のサービスが正常に起動することも検証しています。
テストコードとその呼び出し処理は以下のあたりです。
- https://github.com/docker-library/official-images/blob/master/test/tests/redmine-basics/run.sh
- https://github.com/docker-library/redmine/blob/ba9880cc3a224c7e5e15c1f9bf1757aa7c4c5b92/.travis.yml#L25
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年以上前に追加」というテキストが表示されていて、コードベースの歴史を感じてしまいますね。