本篇文章是依據 在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