我想在本地测试服务器上设置自动部署脚本。
我在 ubuntu 桌面 11.04 上使用 gitolite。
我使用 apt-get install gitolite 安装 gitolite,因此它创建用户 gitolite 和组 gitolite。
现在我使用 apache 设置我的测试网络服务器,该服务器具有用户和组 ivan:ivan,
并在该用户名下执行 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 hooks 是由 gitolite 用户执行的,因此访问使用用户 ivan 的测试服务器存在权限问题。
我已经将 gitolite 添加到 ivan 组并使其组访问写入,但仍然无法运行。
我知道这是一个权限问题,但我不知道解决方案。
如果您有相同的经历或有任何提示,我将非常感激。
Thanks
Ivan
终于自己解决了,感谢VonC的指点。
我的解决方案可能不美观但有效。
以下是我的解决方案中有效的步骤:
我创建了一个裸存储库,它将与 Web 应用程序具有相同的用户权限。
-
在 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 ===='
在我的网络应用程序中,我将创建一个连接到该裸存储库的遥控器。
-
然后我在镜像裸存储库中创建一个接收后钩子,这将要求 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
不要忘记 chmod +x 来完成接收后的操作。
正如我之前所说,它可能不漂亮,但仍然有效,至少对于我目前的情况而言。我不只是从 gitolite 存储库中提取它的原因是因为用户文件权限。在 Ubuntu 中(从 apt-get 安装),gitolite 保存用户和组,gitolite:gitolite。我的 Web 应用程序位于我的主文件夹下(我使用的是 suPHP),其中包含用户和组 ivan:ivan。
因此,当我推送到 gitolite 存储库时,它将在 gitolite 用户下运行 bash 脚本,该用户无法访问我的主文件夹下的 .git 文件夹。
所以,是的,对于那些有更好解决方案的人,我渴望收到您的来信。
谢谢希望我的解决方案可以帮助其他人。
Ivan
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)