linux下svn服务器安装与使用钩子自动部署web代码
这里使用的是ubuntu系统
svn服务器在linux下名叫 subversion,我们首先要安装svn服务器,输入以下命令安装:
apt install subversion
安装好svn服务器后,选定一个目录作为svn仓库(这里示例使用的是多仓库模式)
因为我有使用宝塔,所以我选了创建 /www/svn 目录,以后创建新仓库将会在 /www/svn 目录下创建
cd /www/svn #进入svn目录
svnadmin create testsvn #创建一个名叫testsvn的仓库,也可以使用 svnadmin create /www/svn/testsvn 直接指定目录创建
在 /www/svn 目录下可以创建多个svn仓库
例如执行 svnadmin create svn1 和 svnadmin create svn2 将会在 /www/svn目录下生成 svn1 和 svn2 两个仓库目录
创建 testsvn 仓库后可以看到该目录的结构,如下图:
svn服务器会把提交的代码压缩保存,所以这里是不会直接显示提交的源代码目录结构的。
重点注意以下文件目录(如果你想了解更多svn服务器目录结构的内容请自行查询):
配置svn仓库
每个svn仓库都有独立的文件配置,我们先 cd /www/svn/testsvn/conf 进入配置目录
修改svnserve.conf 文件的内容 (怎么使用 vim 命令编辑文件就不用我教了吧)
找到 anon-access 去掉前面的注释 ,修改为anon-access = none (这是禁止匿名访问)
找到 auth-access 去掉前面的注释,修改为 auth-access = write (这是赋予登录用户读写权限)
#指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的认证域相同,建议使用相同的用户名口令数据文件。缺省值:一个UUID(Universal Unique IDentifier,全局唯一标示)。可选。 realm=testsvn
去掉 password-db = passwd 和 authz-db = authz 前面的注释 (必须)。去掉注释后才会使用目录下的authz 和 passwd 文件配置用户权限
修改结果
password-db = passwd 也可以改为 password-db = ../xxx/gggg/passwd ,这样是自定义配置文件的位置
设置用户密码
编辑 /www/svn/testsvn/conf 目录下的 passwd 文件
[users]
# harry = harryssecret
# sally = sallyssecret
yinbug = 123456
这样就设置了一个svn账户和密码了
设置用户组
编辑 /www/svn/testsvn/conf 目录下的 authz 文件
这里是指定用户属于哪个用户组,拥有哪个仓库根目录的读写权限, *= 代表默认没读写权限 ,更多配置方式自行百度吧
在配置好用户权限后已经可以启动svn服务器了 (默认svn端口3690)
svnserve -d -r /www/svn #启动该目录下的所有仓库
使用 ps -ef|grep svn 可以显示服务是否启动
这样就说明服务已经启动了,其中红方框括起来的是进程号(pid)
可以使用 kill -9 10011 命令 结束服务,其中 -9 是发出退出的进程信息 10011 是进程号(pid)
开机自启
编辑 /etc/rc.local 在 exit 0 前一行添加内容:svnserver -d -r /www/svn
有关开机启动的参考的文章:
配置post-commit 提交部署钩子
为了每次提交svn后可以自动部署代码到web服务器,我们要编写钩子脚本,先 cd /www/svn/testsvn/hooks 进入钩子目录
cp post-commit.tmpl post-commit #复制提交成功的钩子模板文件为 post-commit 文件
因为手动创建post-commit 文件可能最后有权限问题,所以建议直接 使用 cp 命令
编辑post-commit 文件的内容
#!/bin/sh
REPOS="$1"
REV="$2"
TXN_NAME="$3"
export LANG=en_US.UTF-8
/usr/bin/svn update /www/wwwroot/lcbug.com/testsvn --username yinbug --password 654321 --no-auth-cache --non-interactive
exit 0
重点是倒数第二行,执行 svn 的更新命令,更新 /www/wwwroot/lcbug.com/testsvn 中的文件,后面是一些参数指定使用的用户信息
/usr/bin/svn 是svn 的安装目录,除非你有更改,默认就是这个,可以使用whereis svn 查看安装目录。(相当于就是svn update xxxxx 命令)
在执行钩子前,必须先保证 需要部署的web 目录已经手动 svn 检出过一次。(即存在 .svn 隐藏目录)
cd /www/wwwroot/lcbug.com/ #进入需要部署的web目录执行以下检出命令
svn co svn://localhost/testsvn --username yinbug --password 123456
#或者
svn checkout svn://localhost/testsvn --username yinbug --password 123456
检出后会多一个testsvn 目录,也是相当于一个本地仓库,此时源代码目录已经显示出来
好了,到这里部署已经完成了,可以进行使用测试了。如果在使用中出现问题,尤其是 (post-commit hook failed (exit code 255) with no output)那就是权限错误了
svn 默认会使用 httpd 或者 www-data 之类的账户运行钩子脚本,你需要解决脚本运行的权限问题(很少遇到这个问题,参考下面的文章)
可以尝试为post-commit 添加执行权限:chmod +x post-commit
可以尝试更改所属用户: chown www:www post-commit (这里www用户 和 www用户组仅供参考)
也可以尝试在post-commit 中添加以下命令更改部署的web目录权限:
chown -R www:www /www/wwwroot/lcbug.com # 修改部署目录的所属用户组
#或者
chmod -R 755 /www/wwwroot/lcbug.com # 修改部署目录的文件读写权限
# 以上仅供参考
上述post-commit 文件内容为简化版命令,详细可以参考以下文章: