查看: 689|回复: 3

利用SVN更新网站

 关闭 [复制链接]

签到天数: 2586 天

连续签到: 5 天

[LV.Master]至尊海神IIIIII

发表于 2009-11-27 21:34 | 显示全部楼层 |阅读模式
利用SVN更新网站


如果你有一个假设在公网上的SVN服务器,而你的网站所在的主机允许你使用SVN客户端,并且开放了php的exec函数,那么你有福了,你可以利用SVN作为中转,更新你的网站程序。

首先,也是前提,就是你的网站程序是用SVN管理的,那么只要你的网站主机能够访问SVN,就能够使用SVN的update功能来更新程序。

准备工作一:将网站程序加上svn的控制标记,由于SVN的控制信息都存在程序所在目录的.svn子目录中,所以需要找一个空目录,并且将网站现有程序checkout到这个目录里面来,注意是checkout而不是export,因为接下来要将最新的网站程序连同他里面包含的很多个.svn目录一同上传到服务器上去。为了不让.svn目录泄露机密,要在.htaccess文件或者是httpd.conf中设定如下规则,禁止对.svn目录的访问。

<directory ~ \"\\.svn\">
Order Allow,Deny
Deny from all
</directory>
准备工作二:作一段小程序,调用服务器上的svn命令行命令,update网站程序,下面是一个写好了的简单例子。

//setup update target path
$target_ar[&#39;fwolf&#39;] = &#39;d:\\fwolf&#39;;

//setup commandline
$svn_cmd1 = &#39;d:\\server\\svn\\bin\\svn.exe update &#39;;
$svn_cmd2 = &#39; --username updatebot --password xxxxxx --no-auth-cache&#39;;

//output html string
$html = &#39;&#39;;

//recieve get parameter
$target = isset($_GET[&#39;target&#39;]) ? $_GET[&#39;target&#39;] : &#39;&#39;;
if (empty($target) || !isset($target_ar[$target]))
{
$html = &#39;Target does not correct.&#39;;
}
else
{
//execute svn update command
$cmd = $svn_cmd1 . $target_ar[$target] . $svn_cmd2;
$ar = array();
$status = 0;
exec($cmd, $ar, $status);
for ($i=0; $i < count($ar); $i++)
$ar[$i] = htmlspecialchars($ar[$i]);
$html .= &#39;Status: &#39; . $status . \"<br />\\r\\n\";
$html .= implode(&#39;<br />&#39; . \"\\r\\n\", $ar);
}
echo $html;
把这个程序放到服务器上能够访问到的地方,也可以在此基础上加上一些访问限制,那么只要访问这个程序/页面,服务器就会自动更新你的网站啦。

Status: 0
D H:\\cvswork\\svntest\\update_from_svn.php
Updated to revision 44.
这样,在利用SVN很好的管理网站程序的基础上,还实现了服务器程序的很方便的更新,一举两得!尤其是在程序上传不是十分方便的场合,用起来就更舒服了,我就是在更换了一个劣质防火墙,ftp无法正常使用的情况下想出这个怪招儿的:-)。

Update @ 2007-07-31
如果在windows主机上使用本方法,而svn服务器是采用了ssl的https://…地址,那么会遇到一点小麻烦,就是在执行svn update的时候,由于使用的是web的用户,在出现确认证书的提示信息时,用户是无法输入的:

Error validating server certificate for &#39;https://20070731.fwolf.com&#39;:
- The certificate is not issued by a trusted authority. Use the
fingerprint to validate the certificate manually!
Certificate information:
- Hostname: 20070731.fwolf.com
- Valid: from Jul 31 06:49:53 2007 GMT until Jul 28 06:49:53 2017 GMT
- Issuer: Fwolf, US
- Fingerprint: 38:43:0b:29:75:1t:ba:d8:29:8f:94:9a:10:42:a0:fe:ae:93:4d:91
(R)eject, accept (t)emporarily or accept (p)ermanently?
这时就只能用变通的方法了,首先在dos方式中使用svn up,svn会自动缓存身份验证以及ssl确认信息,这些信息保存在C:\\Documents and Settings\\Administrator\\Application Data\\Subversion目录下,然后把这个目录整体拷贝到C:\\Documents and Settings\\Default User\\Application Data\\Subversion就可以了,测试环境windows2003,并且试过复制到All Users的对应目录无效。

另外修改配置文件servers,添加ssl-trust-default-ca = yes的方式在windows下好像没有作用。

Update @ 2009-04-07
Git(ssh证书登录)也可以这样用,略有不同,我使用的客户端是msysgit:

Admin用户使用桌面操作(Git Bash)时,.ssh目录位于C:\\Documents and Settings\\Administrator\\下。
直接使用C:\\Program Files\\Git\\bin\\ssh.exe当ssh客户端时,.ssh目录要放到C:\\Program Files\\Git\\下,并且似乎忽略.ssh/config文件,私钥文件只认identity id_rsa id_dsa三个。
系统服务比如Apache运行时,使用上面一条的设置,很是诡异。
说公钥文件只认固定的三个,是从这里猜到的:

Program Files/Git$ grep identity share -R
share/git-gui/lib/sshkey.tcl: foreach name {~/.ssh/id_dsa.pub ~/.ssh/id_rsa.pub ~/.ssh/identity.pub} {
好像是写死了,并且我用config定义其他私钥它也不认。第一条中使用Git的时候没事,很正常。

同时,为了安全起见,apache里还要增加如下设置:

<Directory ~ \"\\.(git|svn)\">
Order allow,deny
Deny from all
Satisfy All
</Directory>
<
PCOS系统下载站:http://zhuangji.wang

签到天数: 2586 天

连续签到: 5 天

[LV.Master]至尊海神IIIIII

 楼主| 发表于 2009-11-27 21:34 | 显示全部楼层

利用SVN更新网站

利用SVN更新网站


如果你有一个假设在公网上的SVN服务器,而你的网站所在的主机允许你使用SVN客户端,并且开放了php的exec函数,那么你有福了,你可以利用SVN作为中转,更新你的网站程序。

首先,也是前提,就是你的网站程序是用SVN管理的,那么只要你的网站主机能够访问SVN,就能够使用SVN的update功能来更新程序。

准备工作一:将网站程序加上svn的控制标记,由于SVN的控制信息都存在程序所在目录的.svn子目录中,所以需要找一个空目录,并且将网站现有程序checkout到这个目录里面来,注意是checkout而不是export,因为接下来要将最新的网站程序连同他里面包含的很多个.svn目录一同上传到服务器上去。为了不让.svn目录泄露机密,要在.htaccess文件或者是httpd.conf中设定如下规则,禁止对.svn目录的访问。

<directory ~ \"\\.svn\">
Order Allow,Deny
Deny from all
</directory>
准备工作二:作一段小程序,调用服务器上的svn命令行命令,update网站程序,下面是一个写好了的简单例子。

//setup update target path
$target_ar[&#39;fwolf&#39;] = &#39;d:\\fwolf&#39;;

//setup commandline
$svn_cmd1 = &#39;d:\\server\\svn\\bin\\svn.exe update &#39;;
$svn_cmd2 = &#39; --username updatebot --password xxxxxx --no-auth-cache&#39;;

//output html string
$html = &#39;&#39;;

//recieve get parameter
$target = isset($_GET[&#39;target&#39;]) ? $_GET[&#39;target&#39;] : &#39;&#39;;
if (empty($target) || !isset($target_ar[$target]))
{
$html = &#39;Target does not correct.&#39;;
}
else
{
//execute svn update command
$cmd = $svn_cmd1 . $target_ar[$target] . $svn_cmd2;
$ar = array();
$status = 0;
exec($cmd, $ar, $status);
for ($i=0; $i < count($ar); $i++)
$ar[$i] = htmlspecialchars($ar[$i]);
$html .= &#39;Status: &#39; . $status . \"<br />\\r\\n\";
$html .= implode(&#39;<br />&#39; . \"\\r\\n\", $ar);
}
echo $html;
把这个程序放到服务器上能够访问到的地方,也可以在此基础上加上一些访问限制,那么只要访问这个程序/页面,服务器就会自动更新你的网站啦。

Status: 0
D H:\\cvswork\\svntest\\update_from_svn.php
Updated to revision 44.
这样,在利用SVN很好的管理网站程序的基础上,还实现了服务器程序的很方便的更新,一举两得!尤其是在程序上传不是十分方便的场合,用起来就更舒服了,我就是在更换了一个劣质防火墙,ftp无法正常使用的情况下想出这个怪招儿的:-)。

Update @ 2007-07-31
如果在windows主机上使用本方法,而svn服务器是采用了ssl的https://…地址,那么会遇到一点小麻烦,就是在执行svn update的时候,由于使用的是web的用户,在出现确认证书的提示信息时,用户是无法输入的:

Error validating server certificate for &#39;https://20070731.fwolf.com&#39;:
- The certificate is not issued by a trusted authority. Use the
fingerprint to validate the certificate manually!
Certificate information:
- Hostname: 20070731.fwolf.com
- Valid: from Jul 31 06:49:53 2007 GMT until Jul 28 06:49:53 2017 GMT
- Issuer: Fwolf, US
- Fingerprint: 38:43:0b:29:75:1t:ba:d8:29:8f:94:9a:10:42:a0:fe:ae:93:4d:91
(R)eject, accept (t)emporarily or accept (p)ermanently?
这时就只能用变通的方法了,首先在dos方式中使用svn up,svn会自动缓存身份验证以及ssl确认信息,这些信息保存在C:\\Documents and Settings\\Administrator\\Application Data\\Subversion目录下,然后把这个目录整体拷贝到C:\\Documents and Settings\\Default User\\Application Data\\Subversion就可以了,测试环境windows2003,并且试过复制到All Users的对应目录无效。

另外修改配置文件servers,添加ssl-trust-default-ca = yes的方式在windows下好像没有作用。

Update @ 2009-04-07
Git(ssh证书登录)也可以这样用,略有不同,我使用的客户端是msysgit:

Admin用户使用桌面操作(Git Bash)时,.ssh目录位于C:\\Documents and Settings\\Administrator\\下。
直接使用C:\\Program Files\\Git\\bin\\ssh.exe当ssh客户端时,.ssh目录要放到C:\\Program Files\\Git\\下,并且似乎忽略.ssh/config文件,私钥文件只认identity id_rsa id_dsa三个。
系统服务比如Apache运行时,使用上面一条的设置,很是诡异。
说公钥文件只认固定的三个,是从这里猜到的:

Program Files/Git$ grep identity share -R
share/git-gui/lib/sshkey.tcl: foreach name {~/.ssh/id_dsa.pub ~/.ssh/id_rsa.pub ~/.ssh/identity.pub} {
好像是写死了,并且我用config定义其他私钥它也不认。第一条中使用Git的时候没事,很正常。

同时,为了安全起见,apache里还要增加如下设置:

<Directory ~ \"\\.(git|svn)\">
Order allow,deny
Deny from all
Satisfy All
</Directory>
PCOS系统下载站:http://zhuangji.wang
回复 支持 反对

使用道具 举报

签到天数: 2586 天

连续签到: 5 天

[LV.Master]至尊海神IIIIII

 楼主| 发表于 2009-11-27 21:34 | 显示全部楼层

利用SVN更新网站

利用SVN更新网站


如果你有一个假设在公网上的SVN服务器,而你的网站所在的主机允许你使用SVN客户端,并且开放了php的exec函数,那么你有福了,你可以利用SVN作为中转,更新你的网站程序。

首先,也是前提,就是你的网站程序是用SVN管理的,那么只要你的网站主机能够访问SVN,就能够使用SVN的update功能来更新程序。

准备工作一:将网站程序加上svn的控制标记,由于SVN的控制信息都存在程序所在目录的.svn子目录中,所以需要找一个空目录,并且将网站现有程序checkout到这个目录里面来,注意是checkout而不是export,因为接下来要将最新的网站程序连同他里面包含的很多个.svn目录一同上传到服务器上去。为了不让.svn目录泄露机密,要在.htaccess文件或者是httpd.conf中设定如下规则,禁止对.svn目录的访问。

<directory ~ \"\\.svn\">
Order Allow,Deny
Deny from all
</directory>
准备工作二:作一段小程序,调用服务器上的svn命令行命令,update网站程序,下面是一个写好了的简单例子。

//setup update target path
$target_ar[&#39;fwolf&#39;] = &#39;d:\\fwolf&#39;;

//setup commandline
$svn_cmd1 = &#39;d:\\server\\svn\\bin\\svn.exe update &#39;;
$svn_cmd2 = &#39; --username updatebot --password xxxxxx --no-auth-cache&#39;;

//output html string
$html = &#39;&#39;;

//recieve get parameter
$target = isset($_GET[&#39;target&#39;]) ? $_GET[&#39;target&#39;] : &#39;&#39;;
if (empty($target) || !isset($target_ar[$target]))
{
$html = &#39;Target does not correct.&#39;;
}
else
{
//execute svn update command
$cmd = $svn_cmd1 . $target_ar[$target] . $svn_cmd2;
$ar = array();
$status = 0;
exec($cmd, $ar, $status);
for ($i=0; $i < count($ar); $i++)
$ar[$i] = htmlspecialchars($ar[$i]);
$html .= &#39;Status: &#39; . $status . \"<br />\\r\\n\";
$html .= implode(&#39;<br />&#39; . \"\\r\\n\", $ar);
}
echo $html;
把这个程序放到服务器上能够访问到的地方,也可以在此基础上加上一些访问限制,那么只要访问这个程序/页面,服务器就会自动更新你的网站啦。

Status: 0
D H:\\cvswork\\svntest\\update_from_svn.php
Updated to revision 44.
这样,在利用SVN很好的管理网站程序的基础上,还实现了服务器程序的很方便的更新,一举两得!尤其是在程序上传不是十分方便的场合,用起来就更舒服了,我就是在更换了一个劣质防火墙,ftp无法正常使用的情况下想出这个怪招儿的:-)。

Update @ 2007-07-31
如果在windows主机上使用本方法,而svn服务器是采用了ssl的https://…地址,那么会遇到一点小麻烦,就是在执行svn update的时候,由于使用的是web的用户,在出现确认证书的提示信息时,用户是无法输入的:

Error validating server certificate for &#39;https://20070731.fwolf.com&#39;:
- The certificate is not issued by a trusted authority. Use the
fingerprint to validate the certificate manually!
Certificate information:
- Hostname: 20070731.fwolf.com
- Valid: from Jul 31 06:49:53 2007 GMT until Jul 28 06:49:53 2017 GMT
- Issuer: Fwolf, US
- Fingerprint: 38:43:0b:29:75:1t:ba:d8:29:8f:94:9a:10:42:a0:fe:ae:93:4d:91
(R)eject, accept (t)emporarily or accept (p)ermanently?
这时就只能用变通的方法了,首先在dos方式中使用svn up,svn会自动缓存身份验证以及ssl确认信息,这些信息保存在C:\\Documents and Settings\\Administrator\\Application Data\\Subversion目录下,然后把这个目录整体拷贝到C:\\Documents and Settings\\Default User\\Application Data\\Subversion就可以了,测试环境windows2003,并且试过复制到All Users的对应目录无效。

另外修改配置文件servers,添加ssl-trust-default-ca = yes的方式在windows下好像没有作用。

Update @ 2009-04-07
Git(ssh证书登录)也可以这样用,略有不同,我使用的客户端是msysgit:

Admin用户使用桌面操作(Git Bash)时,.ssh目录位于C:\\Documents and Settings\\Administrator\\下。
直接使用C:\\Program Files\\Git\\bin\\ssh.exe当ssh客户端时,.ssh目录要放到C:\\Program Files\\Git\\下,并且似乎忽略.ssh/config文件,私钥文件只认identity id_rsa id_dsa三个。
系统服务比如Apache运行时,使用上面一条的设置,很是诡异。
说公钥文件只认固定的三个,是从这里猜到的:

Program Files/Git$ grep identity share -R
share/git-gui/lib/sshkey.tcl: foreach name {~/.ssh/id_dsa.pub ~/.ssh/id_rsa.pub ~/.ssh/identity.pub} {
好像是写死了,并且我用config定义其他私钥它也不认。第一条中使用Git的时候没事,很正常。

同时,为了安全起见,apache里还要增加如下设置:

<Directory ~ \"\\.(git|svn)\">
Order allow,deny
Deny from all
Satisfy All
</Directory>
PCOS系统下载站:http://zhuangji.wang
回复 支持 反对

使用道具 举报

签到天数: 658 天

连续签到: 0 天

[LV.9]尊贵海王II

发表于 2009-11-29 18:18 | 显示全部楼层
搞专业才有用的!
PCOS系统下载站:http://zhuangji.wang
回复 支持 反对

使用道具 举报

本版积分规则