目标:SVN版本库提交,服务器中的工作拷贝能自动update。

实现方法:subversion, curl,php脚本实现,并且入mysql库来进行管理。改hosts文件来进行访问!提交触发钩子脚本时调用 curl 访问内网php脚本,内网内svn更新

基本思路:默认情况下,版本库的hooks子目录中包含各种版本库钩子模板。如下图:

钩子是通过版本库事件触发,例如新版本的创建或一个未版本化属性的修改。一些钩子(“pre hooks”)在事件发生前运行,可以用来报告发生了什么以及防止它发生。还有一些钩子(“post hooks”)在版本库事件之后发生,只是用来报告。这里我们要用post-commit钩子,在版本库提交事件发生后,更新服务器的工作拷贝。

深入了解hooks:对每种钩子的都有一个模板,通过查看这些脚本的内容,我们能看到是什么事件触发了脚本及如何给传递数据。要实际安装一个可用的钩子,我们需要在repos/hooks目录下安装一些与钩子同名(如 start-commit或者post-commit)的可执行程序或脚本。例如,在linux下,我们需要复制模板,去掉后缀名 .tmpl,自定义钩子的内容,并使之成为一个可执行地脚本;Windows用文件的扩展名来决定一个程序是否可运行,所以我们要使程序的基本名与钩子同名,同时,它的扩展名是Windows系统所能辨认的,例如exe、com和批处理的bat。

如何使用hooks:在版本库hooks目录下新建文件 post-commit 并输入如下内容保存:

#!/bin/sh
export LANG=en_US.UTF-8
# 以www身份更新svn
su - www -c "svn up /home/www/zmqnw_mobile --accept theirs-full" curl -s http://192.168.1.60/distribute?project=zmqnw_mobile

碰到问题:实际情况是,SVN服务端和需要自动更新的测试环境不在同一台服务器。svn update 命令无法触发远程服务器的更新。

解决方案:思路——在钩子里向测试服务器发送HTTP请求,测试服务器收到请求后,通过php的system函数本地调用svn up 命令,实现测试服务器的工作拷贝的更新。两件事情:

1.测试服务器安装 linux版svn客户端(下载地址,),在web根目录下新建svnupdate.php文件。代码如下:

<?php

empty($_GET['path']) && die('miss params');

$paramArr = explode('|||', $_GET['path']);

$path = $paramArr[0];

$username = isset($paramArr[1])?$paramArr[1]:'';

$password = isset($paramArr[2])?$paramArr[2]:'';

$res = exec("export LANG='zh_CN.GBK' && /usr/bin/svn up $path --username='$username' --password='$password'");

if (strpos($res, '修订版')!== false) echo '成功更新到5.211';

2.SVN服务器版本库中hooks目录下post-commit.bat 修改如下:

其中ab.exe是apache下的压测工具;参数path格式:测试服务器工作拷贝路径[|||SVN用户名[|||SVN密码]],若有特殊字符需urlencode。

碰到的新问题:在我们的配置中,php-fpm进程以www:www运行,在调用exec和system函数时,其参数中的命令也以www:www执行,而/usr/bin/svn的执行需要 root 身份,所以上面的svnupdate.php不可能成功更新工作拷贝。

解决方案:

让/usr/bin/svn可以以www:www执行;

SVN跨服务器自动更新--实现文件分发的更多相关文章

  1. linux 设置svn钩子实现自动更新

    一.svn安装设置 1.安装svn启动 yum install subversion 2.建个svn的根目录,因为项目不止一个 mkdir -p /home/svn/3.新建一个新的空的版本仓库(su ...

  2. CentOS 7 环境下部署 SVN 并实现自动更新(版本库放在Tomcat下)

    1.安装 SVN 1.1先检查是否有安装 svn rpm -qa subversion #没有什么显示就说明没有安装过yum remove subversion #如果有安装就运行删除老版本yum i ...

  3. ASP.NET、JAVA跨服务器远程上传文件(图片)的相关解决方案整合

    一.图片提交例: A端--提交图片 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string u ...

  4. Wix 安装部署教程(十二) -- 自动更新WXS文件

    上一篇分享了一个QuickWIX,用来对比两个工程前后的差异,但是这样还是很繁琐,而且昨天发现有Bug,目录对比有问题.这次改变做法,完全让程序自动去更新WXS文件,然后再用CCNet去自动编译,这样 ...

  5. git 利用hook 实现服务器自动更新代码

    如何利用git的hook实现提交代码后自动更新? 因为个人开发经常需要提交代码,每次都需要连接服务器去pull代码,重启服务器就显得十分繁琐,因此github提供了一个时间钩子,用户push代码后可以 ...

  6. python自动更新pom文件

    前言 项目越来越多,版本管理越来越麻烦,在项目上我使用 maven version 来进行版本管理.主要还是在分布式项目中模块众多的场景中使用,毕竟各个模块对外的版本需要保持统一. 关于这个插件如何使 ...

  7. C# protobuf自动更新cs文件

    网上的教程大都是手动通过protoc编译, 比较难用 给当前工程添加"Google.Protobuf"和"Grpc.Tools"的引用(通过nuget), 然后 ...

  8. Centos6.8实现SVN提交后自动更新目录

    1.创建svn目录 mkdir /var/www/project 2.从服务器的本地svn上checkout最新版本代码到www目录下的project文件夹,注意本地svn服务器地址和端口号是在启动s ...

  9. svn版本信息自动更新到源代码

     背景:在线上代码和线下代码不一致时,用这个时间先比对是很重要的,首先看时间确定是不是最新的代码,再进行问题排查是很有必要的.Subversion 的 svn:keywords 是一个非常有用的功能, ...

随机推荐

  1. DDD实战成绩管理---用户故事

    本次DDD实践选取我们都熟悉的高校成绩管理作为例子. (一).需求描述 每学期学校教务处老师会进行教学安排,具体就是建立教学班,指定该教学班代课教师,上课学生,然后进行排课(忽略此部分,这是另一个系统 ...

  2. 测试Websocket建立通信,使用protobuf格式交换数据

    接到一个应用测试,应用实现主要使用websocket保持长链接,使用protobuf格式交换数据,用途为发送消息,需要我们测试评估性能,初步评估需要测试长链接数.峰值消息数以及长期运行稳定性 整体需求 ...

  3. 自动化运维工具saltstack03 -- 之SaltStack的数据系统

    SaltStack数据系统 saltstack有两种数据系统:grains与pillar 1.SaltStack数据系统之grains grains可以收集minion端的静态数据(即机器启动时收集一 ...

  4. qt cout输出中文乱码解决记录

    工具 -> 选项-> 文本编辑器-> 行为 -> 文件编码->默认编码改为System 乱码原因: 默认用utf-8编码,控制台默认gbk编码,编码不一致导致的乱码

  5. shell基础 -- 入门篇

    shell 英文含义是“壳”,这是相对于内核来说的,shell 也确实就像是内核的壳,通常来说,所有对内核的访问都要经由 shell .同时,shell 还是一门功能强大的编程语言.shell 是 L ...

  6. Amazon Headlines Update on Activity in US West Coast Ports

    According to news reports, freighter cargo may not be offloaded at U.S. West Coast ports from Februa ...

  7. CF 1008B Turn the Rectangles(水题+贪心)

    There are n rectangles in a row. You can either turn each rectangle by 90 degrees or leave it as it ...

  8. 食物链 POJ 1182(种类并查集)

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  9. python apply()函数

    python apply函数的具体的含义: apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数.args是一个包含将要提供 ...

  10. windows+ubuntu时间修改问题

    只需要在ubuntu系统数输入一行指令即可 timedatectl set-local-rtc 1 --adjust-system-clock