2012-04-04 108 views
2

我想在我的测试服务器本地设置自动部署脚本。
我在Ubuntu桌面11.04上使用gitolite。 我使用apt-get安装gitolite来安装gitolite,所以它是创建用户gitolite和组gitolite。
现在我安装我的测试网络服务器使用Apache的用户和组ivan:ivan,
并在该用户名下做git克隆。
所以所有的文件和文件夹都有相同的文件拥有者ivan:ivan。使用Gitolite自动部署PHP脚本

我安装后收到在/ var/lib中/ gitolite /库/ testrepo /钩/和有此脚本里面钩:

#!/bin/bash 
#CONFIG 
LIVE="/home/ivan/public_html/testrepo" 

read oldrev newrev refname 
if [ $refname = "refs/heads/master" ]; then 
    echo "===== DEPLOYING TO TEST SITE =====" 
    unset GIT_DIR 
    cd $LIVE 
    git pull origin master: 
    echo "===== DONE =====" 
fi 

由于后收到钩由gitolite用户执行的,它有访问正在使用用户ivan的测试服务器的权限问题。

我已将gitolite添加到ivan组,并使其成组访问写入,但仍无法运行。
我知道这是一个权限问题,但我不知道解决方案。
如果你有相同的经验或有任何提示,我会很感激。

感谢
伊万

+0

什么是你已经为你的gitolite回购设置的umask?见http://stackoverflow.com/questions/7086325/setting-umask-in-git-gitolite/7103499#7103499,http://stackoverflow.com/questions/9915482/gitolite-and-file-permissions/9915919#9915919 ,和http://stackoverflow.com/questions/5455070/permission-problems-with-git-sharedrepository/5455127#5455127 – VonC 2012-04-04 14:50:22

+0

嗨VonC,我相信我仍然使用默认gitolite umask。但我认为这并不重要。在我的脚本中,由用户ivan自己的仓库中的gitolite用户执行。所以当它拉动时,由于许可问题,gitolite不能访问git ref头。有没有解决方法?谢谢。 – Ivan 2012-04-05 05:00:21

+0

尝试修改由Gitolite配置的umask无论如何,只是为了检查是否改变任何东西。 – VonC 2012-04-05 05:34:48

回答

3

我终于得到了解决我自己,感谢VonC的指针。
我的解决方案可能并不美观,但仍然有效。

因此,这里是我的解决方案的工作步骤:

  1. 我创建了一个光秃秃的仓库,将与Web应用程序相同的用户权限。 (在Ubuntu:/ var/lib/gitolite/repositories中),我创建了一个post-receive钩子,它将镜像我刚刚创建的裸回购库。代码是:

    #!/bin/bash
    echo '==== DO MIRROR ===='
    git push --mirror [email protected]:path/to/bare.git
    echo '==== DONE MIRROR ===='

  2. 而在我的web应用程序,我将创建一个连接到裸露的回购协议的远程。

  3. 然后,我在镜像的裸回购中创建一个后接收挂钩,它会要求Web应用程序从中取出。代码:

    #!/bin/bash
    WORK_DIR="/home/ivan/public_html/test/testing"
    read oldrev newrev refname
    if [ $refname = "refs/heads/master" ]; then
    echo "===== DEPLOYING TO LIVE SITE ====="
    unset GIT_DIR
    cd $WORK_DIR
    git pull mirror-repo master
    echo "===== DONE ====="
    fi

  4. 不要忘记使用chmod + x对于双方 - 接收后。

正如我之前所说,它可能并不漂亮,但仍然有效,至少对于我目前的情况来说。我之所以不把它从gitolite存储库中提取,是因为用户文件的权限。在Ubuntu中(从apt-get安装),gitolite持有用户和组,gitolite:gitolite。和我的Web应用程序在我的家庭文件夹(我使用suPHP)下有用户和组ivan:ivan。 因此,当我推送到gitolite存储库时,它将运行gitolite用户下的bash脚本,该用户无法访问我的主文件夹下的.git文件夹。

所以是的,对于那些有更好的解决方案,我渴望听到你的消息。
谢谢,希望我的解决方案可以帮助他人。
Ivan

+0

优秀的反馈,谢谢! +1 – VonC 2012-04-09 11:41:51

0

经过漫长的谷歌搜索,我沮丧地实现这种自动拉功能,当任何推动发生。但我自己的方式只需3个简单的步骤。

  1. 添加一个状态变量在/ var/lib中/ gitolite/STAT /项目

    vim /var/lib/gitolite/repositories/project.git/hooks/post-receive 
    #!/bin/bash 
    echo '==== DO MIRROR ====' 
    echo '1'>/var/lib/gitolite/stat/project 
    echo '==== DONE MIRROR ====' 
    
  2. 由根编写一个脚本特权

    vim /var/lib/gitolite/stat/autopull.sh 
    #!/bin/bash 
    hstat=`cat /var/lib/gitolite/stat/project 
    enter code here 
    if [ "$hstat" == 1 ]; then 
    cd /home/suphpuser/public_html_staging/project 
    git pull 
    chown -R suphpuser.suphpuser /home/suphpuser/public_html_staging/project 
    echo '0'>/var/lib/gitolite/stat/project 
    fi 
    
  3. 运行脚本

    /var/lib/gitolite/stat/autopull.sh 
    

这就是全部:)