Bitnami Redmine StackでリポジトリとしてGitを公開する

上司が構築したRedmineと、Gitを連携させたいと曰った。Gitにプッシュした内容とかをRedmineのチケットで管理したいそうな。
日頃はGitLabを使っている自分としては、そうすることの意義に懐疑的だったけど、実際のところはどうなのかを確認するために、まずは構築してみた。

## Bitnami Redmine Stackのインストール 
自分は今まで、Redmineのインストールは[こちら](http://redmine.jp/install/)の記事しか知りませんでした。が、上司の環境で使われてたBitnami Redmine Stackの存在を初めて知ったので、インストール作業から試してみました。

* インストール先の環境はCentOS 7.7。

まずはBitnamiのサイトからインストーラをダウンロードし、インストーラを実行します。

```
# curl -L -O https://bitnami.com/redirect/to/856133/bitnami-redmine-4.1.0-0-linux-x64-installer.run
# chmod +x bitnami-redmine-4.1.0-0-linux-x64-installer.run
# yum install -y perl perl-Data-Dumper
# ./bitnami-redmine-4.1.0-0-linux-x64-installer.run

Language Selection
Please select the installation language
 :
[3] Japanese - 日本語
 :
Please choose an option [1] : 3
----------------------------------------------------------------------------
ようこそ Bitnami Redmine Stack セットアップウィザードへ。
----------------------------------------------------------------------------
インストールするコンポーネントを選択してください。インストールしないコンポーネントの選択を外してください。準備ができたら“次へ“をクリックしてください。
Subversion [Y/n] :n
PhpMyAdmin [Y/n] :n
Redmine : Y (Cannot be edited)
Git [Y/n] :Y
上記選択部分が正しいことを確認してください。 [Y/n]: 
----------------------------------------------------------------------------
Installation folder
Bitnami Redmine Stack をインストールするフォルダを選択してください。
フォルダを選択 [/opt/redmine-4.1.0-0]: 
----------------------------------------------------------------------------
管理者アカウントの作成
Bitnami Redmine Stack の管理者アカウントを作成します。
表示用氏名 [User Name]: root
Email アドレス [user@example.com]: root@example.com
ログイン名 [user]: root
パスワード :
確認のためにパスワードをもう一度入れてください :
----------------------------------------------------------------------------
データベースに保管する際の既定の言語
データベース設定の規定値として使用する言語を選択してください:
 :
[14] 日本語
 :
オプションを選択してください [14] : 14
Do you want to configure mail support? [y/N]: N
----------------------------------------------------------------------------
お使いのコンピュータに Bitnami Redmine Stack をインストールする準備が整いました。
続けますか？ [Y/n]: 
----------------------------------------------------------------------------
しばらくお待ちください。 Bitnami Redmine Stack をお使いのコンピュータにインストール中です。
 インストール中
 0% ______________ 50% ______________ 100%
 #########################################
----------------------------------------------------------------------------
セットアップウィザードによる Bitnami Redmine Stack のインストールが完了しました。
Redmine アプリケーション起動 [Y/n]: Y
情報: Bitnami Redmine Stack については、ブラウザで 
http://127.0.0.1:80 にアクセスしてください。
続けるには [Enter] キーを押してください ：
``` 

ブラウザでアクセスすると画面が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/abf78cb7-99f5-1d5c-4d7a-32d9ba8cbbb1.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/111731f8-565d-4ee8-c57d-9ea897311ca3.png)

Redmineの構築が、めちゃめちゃ簡単ですね。

なお手動でRedmineの起動を行う場合は、インストールフォルダ直下にあるctlscript.shを使います。

```shell-session
# ./ctlscript.sh status
apache not running
mysql not running
# ./ctlscript.sh start
/opt/redmine-4.1.0-0/mysql/scripts/ctl.sh : mysql  started at port 3306
WARNING: PassengerPreStart cannot occur within <VirtualHost> section
WARNING: PassengerPreStart cannot occur within <VirtualHost> section
Syntax OK
WARNING: PassengerPreStart cannot occur within <VirtualHost> section
WARNING: PassengerPreStart cannot occur within <VirtualHost> section
/opt/redmine-4.1.0-0/apache2/scripts/ctl.sh : httpd started at port 80
```
なんか警告がでてます。。。
ググった範囲だと/apache2/conf/bitnami/bitnami.confの<VirtualHost>タグ内で、Includeを辿った先にPassengerPreStartが記述されていることが原因のようです。
ただ、PassengerPreStartは、Apacheの起動と一緒にアプリケーション(この場合はRedmine)を起動させることで初回アクセス時の遅さを回避する機能で、今回の目的とは関係なさそうなので放置しました。


## Apache HTTP ServerでGitリポジトリを公開する 
Gitリポジトリへのアクセスにssh接続させるのは抵抗感があったので、Apache HTTP Server経由でアクセスできることを目指します。
* 手順は「[CentOS 7.1にgitサーバーをapacheで立ててRedmine認証しようとして嵌ったこと](https://torutk.hatenablog.jp/entry/20151122/p1)」を参考にさせてもらいました。

### Gitリポジトリの作成
Redmineと連携させるには手動でGitリポジトリを作らないといけません。

* あたり前だけど、GitLabとかなら不要なのに。。。ブツブツ。。。

```shell-session
# /opt/redmine-4.1.0-0/git/bin/git init --bare /opt/gitrepo/sample.git
# chown -R daemon:daemon /opt/gitrepo
```
ここではGitプロジェクトのルートを/opt/gitrepoにして、その配下にbereリポジトリを作成しました。
そしてGitプロジェクトルート配下にApache HTTP Serverプロセスがアクセスできるようにします。

なお、.gitを除くGitプロジェクト名は、Redmineプロジェクトの識別子と合わせておく必要がありました。

### Apache HTTP Serverの停止

```shell-session
# cd /opt/redmine-4.1.0-0/apache2
# ./ctlscript.sh stop apache
```

### Perl用のMySQLドライバのインストール

```shell-session
# yum install -y perl-DBI perl-DBD-MySQL
# vi scripts/setenv.sh
:
##### PERL ENV #####
PERL5LIB="......:/usr/lib64/perl5/vendor_perl" ←追記
:
```
本当はインストールフォルダ直下にあるperlフォルダ配下にインストールするのがキレイだと思うのですが、その方法が判りませんでした。(perl -MCPAN -e shellでインストールするという方法を試しましたが上手く行かず、、、)
なのでyumでインストールして、それをパスを追加しました。

### Redmineのアカウントで認証を行うPerlモジュールをApacheから呼び出せるようにする

```shell-session
# mkdir -p apache2/Apache/Authn
# ln -s /opt/redmine-4.1.0-0/apps/redmine/htdocs/extra/svn/Redmine.pm apache2/Apache/Authn/Redmine.pm
```

### Apache HTTP Serverの設定を行う
Git関連の設定を一元管理する設定ファイルを作成します。

```conf:apache2/conf/git.conf
LoadModule perl_module modules/mod_perl.so
PerlLoadModule Apache::Authn::Redmine

SetEnv GIT_PROJECT_ROOT /opt/gitrepo
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER $REDIRECT_REMOTE_USER

ScriptAlias /git/ /opt/redmine-4.1.0-0/git/libexec/git-core/git-http-backend/

<LocationMatch "^/git/">
  PerlAccessHandler Apache::Authn::Redmine::access_handler
  PerlAuthenHandler Apache::Authn::Redmine::authen_handler
  AuthType Basic
  AuthName "Git Redmine"
  AuthUserFile /dev/null

  # for Redmine Authentication
  RedmineDSN "DBI:mysql:database=bitnami_redmine;host=localhost;mysql_socket=/opt/redmine-4.1.0-0/mysql/tmp/mysql.sock"
  RedmineDbUser "bitnami"
  RedmineDbPass "パスワード"
  RedmineGitSmartHttp yes

  Require valid-user
</LocationMatch>
```
GIT_PROJECT_ROOTはGitプロジェクトルートを指定します。
RedmineDSN, RedmineDbUser, RedmineDbPassなどはapps/redmine/htdocs/config/database.ymlのproductionの設定を参考に設定します。


```conf:apache2/conf/http.conf
#LoadModule cgid_module modules/mod_cgid.so
↓ コメントを外す
LoadModule cgid_module modules/mod_cgid.so

Include conf/git.conf ← 末尾に追加
```
git-http-backendを呼び出せるようにmod_cgid.soのコメントを外します。
そして、上記で作成した設定ファイルをインクルードします。

### Apache HTTP Serverの起動

```shell-session
# ./ctlscript.sh start apache
```

### RedmineプロジェクトにGitリポジトリを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/2d2e5221-25bf-c339-291d-78ab46352a4a.png)

ちなみに、この設定をしなくても、git pushとかできます。あくまでRedmineの画面でリポジトリを閲覧するための設定のようです。


### Pushする

```shell-session
# git remote add origin http://${Redmineサーバ}/git/sample.git
# git push -u origin master
```

## 感想
Remine自体の構築が簡単にできるのは感動でした。

しかし、Gitとの連携は、やはりイマイチな感じです。Redmineのプロジェクト識別子と、Gitプロジェクト名を合わせるあたりは、MySQLでSQLログを吐き出させて判りました。

* ちなみにSQLログを吐き出させるのはmysql/scripts/ctl.shで、MYSQL_START環境変数に```--general-log=1 --general_log_file=/opt/redmine-4.1.0-0/mysql/data/general.log```を追記することでできました。

そうなるとRedmineプロジェクト1つに、Gitプロジェクトが1つしか作れないことになります。サブプロジェクトとか作ればよいので大したデメリットでもありませんが、、、

チケットの連携という意味では、他の記事で見た、Apache HTTP Server + Redmineの環境で直接Gitを公開するのではなく、GitLabからCloneしてくる方法が良さげです。