docker-composeを使って複数バージョンのRedmineに対してプラグインのテストをする方法


Redmineのプラグインを作っていると複数のバージョンのRedmineに自分のプラグインが対応しているかどうか確認したくなることがあります。

結論はリンク先を見てください。

docker-composeを使って複数バージョンのRedmineに対してプラグインのテストをする方法

MariaDB(MySQL)とPostgreSQLに対応した全文検索用のプラグインを作っているのですが、複数バージョンのRedmineに対する動作を確認したくなったので方法を考えてdocker-compose.ymlを書きました。

方針は以下の通りです。

  • docker-compose.yml で書ける範囲でがんばる (Dockerfileは書かない)
  • データベースはホスト環境にインストールしているものを使う
    • MroongaのDockerイメージはあるけど、PGroongaのDockerイメージはないため既にホストに入っているものを活用したい
  • プラグインは、Dockerイメージ内にコピーしない
  • プラグインの動作確認用なので、セキュリティについてはあまりガチガチにしない
version: "2"
services:
  redmine-3.2-mariadb:
    image: redmine:3.2
    ports:
      - "3011:3000"
    environment:
      REDMINE_DB_MYSQL: mariadb
      REDMINE_DB_DATABASE: redmine-3.2
    env_file:
      - env
    extra_hosts:
      - "mariadb:172.17.0.1"
    volumes:
      - .:/usr/src/redmine/plugins/full_text_search:ro

最初の1つができたらあとはコピーして増やすだけなので、1つ例を上げて説明します。

ホスト側のポート番号は、複数のRedmineを同時に上げて確認することもあるのでユニークになるようにします。
環境変数は、以下の4つを設定します。

  • REDMINE_DB_MYSQL or REDMINE_DB_POSTGRES: データベースのホスト名を指定します
  • REDMINE_DB_DATABASE: データベースの名前を指定します
  • REDMINE_DB_USERNAME: データベースに接続するユーザー名を指定します
  • REDMINE_DB_PASSWORD: データベースの接続に使用するパスワードを指定します

ユーザー名とパスワードは他のバージョンのRedmineでも共通にしておいた方が設定が楽になるので、上の例では REDMINE_DB_USERNAME, REDMINE_DB_PASSWORDenv_file にまとめています。

extra_hostsにはREDMINE_DB_MYSQL(REDMINE_DB_POSTGRES)に設定したホスト名とDockerコンテナ内からホストにアクセスするためのIPアドレスを書きます。これを書いておくとDockerコンテナ起動時に/etc/hostsに自動で追加してくれて、便利です。

最後にvolumesでプラグインディレクトリを読み込み専用でマウントして完了です。

docker-compose upするとrake db:migrateはやってくれますがrake redmine:plugins:migrateはやってくれないので、以下のようにdocker-compose execします。

$ docker-compose up -d redmine-3.2-mariadb
$ docker-compose exec redmine-3.2-mariadb rake redmine:plugins:migrate RAILS_ENV=production
$ docker-compose restart redmine-3.2-mariadb

補足

MariaDBやPostgreSQLはデフォルトでは外部からの接続を受け付けないようになっています。
そこで外部(Redmineの入っているDockerコンテナ)からホストで稼働中のMariaDBやPostgreSQLに接続するための設定をします。

MariaDB

MariaDB 10.1で確認しましたが、MySQLや他のバージョンでも同じだと思います。

以下のようにbind-addressに*を設定し、ユーザーを作成するときにどこからの接続を受け付けるのかを指定しておきます。
なお bind-address には複数の条件を指定することはできないので、今回のように複数のIPアドレス範囲(localhostとDockerコンテナ内部)から接続する必要があるときは、以下のように*を指定し、CREATE USER時にユーザーごとにどこから接続するのかを制限します。

bind-address            = *

設定ファイルを書き換えたらMariaDBを再起動しておきます。

CREATE USER 'redmine'@'%' identified by 'passowrd'; -- どこからでも接続できる
CREATE USER 'redmine'@'172.0.0.1/8' identified by 'passowrd'; -- 172.*.*.* から接続できる

PostgreSQL

pg_hba.conf に以下の内容を追記します。

host    all             all             172.0.0.0/8             md5

Dockerが使いそうなIPアドレスの範囲を書いておきます。
設定ファイルを書き換えたらPostgreSQLを再起動しておきます。

postgresql.confも書き換えておきます。

listen_addresses = '*'