一键部署需要哪些权限设置?

时间:2018-12-20 14:36:48

标签: linux git ubuntu ubuntu-14.04 file-permissions

标题是一般性的,但是我还有更具体的问题。我深陷在权限之梦中,试图使用Git设置“推送部署”系统。

在本地计算机上,我通过SSH推送到服务器(Ubuntu 14.04)。我已将服务器设置为远程服务器

git remote add development devuser@development.server:/home/dummyuser/bare/repo.git

此裸存储库位于虚拟用户dummyuser的主文件夹中,我们用来处理部署任务。 devuser是我在开发服务器上的帐户。

我在远程存储库(post-receive)中设置了一个development.server:/home/dummyuser/bare/repo.git/hooks/post-receive钩子,该钩子旨在通过git checkout将文件部署到同一服务器上的Web服务器目录,称为{{ 1}}。该文件夹当前具有权限

webfolder/

其中drwxr-xr-x dummyuser www-data webfolder/ 是与Apache用户关联的组。

如果我有www-data钩子脚本,请使用命令

post-receive

我收到了无法写入git --work-tree=/var/www/webfolder --git-dir=/home/dummyuser/bare/repo.git checkout -f 的错误,这是可以预见的,因为我假设脚本是通过我自己通过SSH发起的,而脚本webfolder/正在以我的身份运行(devuser, 1}}对devuser没有任何权限。

但是,如果我将脚本更改为webfolder/

dummyuser

只是看看会发生什么,我有错误

sudo -u dummyuser git --work-tree=/var/www/webfolder --git-dir=/home/dummyuser/bare/repo.git checkout -f

对此我有几件事不了解:

1)warning: unable to access '/home/devuser/.config/git/attributes': Permission denied /home/devuser/.config/都不存在。没关系,但是如果Git需要访问/home/dummyuser/.config/文件夹,为什么在我设置裸仓库和以.config/执行钩子之前它没有抱怨?

2)现在,我试图扮演devuser的角色,为什么Git在dummyuser中寻找~devuser/文件夹?为什么在.config/

中不显示

我一直在研究疯狂的狗屎秀中的一个小问题,它正在“使用Git”播放四个小时,我的大脑很模糊,所以请使用小词。

2 个答案:

答案 0 :(得分:1)

问题是涉及sudo -u dummyuser而不设置Git期望的环境变量。如果将HOME=/home/dummyuser添加到post-receive挂钩中,则部署将按预期进行。

如果任何人都可以提供有关正在发生的事情的更多详细信息或更好的解决方案,请将其写为答案,我会接受。几个注意事项:

  • dummyuser没有登录,因此在sudo -iu dummyuser脚本中使用post-receive无效
  • 手动设置HOME=/home/dummyuser并成功执行脚本后,我发现终端上的echo $HOME返回了/home/devuser,因此$HOME并没有永久性的变化
  • 成功执行挂钩脚本后,~devuser/~dummyuser//root/都没有.config/文件夹。所以...我仍然不知道为什么Git挂在上面。

答案 1 :(得分:0)

Git希望用户主目录中有一个.config文件夹。如果$HOME设置不正确,例如如果它指向另一个用户的家,Git将尝试访问$HOME/.config,而不知道它实际上根本不存在。但是,由于用户(因此Git)无权访问该$HOME,因此您会收到一条错误消息,提示Permission denied

要进行测试,请尝试以dummyuser的身份运行:

[ -d /home/devuser/.config ] && echo '.config exists!'

您正在尝试测试目录/home/devuser/.config是否存在。但是,由于您没有所需的权限,因此您获得Permission denied,并且仍然不知道目录是否存在。

您可以使用$HOME-H来代替手动设置--set-home

sudo -Hu dummyuser git --work-tree=/var/www/webfolder --git-dir=/home/dummyuser/bare/repo.git checkout -f