如何配置Redmine以实现高级git集成¶
范围¶
安装在Centos 6.x上
本指南解释了如何通过git 1.6.6中引入的基于http的git-smart-http协议在Apache上提供服务git存储库。
git-smart-http与ssh或基于git的访问相比具有各种优势:您可以直接使用Redmine访问控制,无需额外的ssh密钥等,根据需要可以通过SSL进行安全加密,并且通常与ssh和git端口相比,在防火墙和https/https端口方面存在较少的问题。git-smart-http也没有其“哑”前驱的一些缺点,因为它不需要任何复杂的DAV设置。
本指南主要根据记忆编写,并在已经提供与redmine集成的svn存储库的设置上进行操作,因此我可能忘记了某些事情或者假设了一些东西。
这是一个维基页面,请随意纠正或补充任何您觉得遗漏的内容 :-) 您也可以给我留言。
将grack与redmine集成的另一个选项是修改过的grack+redmine插件或为redmine修改过的任何其他grack,尽管那些插件缺少文档,我也没有尝试过它们,所以我对它们的了解不多。
先决条件¶
- 带有mod_perl (访问控制)的Apache
- git(版本至少为1.6.6)
- 提供git-smart-http的方式
- 如果您想使用git-http-backend,则需要mod_cgi (或mod_cgid)
- 如果您想使用grack(基本上是围绕正确的git命令的rack包装器),则需要一个rack服务器或
git-webby(基于grack但用Sinatra编写的另一个实现)。
您应该已经有一个rack服务器来运行redmine,这也是为什么我选择grack作为后端,并在本教程中对其进行描述的原因。
虽然使用内置的git-http-backend应该相当简单(跳过grack安装部分,直接使用git-http-backend进行安装(可参考git-http-backend手册中的示例),完成后继续进行访问控制部分)。
安装Git¶
yum install git
安装grack¶
获取源码¶
从其github仓库获取grack,我将我的克隆到了/var/www/grack
目录下
cd /var/www
git clone http://github.com/schacon/grack.git
并创建一个用于存储库的目录
mkdir /opt/repositories
mkdir /opt/repositories/git
chown -R apache:apache /opt/repositories/git
配置¶
编辑config.ru
文件,并适配到您的本地配置。project_root
必须包含包含您的git存储库的目录路径,git_path
必须显然包含到git的路径,我的路径如下(在gentoo上)
vi /var/www/grack/config.ru
并编辑文件
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/lib')
use Rack::ShowExceptions
require 'grack'
require 'git_adapter'
config = {
:project_root => "/opt/repositories/git",
:git_path => '/usr/bin/git',
:upload_pack => true,
:receive_pack => true,
}
run GitHttp::App.new(config)
如果您使用的是grack的最新版本,那么这个config.ru文件可能可以直接使用
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/lib')
use Rack::ShowExceptions
require 'grack'
require 'git_adapter'
config = {
:project_root => "/opt/repositories/git",
:git_path => '/usr/bin/git',
:upload_pack => true,
:receive_pack => true,
:adapter => Grack::GitAdapter,
}
run Grack::App.new(config)
别忘了安装grack的依赖项
$ cd /var/www/grack
$ bundle install
与Apache集成¶
此时,您可以使用任何您喜欢的rack服务器,但访问控制机制Redmine.pm
是为Apache和mod_perl编写的,因此您至少需要通过Apache反向代理您的rack服务器。
我选择的是passenger(性能稳定,Apache模块,配置相对简单)并且它已经配置在我的系统上了。
由于passenger的安装和配置不在本指南的范围内,请参考passenger文档或您发行版中的passenger安装指南。
为了使passenger与这个系统兼容,还需要做一些额外的工作,您需要在grack目录中创建public
和tmp
目录。
请注意,在标准配置中,passenger将以与拥有config.ru
文件的相同用户和组运行grack应用程序。此用户必须能够读取和写入所需的git存储库!
为Apache在/var/www/grack中创建'public'和'tmp'目录
cd /var/www/grack
mkdir public
mkdir tmp
chown -R apache:apache /var/www/grack
编辑配置文件"/etc/httpd/conf/httpd.conf",取消注释以支持多虚拟主机
NameVirtualHost *:80
创建一个包含以下文本的虚拟主机文件
vi /etc/httpd/conf.d/git.conf
(文本内容省略)
<VirtualHost *:80>
ServerName git.yourdomain.com
DocumentRoot "/var/www/grack/public"
<Directory "/var/www/grack/public">
Options None
AllowOverride None
<IfVersion < 2.3 >
Order allow,deny
Allow from all
</IfVersion>
<IfVersion >= 2.3>
Require all granted
</IfVersion>
</Directory>
</VirtualHost>
在控制面板DNS记录的域名页面,创建一个名为"git.yourdomain.com"的子域,并将其指向您的IP服务器。
到此为止,如果您的存储库在"/opt/repositories/git/myrepo"中,您应该可以通过"http://git.yourdomain.com/myrepo"来访问它,例如
使用Gitbash或TortoiseGit等git客户端克隆存储库
git clone http://git.yourdomain.com/myrepo
如果成功,则服务器上的git和连接非常好!
访问控制¶
您现在有一个正在运行的git服务器,尽管没有访问控制。目前,包含在redmine目录extra/svn/
中的用于访问控制的perl模块Redmine.pm
不支持git-smart-http协议的访问控制,编号为<4905>的补丁旨在实现这一点。
应用补丁¶
如果您使用的是Redmine >= 2.1.0,请跳转到配置Apache。
从#4905下载最新版本(或者更好:正确的)补丁到您的redmine目录。在redmine目录中,应用补丁:patch -p1 < the-patch-file.patch
应该可以工作(如果提示您无法应用代码块,说明补丁与您的Redmine.pm
版本不兼容,如果显示其他内容,请尝试patch -p0 < the-patch-file.patch
或patch Redmine.pm < the-patch-file.patch
,如果仍然出错,请向#4905寻求建议)。
您可能仍然需要在此处编辑文件,因为当前版本的补丁仅适用于从这一步骤现在不再需要,补丁已更新,以考虑来自apache的http://git.myhost.com/git/myrepo
提供的存储库,尽管上面的示例使用了http://git.myhost.com/myrepo
。Location
块的信息。
配置Apache¶
您现在必须让Apache知道您的新认证模块(如果您已经为subversion集成执行了此步骤,您可以直接转到Location
指令)。
将Redmine.pm
(从您的extra/svn/
目录)复制或链接到/usr/lib/perl5/Apache/Redmine.pm
(ubuntu)或您的发行版放置其apache perl模块的地方(例如,gentoo将它们放在/usr/lib64/perl5/vendor_perl/5.8.8/Apache/
,fedora将它们放在/usr/lib64/perl5/vendor_perl/Apache/
)。
完成此操作后,重新加载apache以确保补丁阶段一切顺利(如果不顺利,请删除或重启apache,尝试在Redmine.pm文件中查找错误)。现在编辑您的虚拟主机配置,使其类似于(与上面相同,但包含更多内容)
vi /etc/httpd/conf.d/git.conf
with
<VirtualHost *:80>
ServerName git.yourdomain.com
DocumentRoot "/var/www/grack/public"
<Directory "/var/www/grack/public">
Options None
AllowOverride None
<IfVersion < 2.3 >
Order allow,deny
Allow from all
</IfVersion>
<IfVersion >= 2.3>
Require all granted
</IfVersion>
</Directory>
PerlLoadModule Apache::Redmine
<Directory "/var/www/grack/public">
Options None
AllowOverride None
<IfVersion < 2.3 >
Order allow,deny
Allow from all
</IfVersion>
<IfVersion >= 2.3>
Require all granted
</IfVersion>
</Directory>
<Location "/">
AuthType Basic
AuthName "Redmine git repositories"
Require valid-user
PerlAccessHandler Apache::Authn::Redmine::access_handler
PerlAuthenHandler Apache::Authn::Redmine::authen_handler
RedmineDSN "DBI:mysql:database=your_database;host=localhost:3306"
RedmineDbUser "user_database"
RedmineDbPass "password_database"
RedmineGitSmartHttp yes
</Location>
</VirtualHost>
重启您的apache,一切应该都很正常 :-)
已知问题¶
如果您直接在apache下使用stock git-http-backend,并且您在apache错误日志中找到类似“请求不受支持:'/git/your-git-repo'”的错误,您可能需要将“SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER”添加到您在apache配置中设置的列表中的环境变量。
不幸的是,此设置可能导致redmine出错。如果是这样,您将需要只为通过git-http-backend传递的请求设置变量。一种实现方式是使用mod_rewrite。以下是从使用git-http-backend和mod_rewrite的Fedora 17系统获取的示例apache配置。
在httpd.conf中
Listen xxx.xxx.xxx.xxx:80
<VirtualHost xxx.xxx.xxx.xxx:80>
DocumentRoot /var/www/redmine/public
ServerName servername.domain:80
Include conf/servername.conf
</VirtualHost>
Listen xxx.xxx.xxx.xxx:443
<VirtualHost xxx.xxx.xxx.xxx:443>
DocumentRoot /var/www/redmine/public
ServerName servername.domain:443
Include conf/servername.conf
Include conf/ssl.conf
</VirtualHost>
在servername.conf中
PerlLoadModule Apache::Authn::Redmine
SetEnv GIT_PROJECT_ROOT /git-1/repositories
SetEnv GIT_HTTP_EXPORT_ALL
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} ^off$
RewriteCond %{REQUEST_URI} !^/git-private/
RewriteRule ^.*$ https://servername.domain$0 [R=301,L]
RewriteRule ^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$ /git-1/repositories/$1 [L]
RewriteRule ^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /git-1/repositories/$1 [L]
RewriteRule ^/git/(.*)$ /usr/libexec/git-core/git-http-backend/$1 [E=REMOTE_USER:$REDIRECT_REMOTE_USER,H=cgi-script,L]
</IfModule>
<Directory /usr/libexec/git-core>
<Files "git-http-backend">
Options +ExecCGI
</Files>
</Directory>
<Location /git>
AuthType Basic
AuthName "CAMPUS"
AuthBasicProvider external
AuthExternal pwauth
Require valid-user
PerlAccessHandler Apache::Authn::Redmine::access_handler
PerlAuthenHandler Apache::Authn::Redmine::authen_handler
RedmineDSN "DBI:mysql:database=redmine;host=localhost"
RedmineDbUser "redmine"
# RedmineDbPass "password"
RedmineGitSmartHttp yes
</Location>
Alias /git-private /git-1/repositories
<Location /git-private>
Order deny,allow
Deny from all
<Limit GET PROPFIND OPTIONS REPORT>
Options Indexes FollowSymLinks MultiViews
Allow from 127.0.0.1
Allow from localhost
</Limit>
</Location>
<Directory "/var/www/redmine/public">
RailsEnv production
RailsBaseURI /
Options -MultiViews
AllowOverride All
</Directory>
在conf/ssl.conf中
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite RC4-SHA:AES128-SHA:ALL:!ADH:!EXP:!LOW:!MD5:!SSLV2:!NULL
SSLCertificateFile /etc/pki/tls/certs/your-server.crt
SSLCertificateKeyFile /etc/pki/tls/private/your-server.key
SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
在conf.d/ssl.conf中
LoadModule ssl_module modules/mod_ssl.so
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
您还需要安装perl模块Net::LDAP、Authen::Simple和Authen::Simple::LDAP。前两个在Fedora的默认软件仓库中可用。
第三个必须在安装其他两个之后安装,并且必须直接从cpan获取。以下是我在Fedora 17上安装这些包时使用的命令。
yum -y install gcc make perl-LDAP perl-Authen-Simple
cpan
cpan> install Authen::Simple::LDAP