项目

常规

个人资料

操作

如何配置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目录中创建publictmp目录。

请注意,在标准配置中,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.patchpatch Redmine.pm < the-patch-file.patch,如果仍然出错,请向#4905寻求建议)。

您可能仍然需要在此处编辑文件,因为当前版本的补丁仅适用于从http://git.myhost.com/git/myrepo提供的存储库,尽管上面的示例使用了http://git.myhost.com/myrepo这一步骤现在不再需要,补丁已更新,以考虑来自apache的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

Vladimir Skubriev更新近11年前 · 25次修订