RHEL8環境へのRedmine v5.0.5の手動インストール手順 (3) - Subversion連携

このドキュメントでは、RHEL8環境に手動でRedmineをインストールする手順を記載します。

構築手順を1つの記事で全部書くと非常に長文になってしまいますので、以下の内容で記事を分割して記載しています。

■記事一覧

3回目の今回は、Subversion連携です。
Subversionの認証をRedmineユーザーを用いる設定を行います。
さらにAD認証RedmineユーザーでもSubversionにログインできる様に設定をします。

「今更Subversionですか?」と思われる方も多々いるかと思いますが、まだ使っている人もそれなりにいると信じて書いていきます。
「私まだSubversion使っていますよ~!」って人がいましたら、「いいね」や「コメント」を残してもらえると嬉しいです。

前提

環境

全体のソフトウェア環境構成は以下となります。

  • Redhat Enterprise Linux 8.6
  • Ruby環境
    • rbenv v1.2.0-74
    • Ruby v3.1.4p223
    • Rails v6.1.7.6
  • Apache HTTP Server v2.4.37
  • MariaDB v10.3.35
  • Redmine v5.0.5
  • Subversion v1.10.2
  • Git v2.31.1
  • LDAP
    • Windows Server 2019 Active Directory

コマンド記載時のプロンプトルール

コマンド実行の記載でのプロンプトは以下のルールで記載をしています。

  • $ : 一般ユーザー
  • # : rootユーザー

1. Subversionのインストール

1-1. Subversionのインストール

今回Subversionはdnfでインストールしました。

$ sudo dnf module install subversion

この状態で、subversionのサービスを起動しようと「systemctl start svnserve」を実行するとエラーになります。 これは、systemctlから起動するSubversionのデータルートディレクトリが「/var/svn」が設定されていて このディレクトリが存在しないためです。 ただ、Redmineと連携する場合、SubversionへのアクセスはApache HTTP Server経由となりますので、 Subversion自体のサービスを起動することはありません。

2. Redmine/Subversion認証連携

2-1. 前提ライブラリ導入

以下3つのモジュールを dnfでインストールします。

  • mod_perl.so
  • mod_dav_svn.so
  • perl-Digest-SHA
$ sudo dnf install mod_perl mod_dav_svn perl-Digest-SHA

2-2. Subversionの認証ユーザーをRedmine認証ユーザーとするためのファイル配置

Subversionの認証ユーザーをRedmine認証ユーザーとするためには、Redmineが用意をしてくれているPerlモジュールをPerlのライブラリディレクトリへ配置します。

# mkdir -p /usr/lib64/perl5/Apache/Authn
# cp  /opt/redmine-5.0.5/extra/svn/Redmine.pm /usr/lib64/perl5/Apache/Authn/Redmine.pm

2-3. Apache設定ファイルの作成

httpでのSubversionへのアクセスについて、以下のApache設定ファイルに設定します。

  • /etc/httpd/conf.extra/httpd-svn.conf

※必要なモジュールの読み込みも記載しているが、デフォルトで読み込まれている物はコメント化しています。
※Subversionデータルートディレクトリをここでは「/data/svn」としています。

# "conf.modules.d/00-dav.conf"でロード済み
#LoadModule dav_module       modules/mod_dav.so
#LoadModule dav_fs_module    modules/mod_dav_fs.so

# "conf.modules.d/10-subversion.conf"でロード済み
#LoadModule dav_svn_module   modules/mod_dav_svn.so
#LoadModule authz_svn_module modules/mod_authz_svn.so

# "conf.modules.d/02-perl.conf"でロード済み
#LoadModule perl_module      modules/mod_perl.so

# 転送モードをBulkに設定
SVNAllowBulkUpdates Prefer

PerlLoadModule Apache::Authn::Redmine
<Location /svn>
  Dav svn

  # SVN Data Root Directory
  SVNParentPath /data/svn

  AuthType Basic
  AuthName "Subversion"
  Require valid-user

  PerlAccessHandler Apache::Authn::Redmine::access_handler
  PerlAuthenHandler Apache::Authn::Redmine::authen_handler

  # for Redmine Authentication
  RedmineDSN "DBI:mysql:database=redmine;host=localhost;mysql_socket=/var/lib/mysql/mysql.sock"
  RedmineDbUser "redmine"
  RedmineDbPass "MariaDBのredmineユーザーパスワード"

</Location>

以下のコマンドを実行し、Apache設定ファイルの書式に誤りが無いかを確認します。

# apachectl configtest
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::4ad:7ff:fe6b:ba5. Set the 'ServerName' directive globally to suppress this message
Syntax OK   ( ←OKが表示されるのを確認する。)
#

Apacheの設定ファイルを反映させます。

# systemctl reload httpd

2-4. Subversion動作確認

2-4-1. データルートディレクトリ・Subversionリポジトリの作成

データルートディレクトリを作成します。ここでは「/data/svn」としています。

# mkdir -p /data/svn

以下コマンドで新規のSubversionリポジトリを作成します。(※リポジトリ名「repo01」) 作成したリポジトリのディレクトリ配下は、Apache HTTP Serverが参照・更新できるように所有ユーザー・グループを"apache"に変更します。

# cd /data/svn
# svnadmin create repo01
# chown -R apache:apache ./repo01

2-4-2. Redmineロールの作成

RedmineとSubversionを連携した場合、ユーザー認証とアクセス権をRedmineで管理する事になります。 ここではそのアクセス権を管理する様のRedmineロールを作成します。 以下の更新用と参照用のロールを作成します。それぞれ以下の権限を付与します。

  • SVN更新ロール
    • 更新履歴の閲覧
    • リポジトリの閲覧
    • コミット権限
    • リビジョンとチケットの関連の管理
  • SVN参照ロール
    • 更新履歴の閲覧
    • リポジトリの閲覧

2-4-3. Subversionリポジトリ用のRedmineプロジェクトの作成

RedmineとSubversionを連携した場合、SubversionのリポジトリをRedmineのプロジェクトとして管理します。 まず管理しやすいように、Subversionリポジトリプロジェクトを管理する親プロジェクトを作成します。

続いて、Subversionリポジトリを管理するプロジェクトを作成します。
設定すべき項目を以下に記載します。

No. 項目 設定値の説明
1 名称 Subversionリポジトリが分かる名称を付けます。
2 説明 任意の説明を付けます。私はSubversionのURLを記載しています。
3 識別子 SubversionリポジトリのIDを設定します。
4 公開 このチェックは外すことを推奨します。これをチェックすると誰でもこのリポジトリを参照だけはできる様になります。一方チェックを外すと権限を保持しているユーザーのみアクセスできる様になります。
5 親プロジェクト 前手順で作成した「Subversionリポジトリ」プロジェクトを設定します。
6 モジュール 必ず「リポジトリ」をチェックして下さい。(※1)

※1:「リポジトリ」モジュールのチェックについて
Redmine v3では、Subversionリポジトリを管理するプロジェクトで、「リポジトリ」モジュールをチェックしなくても問題ありませんでしたが、v5ではチェックが必須となったようです。
もしチェックを付けない場合は、TortoiseSVNなどでリポジトリにアクセスした際に、Apache HTTP Serverのエラーログに以下のメッセージが表示されます。
[Wed Apr 03 10:01:33.316197 2024] [authn_file:error] [pid 7062:tid 139733900404480] [client xx.x.xx.x:xxxxx] AH01619: AuthUserFile not specified in the configuration
私はここで非常に嵌りました。。。
このエラーメッセージ「AuthUserFile not specified in the configuration」で検索すると一番多かった解決策がhttpd.confに「AuthUserFile /dev/null」を追記するという対応。
私はこれでは全然解決せず途方に暮れました。。。
皆さん、気をつけて下さい!


親プロジェクトを設定していると、プロジェクト一覧で以下のように表示されて見やすくなります。

2-4-4. Subversionリポジトリ用プロジェクトのメンバー登録

先ほど作成したプロジェクトにメンバーを登録します。 ここでは、「adminユーザー」を「SVN更新ロール」権限で登録しています。

2-4-5. SubversionへRedmineユーザーでログイン

TortoiseSVNなどを利用して、以下URLへアクセスし、Redmineユーザー(※AD認証では無い)でログインできることを確認します。

3. Subversion/AD認証連携

3-1. 参考URL

Subversion/Redmine/ADの連携は、Git/Redmine/ADの連携と設定は非常に似ています。 そのため、以下サイトを参考にしました。

infra.blog.shinobi.jp

PerlのCPANを使用して「Authen::Simple::LDAP」モジュールをインストールする方法についてを参考にしています。

3-2. 前提ライブラリのインストール

3-2-1. CodeReady Linux Builder リポジトリーを有効化

前提ライブラリの幾つかは、CodeReady Linux Builder リポジトリーに含まれているため、まずはそれを有効化します。

# dnf config-manager --enable codeready-builder-for-rhel-8-rhui-rpms

以下のコマンドでCodeReady Linux Builder リポジトリーが有効になった事を確認します。

# dnf repolist
repo id                                   repo name
ansible-2-for-rhel-8-rhui-rpms            Red Hat Ansible Engine 2 for RHEL 8 (RPMs) from RHUI
codeready-builder-for-rhel-8-rhui-rpms    Red Hat CodeReady Linux Builder for RHEL 8 x86_64 (RPMs) from RHUI (←これが表示されていること)
epel                                      Extra Packages for Enterprise Linux 8 - x86_64
rhel-8-appstream-rhui-rpms                Red Hat Enterprise Linux 8 for x86_64 - AppStream from RHUI (RPMs)
rhel-8-baseos-rhui-rpms                   Red Hat Enterprise Linux 8 for x86_64 - BaseOS from RHUI (RPMs)
rhui-client-config-server-8               RHUI Client Configuration Server 8
#

3-2-2. 前提ライブラリのインストール

前提ライブラリは非常に多く、以下となります。

  • perl-LDAP
  • perl-Module-Runtime
  • perl-Test-Simple
  • perl-Params-Validate
  • perl-Module-Implementation
  • perl-Class-Accessor
  • perl-Class-Data-Inheritable
  • perl-Crypt-PasswdMD5
  • perl-Authen-Simple
  • perl-CPAN
  • perl-YAML

これらをdnfで一度に全てインストールします。

# dnf install perl-LDAP perl-Module-Runtime perl-Test-Simple perl-Params-Validate perl-Module-Implementation perl-Class-Accessor perl-Class-Data-Inheritable perl-Crypt-PasswdMD5 perl-Authen-Simple perl-CPAN perl-YAML

3-3. Authen::Simple::LDAPの導入

PerlのCPANを使用して「Authen::Simple::LDAP」モジュールをインストールします。

# perl -MCPAN -e shell

CPAN.pm requires configuration, but most of it can be done automatically.
If you answer 'no' below, you will enter an interactive dialog for each
configuration option instead.

Would you like to configure as much as possible automatically? [yes] yes  (←"yes"入力)

Perl site library directory "/usr/local/share/perl5" does not exist.
Perl site library directory "/usr/local/share/perl5" created.
Perl site library directory "/usr/local/lib64/perl5" does not exist.
Perl site library directory "/usr/local/lib64/perl5" created.

Autoconfiguration complete.

commit: wrote '/root/.cpan/CPAN/MyConfig.pm'

You can re-run configuration any time with 'o conf init' in the CPAN shell
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v2.18)
Enter 'h' for help.

cpan[1]> o conf prerequisites_policy follow  (←入力)
    prerequisites_policy [follow]
Please use 'o conf commit' to make the config permanent!


cpan[2]> o conf commit  (←入力)
commit: wrote '/root/.cpan/CPAN/MyConfig.pm'

cpan[3]> install Authen::Simple::LDAP  (←入力)
Fetching with LWP:
http://www.cpan.org/authors/01mailrc.txt.gz
Reading '/root/.cpan/sources/authors/01mailrc.txt.gz'
............................................................................DONE
Fetching with LWP:
http://www.cpan.org/modules/02packages.details.txt.gz
Reading '/root/.cpan/sources/modules/02packages.details.txt.gz'
  Database was generated on Wed, 03 Apr 2024 00:17:01 GMT
..............
  New CPAN.pm version (v2.36) available.
  [Currently running version is v2.18]
  You might want to try
    install CPAN
    reload cpan
  to both upgrade CPAN.pm and run the new version without leaving
  the current session.


..............................................................DONE
Fetching with LWP:
http://www.cpan.org/modules/03modlist.data.gz
Reading '/root/.cpan/sources/modules/03modlist.data.gz'
DONE
Writing /root/.cpan/Metadata
Running install for module 'Authen::Simple::LDAP'
Fetching with LWP:
http://www.cpan.org/authors/id/C/CH/CHANSEN/Authen-Simple-LDAP-0.3.tar.gz
Fetching with LWP:
http://www.cpan.org/authors/id/C/CH/CHANSEN/CHECKSUMS
Checksum for /root/.cpan/sources/authors/id/C/CH/CHANSEN/Authen-Simple-LDAP-0.3.tar.gz ok
Scanning cache /root/.cpan/build for sizes
DONE
Configuring C/CH/CHANSEN/Authen-Simple-LDAP-0.3.tar.gz with Makefile.PL
Cannot determine perl version info from lib/Authen/Simple/LDAP.pm
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for Authen::Simple::LDAP
Writing MYMETA.yml and MYMETA.json
  CHANSEN/Authen-Simple-LDAP-0.3.tar.gz
  /usr/bin/perl Makefile.PL -- OK
Running make for C/CH/CHANSEN/Authen-Simple-LDAP-0.3.tar.gz
cp lib/Authen/Simple/LDAP.pm blib/lib/Authen/Simple/LDAP.pm
cp lib/Authen/Simple/ActiveDirectory.pm blib/lib/Authen/Simple/ActiveDirectory.pm
Manifying 2 pod documents
  CHANSEN/Authen-Simple-LDAP-0.3.tar.gz
  /usr/bin/make -- OK
Running make test
PERL_DL_NONLAZY=1 "/usr/bin/perl" "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.t t/*/*.t
t/01use.t .. ok
All tests successful.
Files=1, Tests=2,  0 wallclock secs ( 0.02 usr  0.01 sys +  0.14 cusr  0.01 csys =  0.18 CPU)
Result: PASS
  CHANSEN/Authen-Simple-LDAP-0.3.tar.gz
  /usr/bin/make test -- OK
Running make install
Manifying 2 pod documents
Installing /usr/local/share/perl5/Authen/Simple/LDAP.pm
Installing /usr/local/share/perl5/Authen/Simple/ActiveDirectory.pm
Installing /usr/local/share/man/man3/Authen::Simple::ActiveDirectory.3pm
Installing /usr/local/share/man/man3/Authen::Simple::LDAP.3pm (←インストールされたことを確認)
Appending installation info to /usr/lib64/perl5/perllocal.pod
  CHANSEN/Authen-Simple-LDAP-0.3.tar.gz
  /usr/bin/make install  -- OK

cpan[4]> exit (←入力)
Terminal does not support GetHistory.
Lockfile removed.
#

3-4. Apache設定ファイル修正

「2-3. Apache設定ファイルの作成」で作成したApache設定ファイルに、AD認証用の設定を追記します。

  • /etc/httpd/conf.extra/httpd-svn.conf
# "conf.modules.d/00-dav.conf"でロード済み
#LoadModule dav_module       modules/mod_dav.so
#LoadModule dav_fs_module    modules/mod_dav_fs.so

# "conf.modules.d/10-subversion.conf"でロード済み
#LoadModule dav_svn_module   modules/mod_dav_svn.so
#LoadModule authz_svn_module modules/mod_authz_svn.so

# "conf.modules.d/02-perl.conf"でロード済み
#LoadModule perl_module      modules/mod_perl.so

# 転送モードをBulkに設定
SVNAllowBulkUpdates Prefer

PerlLoadModule Apache::Authn::Redmine

# AD認証用設定
PerlLoadModule Authen::Simple::LDAP   (←これを追記)

<Location /svn>
  Dav svn

  # SVN Data Root Directory
  SVNParentPath /data/svn

  AuthType Basic
  AuthName "Subversion"
  Require valid-user

  PerlAccessHandler Apache::Authn::Redmine::access_handler
  PerlAuthenHandler Apache::Authn::Redmine::authen_handler

  # for Redmine Authentication
  RedmineDSN "DBI:mysql:database=redmine;host=localhost;mysql_socket=/var/lib/mysql/mysql.sock"
  RedmineDbUser "redmine"
  RedmineDbPass "MariaDBのredmineユーザーパスワード"

</Location>

Apacheの設定ファイルを反映させます。

# systemctl reload httpd

4. SubversionコミットとRedmineチケットの連携

Subversionのコミットコメントに「refs #Redmineチケット番号」等と記載すると、コミットした情報がRedmineのチケットに反映させる事ができます。
ここで設定手順を記載します。

4-1. RedmineのSubversionリポジトリ用プロジェクトの設定

4-1-1. Redmineから参照用のSubversionユーザー作成

RedmineのプロジェクトがSubversionリポジトリを参照する際に用いるSubversionユーザーをRedmineに作成します。 ここでは「svn」というユーザーを作成しました。

4-1-2. svnユーザーにSubversionリポジトリへの権限を付与

次に先ほど作成した「svn」ユーザーに対して、Subversionリポジトリへの権限を付与します。 これは、RedmineのSubversionリポジトリ用プロジェクトのメンバーに「SVN更新ロール」で追加する操作となります。

4-2. Redmineプロジェクトの設定

次にSubversionのコミットコメントを紐付けたいRedmineプロジェクトに、Subversionリポジトリを紐付けます。

4-2-1. 「リポジトリ」モジュールを設定

プロジェクトのモジュール設定で「リポジトリ」をチェックします。

4-2-2. 「リポジトリ」設定

プロジェクト設定の「リポジトリ」タブにて、Subversionリポジトリを登録します。

プロジェクトの「リポジトリ」タブにて、Subversionの内容が参照できるようになっていれば設定は正しく行われています。

4-3. Subversionリポジトリの設定

4-3-1. リポジトリAPIキーの取得

Redmineの管理メニューの設定画面にて、「リポジトリ」タブを開きます。
その設定画面にて、「リポジトリ管理用のWebサービスを有効にする」をチェックし、 「キーの生成」をクリックして表示された「APIキー」をコピーしておきます。
その状態で「保存」ボタンをクリックします。

4-3-2. post-commitファイルの作成

blog.redmine.jp

上記のURLを参考にしています。 Subversionリポジトリのディレクトリ配下の「hooks」ディレクトリ配下に「post-commit」というファイルを作成します。 「2-4-1. データルートディレクトリ・Subversionリポジトリの作成」で作成したリポジトリの場合は以下のパスとなります。

  • /data/svn/repo01/hooks/post-commit

テンプレートファイルがそのディレクトリに保存されているのでそれをコピーして使用するのが良いと思います。

$ sudo cp -p /data/svn/repo01/hooks/post-commit.tmpl /data/svn/repo01/hooks/post-commit

テンプレートファイルは色々と説明が記載されていますが、以下にそのコメントを抜きにしたファイル内容を記載します。 このファイル内でwgetで指定したURLのパラメータのkey値として、前手順でコピーしたAPIキーを指定します。

#!/bin/sh
REPOS="$1"
REV="$2"
TXN_NAME="$3"

wget -q -O /dev/null http://localhost/redmine/sys/fetch_changesets?key=前手順でコピーしたAPIキー

4-4. 動作確認

Subversionのコミットコメントに、「refs #Redmineチケット番号」を記載してコミットします。 以下ではRedmineチケットの#1と紐付けています。

上記コミット後に、Redmineのチケット#1を確認すると、「関連しているリビジョン」として表示されます。

後書き

今回は以上となります。
最初にも書きましたが、RedmineとSubversionを連携して使っている人は2024年にどれくらいいるのでしょう? ネットを見ていると、バージョン管理システムはGitが主流のように見えます。 Redmineとバージョン管理システムを連携させる場合は、Gitlabとかと連携している人が大半なのでしょうか?

次回書こうとしているRedmineとGitの連携は、RHELサーバーに導入した素のGitとの連携となりますが、それだとPull Request機能が無いので、あまり使われていないのかもしれないなぁと思いつつ書こうと思っています。

最後まで読んで頂きありがとうございました。