背景情况:SVN与WEB不在同一台服务器上,需要SVN提交后WEB站点自动进行SVN UPDATE更新,查阅网上的教程,发现部分的细节和权限部分没有提到导致跨服务器ssh执行更新脚本失败,手动执行post-commit可以通过


需求:开发想要在项目修改并提交到svn服务器上后,web服务器能够自动进行svn update更新站点,并立即看到修改后的web页面效果


思路:项目提交时触发post-commit里面的脚本并写入到/var/log/svn.log中,脚本通过SSH免密登陆到WEB上然后再进行svn up.sh的脚本触发web站点更新


配置:SVN服务器一台(172.17.8.8) WEB测试服务器一台(172.17.8.9) 两台服务器均为CentOS7.4(1708)

            

          SVN项目版本环境在/svn/project(目录中含有db hook等文件)    WEB的网站路径为/var/www/html/project下



需要安装的软件:两台服务器均需要安装Apache软件(web服务器nginx也可以)和SVN软件,我的web测试环境为lamp


两台服务器均安装apache(httpd)、SVN(subversion),SVN服务器需要安装svn和apache的集成模块(mod_dav_svn),安装方式为yum install httpd subversion mod_dav_svn


在此不详细叙述SVN账号和密码以及权限的调试,只说post-commit、脚本、权限、以及log的写法和设置




1.两台服务器各建立系统账户为svn的用户名(useradd svn),并给svn用户设置密码(passwd svn) 注意:此步骤两台服务器都要做相同的操作


2.登陆SVN服务器做ssh免密码登陆web服务器的操作:


(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文件中查看是哪里出现问题

  1. 如果提示/usr/share/httpd等提示,说明你的apache不是以svn用户启动的,或者你的svn项目权限和属主属组没有变成svn用户

  2. 如果提示ssh认证错误等信息,说明web服务器在svn checkout的时候不是以svn用户进行的,或者是在两台机器做免密登陆的时候用户使用不正确,切换到svn用户进行操作


切记,WEB服务器在svn checkout的时候,用户必须以svn用户来进行!!!