基于Git的网站部署工作流程

7
在我的服务器上,有两个用户,www-data(由nginx使用)和gitgit用户拥有包含我的网站代码的存储库,而www-data用户拥有该存储库的克隆版本(作为nginx的Web根目录)。 我想设置工作流程,使将代码推送到git的存储库会导致www-data的存储库更新,从而更新我的网站。
如何正确设置这些存储库的挂钩(还考虑了这两个用户的权限和权限)?

将所有公共内容都归属于运行服务器的用户帐户,这真的是一个好主意吗?如果服务器或您的代码受到攻击,攻击者可能会修改持久数据,而不仅仅是访问数据库连接。 - sarnold
那我应该将公共内容归属于 git,并使其可被所有人读取吗?这也会简化此问题中的权限问题... - Chetan
如果您对此解决方案感到满意,那么是的,它将为您节省寻找从gitwww-data存储库推送新方法的麻烦。 :) 您是否喜欢在服务器上有两个git存储库?另一个选项是将文件的组所有权设置为服务器组之一,并通过组权限允许读取访问。 - sarnold
2个回答

5

删除由www-data拥有的存储库,并按照此网页中的解决方案设置一个后置接收挂钩,该存储库由git拥有。


2
我最终将公共内容归属于git用户,并对所有人可读。然后,我按照以下步骤设置钩子:
假设仓库名为mysite:
  1. Create a detached work tree that will act as the webroot (as the user git)

    mkdir /var/www/mysite
    cd /path/to/repository/mysite.git
    git config core.worktree /var/www/mysite
    git config core.bare false
    git config receive.denycurrentbranch ignore
    
  2. Add a post-receive hook that will update the website and set correct permissions for it

    touch hooks/post-receive
    chmod +x hooks/post-receive
    vim hooks/post-receive
    

    The post-receive script:

    #!/bin/sh
    git checkout -f
    chmod -R o+rX /var/www/mysite
    
参考资料:
http://www.deanoj.co.uk/programming/git/using-git-and-a-post-receive-hook-script-for-auto-deployment/


更新:这里有一个更好的解决方案

注意:早期版本的此教程依赖于设置git配置变量core.worktree为目标目录,core.bare为false,receive.denycurrentbranch为ignore。但如果您使用GIT_WORK_TREE(在我最初编写此教程时无法使用),则不需要进行这些更改,远程存储库可以保持bare。


为什么人们总是在博客中找到那些恶劣的解决方案,而不是正确的呢? - Arrowmaster
1
@Arrowmaster:谢谢,简单总是更好。 - Chetan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接