2

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

我在 /var/lib/gitolite/repository/testrepo/hooks/ 下设置了接收后挂钩,并在里面有这个脚本:

#!/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  

由于 post-receive 钩子是由 gitolite 用户执行的,因此访问使用用户 ivan 的测试服务器存在权限问题。

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

谢谢伊万
_

4

2 回答 2

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. 在我的 Web 应用程序中,我将创建一个远程连接到该裸仓库。

  4. 然后我在镜像的裸仓库中创建一个接收后挂钩,它将要求 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 后接收。

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

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

于 2012-04-09T04:31:11.077 回答
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
    

就这样 :)

于 2013-09-10T16:05:38.090 回答