git - 如何使用 git 部署 web 应用程序,而不必在每次部署时都更改应用程序目录?
问题描述
什么是使用 git 进行部署的好方法,现在每次部署时都必须将整个应用程序目录“chown -R”给 www 用户?
基本上我想使用发布接收挂钩进行部署。目前我有一个接收后挂钩,看起来像这样:
#!/bin/sh
git --work-tree=/home/www/my-web-app --git-dir=/home/john/repo/my-web-app.git checkout -f
sudo chown -R www:www /home/www/my-web-app
sudo /home/john/scripts/reload-my-web-app.sh
它可以工作,但问题是 chown 步骤很慢,因为 my-web-app 文件夹中有数百万个文件。
我想我可以使用 git 作为用户 www 来解决这个问题,这样签出的文件就已经有了正确的所有者。所以我将 post-receive 钩子中的 git 行更改为:
sudo -u www git --work-tree=/home/www/my-web-app --git-dir=/home/john/repo/my-web-app.git checkout -f
但这不起作用,因为我收到关于无法在 git repo 中写入 index.lock 文件的权限错误。显然,用户 www 没有在 git repo 中写入的权限,我不想给 www 这个权限,因为这似乎不利于服务器安全。
那么,在这种情况下,什么是优雅的解决方案?您是否会签出到临时目录,然后从临时目录 rsync 到 /home/www/my-web-app 目录,以便您复制文件并同时更改所有者?我觉得必须有一些我缺少的简单解决方案。
解决方案
考虑到 Git 不是部署工具,您的 rsync 可能是更好的解决方案。
但是请检查在您的情况下设置组是否足够,setgid
在您的my-web-app
文件夹中使用 a ,如此处所述。这可能避免需要 chown 文件。
推荐阅读
- java - 如何使用 Java regexp 从文本中排除双重配额?
- java - 如何在 apache poi 3.17 中调用 trackAllColumnsForAutoSizing() 方法
- jquery - Laravel 5.2 编辑按钮单击时不显示模态内容
- java - 从 Rest 客户端请求通过服务到 Web 应用程序检索 JSON
- hyperledger-fabric - Hypereldger Fabric 中的应用能力 v1.2
- git - 回到上一个 github 提交
- media-queries - 使用媒体查询隐藏元素
- mysql - 最大日期,在 2 个表 MYSQL 中找到每个用户的余额
- python - Flask 启动新线程 - RuntimeError:在请求上下文之外工作
- php - Laravel firstOrCreate 搜索关系