このドキュメントでは、RHEL8環境に手動でRedmineをインストールする手順を記載します。
構築手順を1つの記事で全部書くと非常に長文になってしまいますので、以下の内容で記事を分割して記載しています。
■記事一覧
- 前提ソフトウェアのインストール(Apache、MariaDB、Ruby)
- Redmine環境の構築
- Subversion連携(※今回はここを書きます)
- Git連携
- 旧バージョンからのデータ移行
3回目の今回は、Subversion連携です。
Subversionの認証をRedmineユーザーを用いる設定を行います。
さらにAD認証RedmineユーザーでもSubversionにログインできる様に設定をします。
「今更Subversionですか?」と思われる方も多々いるかと思いますが、まだ使っている人もそれなりにいると信じて書いていきます。
「私まだSubversion使っていますよ~!」って人がいましたら、「いいね」や「コメント」を残してもらえると嬉しいです。
- 前提
- 1. Subversionのインストール
- 2. Redmine/Subversion認証連携
- 3. Subversion/AD認証連携
- 4. SubversionコミットとRedmineチケットの連携
- 後書き
前提
環境
全体のソフトウェア環境構成は以下となります。
- 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) |
もしチェックを付けない場合は、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の連携と設定は非常に似ています。 そのため、以下サイトを参考にしました。
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ファイルの作成
上記の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機能が無いので、あまり使われていないのかもしれないなぁと思いつつ書こうと思っています。
最後まで読んで頂きありがとうございました。