八月 07

本篇文章是依據 在Microsoft Azure中,手動安裝Redmine for Ubuntu Linux 實作完成後的續集。

會想把Redmine與Git整合起來,是因為這樣子對於專案進度與程式碼管控會比較方便。
不然分2邊寫,實在是很困擾,工程師就是不太喜歡這種事。
而因為工作性質的關係,專案也不能放上GitHub,所以就只能自己架設跟整合了。

當Redmine跟Git整合後,隨之而來的就是帳號驗證的問題,
一般有以下幾種方式:
1.完全不驗證,這也太不安全了。
2.使用htpasswd檔案來驗證。缺點是每個人都要再額外開立帳號,如果要改密碼的話會很麻煩。
3.結合LDAP來驗證。目前公司沒有LDAP,所以不討論。
4.使用SSH來存取git。缺點是每個人都要在ubuntu中開立系統帳號,並設定權限,也是很麻煩吶。
5.結合redmine中的帳號密碼來驗證。就是本文使用的方式。

這過程也踢了好幾次鐵板,為了避免自己忘記,也順便造福網友,故有此文章的產生。

話不多說了,直接進入主題吧。

 

先安裝必要的元件

sudo apt-get install libapache-dbi-perl libapache2-mod-perl2 git git-core
sudo apt-get install libapache2-reload-perl libapache2-mod-auth-mysql

啟用等一下Apache會使用到的組件

sudo a2enmod auth_mysql
sudo a2enmod dav_fs

建立等一下會使用到的git repository資料夾

sudo mkdir /var/git_repository
sudo mkdir /var/git_repository/test
cd /var/git_repository/test
sudo git init --bare

修正git repository資料夾的權限

sudo chown -R www-data:www-data /var/git_repository/

安裝grack,之後把git掛到apache上會用到。

cd ~
git clone http://github.com/schacon/grack.git

設定grack

sudo vi ~/grack/config.ru

********修改你的 :project_root  為你放置 git repository 的位置 ********
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + ‘/lib’)

use Rack::ShowExceptions

require ‘grack’
require ‘git_adapter’

config = {
:project_root => “/var/git_repository“,
:adapter => Grack::GitAdapter,
:git_path => ‘/usr/bin/git’,
:upload_pack => true,
:receive_pack => true,
}

run Grack::App.new(config)
*************************

 

安裝grack相關的元件

cd ~/grack/
sudo bundle install

建立相關資料夾及修改權限,並設定連結到apache的目錄中

mkdir ~/grack/public
mkdir ~/grack/tmp
sudo chown -R www-data:www-data ~/grack
sudo ln -s ~/grack/public /var/www/git

修改apache的git設定檔

sudo vi /etc/apache2/sites-available/redmine.conf

把以下設定檔加上 redmine.conf 裡面

#Git + Grack Config--Start
<Directory /var/www/git>
            RailsBaseURI /git
            PassengerResolveSymlinksInDocumentRoot on
</Directory>

PerlLoadModule Apache::Redmine
<Directory "/var/www/git">
    Options None
    AllowOverride None
    <IfVersion < 2.3 >
    Order allow,deny
    Allow from all
    </IfVersion>
    <IfVersion >= 2.3>
    Require all granted
    </IfVersion>
</Directory>

<Location "/git">
    Order allow,deny
    Allow from all

    AuthType Basic
    AuthName "Git repositories"
    Require valid-user
    PerlAccessHandler Apache::Authn::Redmine::access_handler
    PerlAuthenHandler Apache::Authn::Redmine::authen_handler

    ## for mysql
    RedmineDSN "DBI:mysql:database=redmine;host=localhost"
    RedmineDbUser "redmine"
    RedmineDbPass "your password"

</Location>
#Git + Grack Config--End

Copy Redmine.pm 模組到Apache的模組資料夾中

sudo cp ~/redmineSVN/redmine2.5/extra/svn/Redmine.pm /usr/lib/perl5/Apache

調整Redmine.pm

sudo vi /usr/lib/perl5/Apache/Redmine.pm

***********找到下面的字串,修改前
sub RedmineDSN {
my ($self, $parms, $arg) = @_;
$self->{RedmineDSN} = $arg;
my $query = “SELECT
users.hashed_password, users.salt, users.auth_source_id, roles.permissions, projects.status
FROM projects, users, roles
WHERE
users.login=?
AND projects.identifier=?
AND users.status=1
..
..
..
***********修改後
sub RedmineDSN {
my ($self, $parms, $arg) = @_;
$self->{RedmineDSN} = $arg;
my $query = “SELECT
users.hashed_password, users.salt, users.auth_source_id, roles.permissions, projects.status
FROM projects, users, roles
WHERE
users.login=?
OR projects.identifier=?
AND users.status=1
..
..
..
**************

這邊這個鐵板,讓我的腳踢的又紅又腫,腳都快斷了。
因為驗證模組會多丟一組projects.identifier去跟redmine的資料庫進行比對驗證。
所以說,如果你redmine中專案的唯一編碼與git專案資料夾名稱不一樣的話,就會發生驗證不過。
解法就是在驗證時,排除projects.identifier。

這個問題足足花了我一整天的時間,最後才找到問題的根源。

 

最後就是把apache重新啟動了

sudo service apache2 restart

接下來,你就可以進行測試了,輸入你redmine中的帳號與密碼進行驗證。
成功的話,應該就會顯示目前該專案的相關資訊。

git ls-remote http://localhost/git/test

參考資料:
HowTo-Redmine 整合 Git/GitHub

HowTo configure Redmine for advanced git integration

將 Redmine 安裝於 Debian、Ubuntu Linux

Redmine issues 與 Git commits 整合

留下評論