使用Gitolite自动部署PHP脚本

时间:2012-04-04 10:26:39

标签: git gitolite

我想在本地为我的测试服务器设置自动部署脚本 我在ubuntu桌面11.04上使用gitolite。 我使用apt-get install gitolite安装gitolite,因此创建用户gitolite和组gitolite 现在我使用apache设置我的测试网络服务器,其中包含用户和组ivan:ivan,
并在该用户名下进行git clone 所以所有文件和文件夹都有相同的文件所有者ivan:ivan。

我在/ var / lib / gitolite / repository / testrepo / hooks /下设置了post-receive钩子,并在里面设置了这个脚本:

#!/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的测试服务器存在权限问题。

我已经将iitite添加到ivan组并使其进行组访问写入,但仍然无法运行 我知道这是一个许可问题,但我不知道解决方案 如果您有相同的经验或得到任何提示,我会非常感激。

感谢
伊万

2 个答案:

答案 0 :(得分:3)

我终于得到了解决方案,感谢VonC的指示 我的解决方案可能不是美,但还有效。

以下是我的解决方案中的步骤:

  1. 我创建了一个裸存储库,它与Web应用程序具有相同的用户权限。

  2. 在Gitolite Repositories文件夹中(在Ubuntu:/ var / lib / gitolite / repositories中),我创建了一个post-receive钩子,它将镜像存储库我刚刚创建的裸仓库。代码是:

    #!/bin/bash
    echo '==== DO MIRROR ===='
    git push --mirror user@host:path/to/bare.git
    echo '==== DONE MIRROR ===='

  3. 在我的网络应用程序中,我将创建一个连接到该裸仓库的遥控器。

  4. 然后我在镜像裸仓库中创建一个post-receive钩子,它会要求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

  5. 不要忘记chmod + x进行后接收。

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

    是的,对于那些有更好解决方案的人,我很想听到你的意见 谢谢希望我的解决方案可以帮助他人 伊万

答案 1 :(得分:0)

经过长时间的谷歌搜索后,当发生任何推送时,我很沮丧地实施此自动拉取功能。但我自己的方式有3个简单的步骤。

  1. 添加状态变量/ var / lib / gitolite / stat / project

    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. 以root身份准备脚本权限

    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
    
  4. 这就是全部:)