このドキュメントでは、RHEL8環境に手動でRedmineをインストールする手順を記載します。 構築手順を1つの記事で全部書くと非常に長文になってしまいますので、以下の内容で記事を分割して記載しています。
■記事一覧
- 前提ソフトウェアのインストール(Apache、MariaDB、Ruby)
- Redmine環境の構築
- Subversion連携
- Git連携(※今回はここを書きます)
- 旧バージョンからのデータ移行
4回目の今回は、Git連携です。
Gitの認証をRedmineユーザーを用いる設定を行います。
さらにAD認証RedmineユーザーでもGitにログインできる様に設定をします。
基本的な設定内容は、3回目のSubversion連携と重なる部分が多いので、同じ作業については「※Subversion連携と同じ手順なので、Subversion連携を設定した人は実施不要です。」と注釈を書いています。
また、RedmineとGitの連携は、私が初めて投稿した記事「Windows環境のBitnamiでRedmine/Git連携(統合認証)」のLinux版ということになります。
それと見比べると手順は殆ど同じですね。そういう意味では進歩が無い記事になってしまっていますがお許し下さい。
そこでも書きましたが、Redmineと素のGitの連携だと、Pull Request機能が無いので、どれくらいの人が使っているのか非常に気になるところです。
もし使っている/これから使うからこの記事を読んでいるという人がいましたら、「いいね」やコメントを残してもらえると嬉しいです。
前提
環境
全体のソフトウェア環境構成は以下となります。
- 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ユーザー
また、PowerShellの場合は以下のプロンプト記載としています。
- PS>
1. Gitのインストール
1-1. Gitのインストール
実はこの「RHEL8環境へのRedmine v5.0.5の手動インストール手順」を実施してきている人は既にGitがインストールされていると思います。 第1回の「前提ソフトウェアのインストール(Apache、MariaDB、Ruby)」でRuby環境構築時にgitコマンドを使っていますから。
もし万が一インストールされていない場合は、dnfでインストールして下さい。
$ sudo dnf install git
2. Redmine/Git認証連携
2-1. 前提ライブラリ導入
以下3つのモジュールを dnfでインストールします。
※Subversion連携と同じ手順なので、Subversion連携を設定した人は実施不要です。
- mod_perl.so
- mod_dav_svn.so
- perl-Digest-SHA
$ sudo dnf install mod_perl mod_dav_svn perl-Digest-SHA
2-2. Gitの認証ユーザーをRedmine認証ユーザーとするためのファイル配置
Gitの認証ユーザーをRedmine認証ユーザーとするためには、Redmineが用意をしてくれているPerlモジュールをPerlのライブラリディレクトリへ配置します。
※Subversion連携と同じ手順なので、Subversion連携を設定した人は実施不要です。
# 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でのGitへのアクセスについて、以下のApache設定ファイルに設定します。
- /etc/httpd/conf.extra/httpd-git.conf
※必要なモジュールの読み込みも記載しているが、デフォルトで読み込まれている物はコメント化しています。
※Gitデータルートディレクトリをここでは「/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 PerlLoadModule Apache::Authn::Redmine # Gitリポジトリ設定 SetEnv GIT_PROJECT_ROOT /data/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git /usr/libexec/git-core/git-http-backend <Location /git> Dav On AuthType Basic AuthName "Git" 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ユーザーパスワード" RedmineGitSmartHttp yes </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. Git動作確認
2-4-1. データルートディレクトリ・Gitリポジトリの作成
データルートディレクトリを作成します。ここでは「/data/git」としています。
# mkdir -p /data/git
以下コマンドで新規のGitリポジトリを作成します。(※リポジトリ名「testgit01」)
最近の風潮に倣って、最初のブランチ名を "master"ではなく"main"になる設定もしています(^^;)。
# cd /data/git # git config --global init.defaultBranch main (←最初のブランチ名を"master"→"main"へ変更) # git init --bare --shared testgit01 Initialized empty shared Git repository in /data/git/testgit01/ # cd ./testgit01 # git update-server-info
さらに以下のコマンドを実行し、Gitリポジトリに追加設定を行います。
# git config http.receivepack true (←Git Pushを許可する設定) # git config --system core.quotepath false (←日本語ファイル名を表示する設定)
作成したリポジトリのディレクトリ配下は、Apache HTTP Serverが参照・更新できるように所有ユーザー・グループを"apache"に変更します。
# chown -R apache:apache /data/git/testgit01
2-4-2. Redmineロールの作成
RedmineとGitを連携した場合、ユーザー認証とアクセス権をRedmineで管理する事になります。 ここではそのアクセス権を管理する様のRedmineロールを作成します。 以下の更新用と参照用のロールを作成します。それぞれ以下の権限を付与します。
- Git更新ロール
- 更新履歴の閲覧
- リポジトリの閲覧
- コミット権限
- リビジョンとチケットの関連の管理
- Git参照ロール
- 更新履歴の閲覧
- リポジトリの閲覧
2-4-3. Gitリポジトリ用のRedmineプロジェクトの作成
RedmineとGitを連携した場合、GitのリポジトリをRedmineのプロジェクトとして管理します。 まず管理しやすいように、Gitリポジトリプロジェクトを管理する親プロジェクトを作成します。
続いて、Gitリポジトリを管理するプロジェクトを作成します。
設定すべき項目を以下に記載します。
No. | 項目 | 設定値の説明 |
---|---|---|
1 | 名称 | Gitリポジトリが分かる名称を付けます。 |
2 | 説明 | 任意の説明を付けます。私はGitのURLを記載しています。 |
3 | 識別子 | GitリポジトリのIDを設定します。 |
4 | 公開 | このチェックは外すことを推奨します。これをチェックすると誰でもこのリポジトリを参照だけはできる様になります。一方チェックを外すと権限を保持しているユーザーのみアクセスできる様になります。 |
5 | 親プロジェクト | 前手順で作成した「Gitリポジトリ」プロジェクトを設定します。 |
6 | モジュール | 必ず「リポジトリ」をチェックして下さい。(※1) |
PS > git pull fatal: unable to access 'http://xxxxxxxx/git/testgit01/': The requested URL returned error: 500 PS >
[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皆さん、気をつけて下さい!
親プロジェクトを設定していると、プロジェクト一覧で以下のように表示されて見やすくなります。
2-4-4. Gitリポジトリ用プロジェクトのメンバー登録
先ほど作成したプロジェクトにメンバーを登録します。 ここでは、「adminユーザー」と「テストユーザー01」を「Git更新ロール」権限で登録しています。
2-4-5. GitへRedmineユーザーでログイン
Gitコマンドなどを利用して、以下URLへアクセスし、Redmineユーザー(※AD認証では無い)でログインできることを確認します。
PS > git clone http://xxxxxx/git/testgit01 Cloning into 'testgit01'... warning: You appear to have cloned an empty repository.
Windows環境で上記のコマンドでGitリポジトリをcloneすると、以下の認証画面が表示されます。
先ほどRedmine画面で、Gitリポジトリに権限を付与したユーザーでログインをして下さい。
※ここでは「admin」ユーザーでログインをしています。
するとCloneが成功します。
Cloneしたフォルダに適当なファイルを作成して、gitの"add"、"commit"、"push"ができることを確認します。
- cd .\testgit01
- git add *
- git commit -m "test commit"
- git push
PS > cd .\testgit01 PS > git add * PS > git commit -m "test commit" [main (root-commit) 79f07bc] test commit 1 file changed, 1 insertion(+) create mode 100644 "\346\226\260\343\201\227\343\201\204\343\203\206\343\202\255\343\202\271\343\203\210 \343\203\211\343\202\255\343\203\245\343\203\241\343\203\263\343\203\210.txt" PS > git push Enumerating objects: 3, done. Counting objects: 100% (3/3), done. Delta compression using up to 2 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 255 bytes | 127.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To http://10.1.120.181/git/testgit01 * [new branch] main -> main
3. Git/AD認証連携
3-1. 参考URL
以下サイトを参考にしました。
PerlのCPANを使用して「Authen::Simple::LDAP」モジュールをインストールする方法についてを参考にしています。
3-2. 前提ライブラリのインストール
※Subversion連携と同じ手順なので、Subversion連携を設定した人は実施不要です。
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の導入
※Subversion連携と同じ手順なので、Subversion連携を設定した人は実施不要です。
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-git.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 PerlLoadModule Apache::Authn::Redmine # AD認証用に追記 PerlLoadModule Authen::Simple::LDAP (←これを追記) # Gitリポジトリ設定 SetEnv GIT_PROJECT_ROOT /data/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git /usr/libexec/git-core/git-http-backend <Location /git> Dav On AuthType Basic AuthName "Git" 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ユーザーパスワード" RedmineGitSmartHttp yes </Location>
Apacheの設定ファイルを反映させます。
# systemctl reload httpd
4. GitコミットとRedmineチケットの連携
Gitのコミットコメントに「refs #Redmineチケット番号」等と記載すると、コミットした情報がRedmineのチケットに反映させる事ができます。
ここで設定手順を記載します。
4-1. Redmineプロジェクトの設定
Gitのコミットコメントを紐付けたいRedmineプロジェクトに、Gitリポジトリを紐付けます。
4-1-1. 「リポジトリ」モジュールを設定
プロジェクトのモジュール設定で「リポジトリ」をチェックします。
4-1-2. 「リポジトリ」設定
プロジェクト設定の「リポジトリ」タブにて、Gitリポジトリを登録します。
Subversionとの違いは、以下の2点です。
- 「リポジトリのパス」がHTTPではなく、サーバーローカルのパスになる。
- ログイン認証の情報が不要。
プロジェクトの「リポジトリ」タブにて、Gitの内容が参照できるようになっていれば設定は正しく行われています。
4-2. Gitリポジトリの設定
4-2-1. リポジトリAPIキーの取得
※Subversion連携と同じ手順なので、Subversion連携を設定した人は実施不要です。
Redmineの管理メニューの設定画面にて、「リポジトリ」タブを開きます。
その設定画面にて、「リポジトリ管理用のWebサービスを有効にする」をチェックし、
「キーの生成」をクリックして表示された「APIキー」をコピーしておきます。
その状態で「保存」ボタンをクリックします。
4-2-2. post-receiveファイルの作成
Gitリポジトリのディレクトリ配下の「hooks」ディレクトリ配下に「post-receive」というファイルを作成します。 「2-4-1. データルートディレクトリ・Gitリポジトリの作成」で作成したリポジトリの場合は以下のパスとなります。
- /data/git/testgit01/hooks/post-receive
#!/bin/sh wget -q -O /dev/null http://localhost/redmine/sys/fetch_changesets?key=前手順でコピーしたAPIキー
ファイルを作成した後、以下を実行して、ファイル所有者と実行権限を変更します。
# chown apache:apache /data/git/testgit01/hooks/post-receive # chmod 775 /data/git/testgit01/hooks/post-receive
4-3. 動作確認
Gitのコミットコメントに、「refs #Redmineチケット番号」を記載してコミットします。 以下ではRedmineチケットの#1と紐付けています。
- cd .\testgit01
- git add *
- git commit -m "refs #1 Redmineチケットとの紐付け "
- git push
上記コミット後に、Redmineのチケット#1を確認すると、「関連しているリビジョン」として表示されます。
後書き
今回は以上となります。
第3回のSubversion連携と大体同じ手順なので、一気に書いてしまいました。
私は2024年になっても実は仕事ではSubversionを主流で使っていて、Gitを使ったことがありません。。。
いつか使う日が来ると思い水面下で勉強していました。
今回のRedmine/Git連携の手順も、RedmineのバージョンアップのタイミングでSubversionからGitへの移行をしようか検討した際に確認していました。
しかし、SubversionからGitへの移行は利用者の初期学習コストが高く、面倒くさくて断念しました。。。
私自身は役に立っていませんが、本情報が役にたつ人がいましたら幸いです。
最後まで読んで頂きありがとうございました。