背景状况:SVN与WEB不在同一台服务器上,须要SVN提交后WEB站点自动进行SVN UPDATE更新,查阅网上的教程,发现部分的细节和权限部分没有提到致使跨服务器ssh执行更新脚本失败,手动执行post-commit能够经过html
需求:开发想要在项目修改并提交到svn服务器上后,web服务器可以自动进行svn update更新站点,并当即看到修改后的web页面效果nginx
思路:项目提交时触发post-commit里面的脚本并写入到/var/log/svn.log中,脚本经过SSH免密登录到WEB上而后再进行svn up.sh的脚本触发web站点更新
web
配置:SVN服务器一台(172.17.8.8) WEB测试服务器一台(172.17.8.9) 两台服务器均为CentOS7.4(1708)shell
SVN项目版本环境在/svn/project(目录中含有db hook等文件) WEB的网站路径为/var/www/html/project下
apache
须要安装的软件:两台服务器均须要安装Apache软件(web服务器nginx也能够)和SVN软件,个人web测试环境为lampvim
两台服务器均安装apache(httpd)、SVN(subversion),SVN服务器须要安装svn和apache的集成模块(mod_dav_svn),安装方式为yum install httpd subversion mod_dav_svn
bash
在此不详细叙述SVN帐号和密码以及权限的调试,只说post-commit、脚本、权限、以及log的写法和设置
服务器
1.两台服务器各创建系统帐户为svn的用户名(useradd svn),并给svn用户设置密码(passwd svn) 注意:此步骤两台服务器都要作相同的操做
ssh
2.登录SVN服务器作ssh免密码登录web服务器的操做:ide
(1)在SVN服务器下,使用su - svn(要带-,说明环境变量也切换到svn下面) ,切换到svn用户上,执行ssh-keygen -t rsa,一路回车执行,成功的话会生成SHA256的密钥文件
(2)将svn用户下的密钥文件拷贝至web服务器下的svn用户ssh目录:ssh-copy-id -i /home/svn/.ssh/id_rsa.pub svn@172.17.8.9,输入密码后提示复制成功
(3)使用ssh登录到web服务器:ssh svn@172.17.8.9,输入一次密码后,尝试再次执行该命令,确认可以免密登录后便可。
3.将apache的启动进程用户修改为svn
vim /etc/httpd/conf/httpd.conf
找到User和Group(大约66 67行左右)将apache改成svn,:wq保存退出
将全部的svn目录下的权限修改为svn用户,使用-R递归方式
chown -R svn:svn /svn
4.进入项目目录,编写post-commit脚本并赋予其执行权限
vim /svn/project/hooks/post-commit
脚本以下:
#!/bin/sh
REPOS="$1"
REV="$2"
LOGFILE=/var/log/svn.log ##这里是为了保存日志并查看是否有报错,有报错说明执行了未成功,没报错说明未执行成功,检查权限,执行成功会有svn update信息
exec 1>>"$LOGFILE"
exec 2>&1
export.UTF-8
/usr/bin/ssh -l svn 172.17.8.9 "/bin/bash /shell/svnup.sh"
exit 0
保存退出
赋予post-commit可执行权限
chmod 777 /svn/project/hooks/post-commit
5.建立脚本日志并赋予svn权限
touch /var/log/svn.log
chmod 777 /var/log/svn.log
chown svn:svn /var/log/svn.log
6.修改完毕后重启Apache服务器使其生效
systemctl restart httpd.service
至此SVN服务器配置完毕
################################
WEB服务器配置:
1.做者自己建立了一个管理脚本的文件夹
mkdir /shell/
编写脚本
vim /shell/svnup.sh
脚本内容
#!/bin/bash
/usr/bin/svn update /var/www/html/project/
:wq保存退出
2.赋予可执行及最大权限
chmod 777 /shell/svnup.sh
3.将站点的属主属组改成svn用户,并将站点设置为777权限
chown -R svn:svn /var/www/html/project
chmod -R 777 /var/www/html/project
4.切换至svn用户并从svn服务器上拉取网站文件(很是关键的一步,必须使用svn帐户来操做,使用root用户操做会失败)
切换至svn用户 su - svn
检出网站文件至网站目录 svn checkout http://172.17.8.8/svn/project /var/www/html/project --username taoye
输入用户的密码
至此,全部网站都以svn用户身份拉取到网站目录下
#############################################
操做完成后,尝试svn提交文件看是否在提交时可以触发post-commit文件,若是触发时有错误提示,有多是权限和属主属组不对,要么就是post-commit中的脚本开头不是以#!/bin.sh开头的
若是在提交的时候没有出现问题,那么能够查看一下SVN服务器上的/var/log/svn.log文件中查看是哪里出现问题
若是提示/usr/share/httpd等提示,说明你的apache不是以svn用户启动的,或者你的svn项目权限和属主属组没有变成svn用户
若是提示ssh认证错误等信息,说明web服务器在svn checkout的时候不是以svn用户进行的,或者是在两台机器作免密登录的时候用户使用不正确,切换到svn用户进行操做
切记,WEB服务器在svn checkout的时候,用户必须以svn用户来进行!!!