日前需要开新项目,那么,就要新建一个svn及网站运行环境了。于是有Lee该文章。
好了,看这篇文章的时候你可以先看看:
阶段巨献 - centos+php-fpm+mariaDB+svn+nodejs,配置linux的php和nodejs网站运行环境。
centos配置ocaml及unison进行双向文件同步搭建
【centos】配置postgresql数据库。
【java开发部署】利用svn及ocaml及unison进行javaweb网站部署
unison的配置
rsync同步文件
tomcat配置要点。
安装说明
安装环境:CentOS-7.0.1406
安装方式:源码安装
软件:apache-tomcat-7.0.29.tar.gz
下载地址:http://tomcat.apache.org/download-70.cgi
安装前提
系统必须已安装配置JDK6+,安装请参考:在CentOS-6.3中安装与配置JDK-7。
安装tomcat
将apache-tomcat-7.0.29.tar.gz文件上传到/usr/local中执行以下操作:
代码如下:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
[root@admin local]# cd /usr/local
[root@admin local]# wget http://apache.fayea.com/apache-mirror/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57.tar.gz
[root@admin local]# tar -zxv -f apache-tomcat-7.0.29.tar.gz // 解压压缩包
[root@admin local]# rm -rf apache-tomcat-7.0.29.tar.gz // 删除压缩包
[root@admin local]# mv apache-tomcat-7.0.29 tomcat
启动Tomcat
执行以下操作:
代码如下:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
[root@admin ~]# /usr/local/tomcat/bin/startup.sh //启动tomcat
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.7.0/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
出现以上信息说明已成功启动。
防火墙开放8080端口
增加8080端口到防火墙配置中,执行以下操作:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
[root@admin ~]# vi + /etc/sysconfig/iptables
#增加以下代码
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
重启防火墙
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
[root@admin java]# service iptables restart
检验Tomcat安装运行
通过以下地址查看tomcat是否运行正常:
http://192.168.15.231:8080/
看到tomcat系统界面,说明安装成功!
停止Tomcat
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
[root@admin ~]# /usr/local/tomcat/bin/shutdown.sh //停止tomcat
创建nodejs的项目的步骤为:
1 创建代码仓库
2 设定钩子–post-commit达到自动同步到网站目录的效果
3 设定nginx的子网站配置文件,开放相关端口
4 测试是否成功
需要注意的是,使用的是nodejs的express框架,需要在app.js里面设定使用的端口。这里采用预先采用的端口为:3007
这里有相关设置:
这里写链接内容
相关命令
这里将项目名称暂定为blue-hat
sudo mkdir -p /var/svn/blue-hat
sudo svnadmin create /var/svn/blue-hat
sudo vim /var/svn/blue-hat/conf/svnserve.conf
sudo vim /var/svn/blue-hat/conf/passwd
sudo vim /var/svn/blue-hat/conf/authz
sudo systemctl restart svnserve
注意,请根据参考资料一步一步完成配置,这里不啰嗦了。接下来,给项目添加一个对应的web运行目录,该目录路径初步定为:/usr/local/webroot/blue-hat
/usr/local/webroot/blue-hat
mkdir -p /usr/local/webroot/blue-hat
svn checkout svn://localhost/blue-hat /usr/local/webroot/blue-hat --username testuser --password abc --non-interactive
添加post commit
cd /var/svn/blue-hat/hooks
cp post-commit.tmpl post-commit
chmod +x post-commit
vi post-commit
这样修改
#!/bin/sh
# 库的路径
REPOS="$1"
# 新提交的版本号
REV="$2"
WEB=/usr/local/webroot/blue-hat
SVN=/usr/bin/svn
LOG=/usr/local/webroot/auto_svn.log
export LC_ALL=zh_CN.UTF-8
changed=$(svnlook changed -r $REV $REPOS)
log=$(svnlook log -r $REV $REPOS)
echo "now the changed is:$changed">>$LOG
n=$'\n'
$SVN update $WEB --username testuser --password abc --non-interactive #更新到我们的目标网站目录。
重启svn
接下来就是svn的上传下载了
注意,开发环境不需要配置nginx+express
略,请自行用脚本进行配置
提醒,数据库的备份还原迁移都是必须要知道的。
这里将项目名称暂定为blue-hat-server
sudo mkdir -p /var/svn/blue-hat-server
sudo svnadmin create /var/svn/blue-hat-server
sudo vim /var/svn/blue-hat-server/conf/svnserve.conf
sudo vim /var/svn/blue-hat-server/conf/passwd
sudo vim /var/svn/blue-hat-server/conf/authz
sudo systemctl restart svnserve
注意,这里不用配置post 钩子。因为源代码不可以直接执行的。
请注意,java编译以后放到一个输出目录,然后输出svn目录,然后将编译好的文件更新到线上,重启tomcat服务器。
这里将项目名称暂定为blue-hat-build
sudo mkdir -p /var/svn/blue-hat-build
sudo svnadmin create /var/svn/blue-hat-build
sudo vim /var/svn/blue-hat-build/conf/svnserve.conf
sudo vim /var/svn/blue-hat-build/conf/passwd
sudo vim /var/svn/blue-hat-build/conf/authz
sudo systemctl restart svnserve
配置相关web 目录。
mkdir -p /usr/local/webroot/blue-hat-build
svn checkout svn://localhost/blue-hat-build /usr/local/webroot/blue-hat-build --username testuser --password abc --non-interactive
接下来我们要修改hook脚本的post commit,
首先先将post-coomit.tmpl复制一份成为post-commit,
svn每次更新完以后将会执行post-commit脚本
然后给脚本执行权限,接下来将脚本内容添加进去–就是下面的脚本例子了。
然后保存,再重启svn服务,然后测试是否成功。
cd /var/svn/blue-hat-build/hooks
cp post-commit.tmpl post-commit
chmod +x post-commit
vi post-commit
#!/bin/sh
# 库的路径
REPOS="$1"
# 新提交的版本号
REV="$2"
WEB=/usr/local/webroot/blue-hat-build
SVN=/usr/bin/svn
LOG=/usr/local/webroot/auto_svn.log
export LC_ALL=zh_CN.UTF-8
changed=$(svnlook changed -r $REV $REPOS)
log=$(svnlook log -r $REV $REPOS)
echo "now the changed is:$changed">>$LOG
n=$'\n'
$SVN update $WEB --username testuser --password abc --non-interactive #更新到我们的目标网站目录。
注意,假如你想要同步到另一台svn,可以试试下面代码:
svnsync sync --non-interactive svn://目标ip:(端口号)/source_svnbak --username xxx --password xxx
svn备份用在什么地方?
首先,你有多台svn服务器,其次,你的源代码比较重要,需要备份到其他地方。
假定现在的场景为:
一台本地开发svn服务器,dev-svn,一台线上svn服务器,online-svn,现在需要将dev-svn的某个项目,譬如,projectA备份到online-svn上面,好了,
下面是步骤:
—参考
SVN:利用svnsync定时单向备份同步版本库
1、在online-svn上面设定好存放的svn目录,好了,这步略过—因为文章大篇幅已经说过这步骤了,忘了就翻一翻
2、首次需要初始化项目
-- 请根据实际修改。
svnsync init https://192.168.1.222:9999/svn/svnMirror file:///zfspool/svn/project --username svnMirror --password 123456
语法是:svnsync init {备份库url} {源库url} 备份库的用户名 密码
注意本地url是三个斜杠的:///
其中9999是自定义的端口号,如果是默认的可以不用加。
-_- 咦又出问题了,查一下原因。。。
svn备份的方式有三种:
1svnadmin dump
2)svnadmin hotcopy
3)svnsync.
优缺点分析
==============
第一种svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。
缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。
个人建议在版本数比较小的情况下使用这种备份方式。
第二种svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;
优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。
缺点是:比较耗费硬盘,需要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。
第三种svnsync实际上是制作2个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须svn1.4版本以上才支持这个功能。
优点是:当制作成2个镜像库的时候起到双机实时备份的作用;
以上不是自己观点,下面真实记录我的svn sync实验过程
两台机器
server1: 192.168.1.224
server2: 192.168.1.225
都是centos6.5环境
首先在sever1上搭建好了一个svn,然后模拟提交了一些东西
然后在sever2上搭建了一个一模一样的svn,保持空的
现在的目的是将server1同步备份到server2
在server1上直接运行:
svnsync init svn://192.168.1.225/ svn://192.168.1.224/
即svnsync init 目标svn链接 源svn链接,执行同步之前的初始化
这一步失败了,报如下错误:
svnsync: Repository has not been enabled to accept revision propchanges;
ask the administrator to create a pre-revprop-change hook
提示需要在hooks下面创建一个pre-revprop-change hook
简单解释下,hook类似于操作系统的勾子,svn会在收到一些操作请求的时候执行hooks目录下的对应的脚本,例如想要commit的时候做一些事情就可以在对应的脚本下面添加你要执行的命令,下一次在commit 的时候就会触发执行
一开始没明白,不知道应该在源机器上创建还是在目标机器上创建,其实是在目标机器上创建的
然后在目标机器上copy了一份pre-revprop-change.tmpl成pre-revprop-change
再次执行初始化命令
依然报错,这次的错误不一样了
svnsync: Revprop change blocked by pre-revprop-change hook (exit code 255) with no output.
大概就是同步的过程中刚刚创建的hook调用没有成功,然后尝试给pre-revprop-change添加可执行权限,依然失败
依然失败,依然失败,在stack overflow上看到有人提出的解决方法是把pre-revprop-change改成下面这个样子:
#!/bin/sh
exit 0
再次初始化,终于成功,提示先让你输入用户名密码,最后一步的输出如下:
后来经过验证,确实需要可执行权限,改了之后还是失败的原因是hooks执行的结果是失败的,确实执行了
这一步成功之后,下一步同步就直接成功了:
svnsync sync svn://192.168.1.225/
执行这个命令会把没有同步的版本都同步过去
然后为了让server1每次有更新之后都自动同步到server2,可以在server1的commit的hooks最后加上执行一下同步的命令:
svnsync sync svn://192.168.1.225/
这样就完美实现了实时备份,而且在server1出现问题的时候随时都可以直接切换到server2哟
最后有一点要注意的是,我尝试备份到一个不为空的svn,也就是目标svn已经存在要备份的repos的时候,是会失败的,因此,只能备份到一个空的svn
最后还有一个非常重要的要注意的问题就是,如果在直接在目标在做了修改的话,那么后面就没有办法同步了,都会失败,所以,禁止在备份svn上直接做任何操作,这里的花建议专门写一个脚本,在post-commit勾子里面调用,通过脚本来同步,然后判断一下是否同步成功,如果同步失败了需要及时处理,比如可以给相关人员发邮件通知及时处理,防止同步失败了导致server1一旦宕机之后突然发现server2早就没有同步了就晚了。
在SVN中,修改了代码要提交时写好注释是个好习惯,但很多人往往忽略了这一点,所以可以通过设置pre-commit钩子来强制要求提交代码时要写注释。在Windows下找到你建立版本库的文件夹中的hooks文件夹,新建一个名为pre-commit.bat的文件,文件内容如下:
@echo off
setlocal
set REPOS=%1
set TXN=%2
rem check that logmessage contains at least 10 characters
svnlook log "%REPOS%" -t "%TXN%" | findstr ".........." > nul
if %errorlevel% gtr 0 goto err
exit 0
:err
echo Empty log message not allowed. Commit aborted! 1>&2
exit 1
这样就实现了SVN强制注释的功能。
有时我们需要修改注释,这就要设置pre-revprop-change钩子了,还是在hooks文件夹中,新建一个名为pre-revprop-change.bat的文件,文件内容如下:
setlocal
set REPOS=%1
set REV=%2
set USER=%3
set PROPNAME=%4
set ACTION=%5
if not "%ACTION%"=="M" goto refuse
if not "%PROPNAME%"=="svn:log" goto refuse
goto OK
:refuse
echo Cann't set %PROPNAME%/%ACTION%, only svn:log is allowed 1>&2
endlocal
exit 1
:OK
endlocal
exit 0
这样修改注释的功能也完成了
以上内容来自网络,我在配置svn和apache集成的时候发现默认是不能修改日志信息的,用了第二段代码就OK了,系统默认的范例是unix下的,不能直接使用!
好了,按照上面的做法:
在online-svn上面,添加pre-revprop-change可执行文件,以下步骤:
cd /var/svn/你的备份库名称/hooks
vim pre-revprop-change
添加下面内容:
#!/bin/sh
exit 0
好了,保存一下,然后
chmod +x pre-revprop-change
ok。
再执行:
svnsync init https://192.168.1.222:9999/svn/svnMirror file:///zfspool/svn/project --username svnMirror --password 123456
…..只复制了,版本0。当然,很多时候都是几万的版本,所以,第一次备份很重要:
svnsync sync https://192.168.1.222:9999/svn/svnMirror
好了,等它传完就可以了。
再等的时候我们来做些脚本,譬如,每次dev-svn上面有更新,那么就同步一下到online-svn。
提问时间:在svn上面如何用钩子同步到其他文件夹?不会的请翻翻之前的配置。
下面说步骤:
在dev-svn上面,你的projectA下面加一个钩子。
cd /var/svn/projectA/hooks
cp post-commit.tmpl post-commit
chmod +x post-commit
vim post-commit
然后把 post-commit 中,最后两行替换为
svnsync sync --non-interactive svn://目标ip:(端口号)/source_svnbak --username xxx --password xxx
即,内容如下:
#!/bin/sh
# 库的路径
REPOS="$1"
# 新提交的版本号
REV="$2"
WEB=/usr/local/webroot/blue-hat-build
SVN=/usr/bin/svn
LOG=/usr/local/webroot/auto_svn.log
export LC_ALL=zh_CN.UTF-8
changed=$(svnlook changed -r $REV $REPOS)
log=$(svnlook log -r $REV $REPOS)
echo "now the changed is:$changed">>$LOG
n=$'\n'
svnsync sync --non-interactive svn://目标ip:(端口号)/source_svnbak --username xxx --password xxx
sudo systemctl restart svnserve
好了,试试是不是实际上会更新。