Dockerを使うとRedmineのテストが少しだけ楽になりました


My Redmine

原田です。12月になり今年も終わり新しい年を迎えるということで、付き合いのある方々からカレンダーを頂きます。毎年デザインが変わるので年末ぎりぎりまで新しいカレンダーは開けないで楽しみにしています。

今回はRedmineの改善作業の一つであるテストをDockerコンテナを使用してすべて通してみることについて書きたいと思います。

Redmineはテストが通らないとリリースできません

当然のことですけどテストが失敗するコードをリリースするとRedmineを利用する多くの方々にご迷惑をかけます。最悪業務が止まってしまう事もあり得ます。Redmineでは公式サイトに投稿されたパッチが問題なくテストを通過した時のみ公式サイトのSubversionリポジトリにコミットされ適切な時期にリリースされます。

環境によってはテストが通らないこともあります

Redmine改善業務で使用している私のRedmineは以下のようなシンプルな構成です。


Redmineの環境

私のテスト環境ではPostgreSQLとLDAPをインストールしていないため、これらに関するテストはスキップします(画面末尾の7 skipsで判断できます)。


一部のテストがスキップ

足らないものはDockerコンテナで補いましょう

(テストが必要だからテストコードを作成しているはずなのに)テストをスキップしているのを見るのは個人的に好みません(嫌いです)。足らない機能は(DockerComposeを使って)Dockerコンテナで実装すればローカル環境を汚さずテストが実施できます。今回はPostgrteSQLとLDAPのDockerコンテナを動かしてテストをすべて通したいと思います。(もっとこうした方が良い等、ご意見をいただけると幸いです。)

PostgreSQL のDockerコンテナ

私が実際に使用しているPostgreSQLのdocker-compose.ymlは以下のとおりです。テストで使用したデータやPostgreSQLの設定はDockerコンテナを再起動しても引き続き利用したいのでvolumes:でローカル環境に保存(永続化)しています。

version: '3'
services:
  postgres:
    image: postgres:12-alpine
    container_name: redmine_postgres
    environment:
      POSTGRES_PASSWORD: ********
      POSTGRES_INITDB_ARGS: --encoding=UTF-8 --locale=C --lc-collate=ucs_basic --lc-ctype=ucs_basic
    volumes:
      - ./postgres/pgsql-data:/var/lib/postgresql/data
    ports:
      - 5432:5432
PostgreSQLのdocker-compose.yml

LDAP のDockerコンテナ

LDAPのdocker-compose.ymとDockerfileは以下のとおりです。実際にはPostgreSQLとLDAPのdocker-compose.ymlは一つにまとまっています。

version: '3'
services:
  ldap:
    build: ./openldap
    image: farend/openldap.redmine
    container_name: redmine_ldap
    ports:
      - 389:389
LDAPのdocker-compose.yml

LDAPに投入する認証データはRedmineのテストデータ(test/fixtures/ldap/test-ldap.ldif)を使用します。OpenLDAPのDockerイメージ(osixia/openldap)とテストデータで重複している定義の削除やRedmineのLDAPテストでは許可しているLDAPのアクセス制限等をsedコマンドを使って調整しました。

FROM osixia/openldap:latest

ENV LDAP_ORGANISATION redmine
ENV LDAP_DOMAIN redmine.org
ENV LDAP_ADMIN_PASSWORD ********

ENV LANG C.UTF-8
ENV DEBIAN_FRONTEND noninteractive

ENV LDIF_DIR /container/service/slapd/assets/config/bootstrap/ldif

RUN \
  set -eux \
  && apt-get update\
  && apt-get install -y --no-install-recommends \
    subversion \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

WORKDIR /tmp
RUN \
  set -eux \
  && svn export http://svn.redmine.org/redmine/trunk/test/fixtures/ldap/test-ldap.ldif \
  && sed -e '/^dn: dc=redmine,dc=org$/,/^$/d' -e '/^dn: cn=admin,dc=redmine,dc=org$/,/^$/d' test-ldap.ldif > $LDIF_DIR/50-test-ldap.ldif
RUN \
  set -eux \
  && sed -e 's/^\(olcAccess: to \* by self read by dn="cn=admin,{{ LDAP_BASE_DN }}" write by \*\) none$/\1 read/' $LDIF_DIR/02-security.ldif > $LDIF_DIR/51-security.ldif
LDAPのDockerfile

Dockerコンテナを動かしてテストしました

上記で作成したdocker-compose.ymlをdocker-compose up -dで起動しRedmineのテストを実施しました。すべてのテストが通っていることを確認できました(画面末尾の0 skipsで判断できます)。


すべてのテストを通過

Dockerを使うと少しだけ楽になります

以前は仮想マシン(OS)を都度構築しアプリケーション(ミドルウェア)をインストールしていました。テスト用の環境を構築するだけでもかなりの時間(半日程度)を要していました。実際に必要なのはOSではなくミドルウェア。Dockerを使うことで仮想マシンの構築作業が不要になり、その時間を別の作業に割けるようになりました。

テストに限らず動作検証したい機能をDockerで実現すると短時間で欲しい機能が手に入ります(不要になれば停止・削除することも容易です)。RedmineはMySQLやメール送信機能もサポートしているのでこれらの動作検証にもDockerを使いたいと思います。


My Redmine

こちらの記事もオススメです!
Redmineを改善するパッチを書いて、OSSへの貢献もする仕事
オープンソースソフトウェア「Redmine」の開発に参加して機能改善を業務で行っています。
クラウドベースの統合開発環境「AWS Cloud9」超便利ッス。
AWS Cloud9は、いつでもどこでも同じ環境が使えて、共同開発にも向いています。
RubyWorld Conference 2019に出展しました
RubyWorld Conference 2019にPlatinumスポンサーとしてブースを出展。プレゼント企画としてクイズに挑戦していただきました。
Redmine互換課題管理システム「RedMica」 リリースの狙い
今日使える明日のRedmine「RedMica」!Redmineの次期バージョンで利用できる新機能をいち早く利用できるのが最大のメリットです。
OSC 2019 島根でのプレゼン発表へ向けての準備と工夫したところ
OSC 2019 島根でプレゼン。スライド作成で工夫したところを紹介します。
ファーエンドテクノロジーからのお知らせ(2024/04/24更新)
入門Redmine 第6版 出版記念企画セミナー「Redmineのアクセス制御」【2024/5/30開催】
入門Redmine 第6版(2024年3月23日発売)の書籍から「Redmineのアクセス制御」について解説します。
My Redmine 初回ご契約で「入門Redmine 第6版」プレゼントのお知らせ
Redmineのクラウドサービス「My Redmine」を初めてご契約いただいたお客様にRedmine解説書「入門Redmine 第6版」を進呈いたします。
2024年度ブランドパートナーに島根県在住のモデル ユイさんを継続起用
ユイさん(モデルスタジオミューズ所属)をファーエンドテクノロジーの2024年度ブランドパートナーとして継続して起用します。
My Redmine スタンダードプランおよびAdminサポートデスクプランの料金改定のお知らせ【2024年4月ご利用分より】
2024年4月ご利用分より、My Redmine スタンダードプラン(民間企業・個人向け及び官公庁向け)とAdminサポートデスクプランの料金を改定いたします。
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け