Dockerを使うと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 島根でプレゼン。スライド作成で工夫したところを紹介します。
ファーエンドテクノロジーからのお知らせ(2020/06/03更新)
オープンソースのRedmine互換プロジェクト管理ソフトウェア「RedMica 1.1.0」リリース
Redmine互換のオープンソースのプロジェクト管理ソフトウェア「RedMica」のバージョン1.1.0をリリースしました。
オープンソースのRedmine互換プロジェクト管理ソフトウェア「RedMica」のロゴができました
Redmine互換のオープンソースのプロジェクト管理ソフトウェア「RedMica」(ファーエンドテクノロジー版Redmine)のロゴができました。
2020年度ブランドパートナーに島根県在住のモデル ユイさんを3年連続起用
ユイさん(モデルスタジオミューズ所属)をファーエンドテクノロジーのブランドパートナーとして継続して起用します。今年度で3年目となります。
My Redmine(Gen.2)ストレージ容量を倍増!スタンダードプランは200GBに
My Redmine Gen.2(ジェネレーション2)のストレージ容量が料金そのままにこれまでの2倍になりました。
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け