我们有一个设置,不同的人在他们的本地机器上开发,稍后将更改提交到本地服务器存储库。
为了将更改同步到我们的外部生产服务器,我们运行一个脚本,将本地 subversion 导出同步到它。
我们在进行此同步时遇到了问题,因为为了工作,在远程服务器上进行同步的用户需要是远程文件的所有者。
我们的解决方案是:
在远程服务器上创建一个用户 (siteowner) 给他站点的所有权 (chown siteowner.siteowner /var/www/site) 将 apache 添加到 siteowner 的组中(我们在 htaccess 检查中遇到了一些问题,我们可以' t chown siteowner.apache,因为当 rsync 进行同步时,它会将权限更改为 siteowner.siteowner)
我的问题是......这个设置似乎合理?你还知道其他更好的吗?提前致谢!
我们为基于 PHP 的网站使用以下工作流程。
用户将他们的工作提交给 Subversion。我们不允许开发人员手动将代码部署到 Staging 和 Live。为什么不分期?因为我们希望它能够密切模拟 Live。部署是通过Webistrano完成的,它是著名且强大的Capistrano部署工具的 Web 前端。我们已经创建了所谓的配方来编写部署脚本。它大约执行以下操作:
网络服务器配置为使虚拟主机的 docroot 指向“当前”符号链接,因此在部署期间旧站点可见,并且在成功部署后新站点立即出现。
代码归 deploy:deploy 所有,但客户数据目录归 deploy:upload 所有,并在创建时设置其 SGID 位。
Apache 的 www-data 用户是“deploy”和“upload”组的成员。开发人员在服务器上拥有个人 scp 帐户,并且是“上传”组的成员。这种设置对我们来说非常有效,因为开发人员只能通过 Webistrano 与代码进行交互。它可以防止管理员以外的“实时快速修复”,并大大减少了事故。Webistrano 的内置回滚功能可以快速恢复错误的部署。
开发人员被授予对客户数据目录的写入权限(由于上传组),因此他们可以上传占位符内容或帮助客户预填充网站。毕竟,svn 中没有存储任何客户内容。目录上的 SGID 位确保只有上传文件的用户所有权被设置为上传的用户(提供一点责任)。组所有权仍然由 SGID 设置为“上传”,以便 Apache 或其他开发人员仍然可以读写创建的文件和目录。
事实证明,清晰的 Webistrano 界面非常有用,而且由于 Capistrano 内置了上述大部分功能,我们的部署方法只有两打行。其中大部分是覆盖 Ruby-on-Rails 特定的默认值。
您可以通过这种方式重新考虑工作流程:
每个人都可以提交到 SVN 服务器,而不是玩 apache 权限,而是在生产服务器上创建一个用户并添加一个 SFTP 服务器。
每个人都在处理他们的文件,当完成对 SVN 服务器的提交时,他们使用他们的 SFTP 客户端将他们的文件投入生产。(因为他们都将使用同一个用户,你不会为权限而烦恼)
实际上,在投入生产之前,您应该有一个额外的服务器用于预生产。
在每次提交到生产服务器之前,他们会将他们的文件添加到预生产服务器,这在理想情况下必须是生产服务器的精确复制。
验证更改后,他们可以将文件投入生产。