zoukankan      html  css  js  c++  java
  • linux 下svn同步更新钩子

    svn服务器搭建:https://www.linuxidc.com/Linux/2017-05/144254.htm

    SVN版本库中的一个项目:/svn/repositories/test/

    网站目录:/web/test/

    1、现将SVN版本库中的一个项目checkout到网站目录

    svn co file://svn/repositories/test/ /web/test/

    或者 svn co svn://(服务器ip/test/ ./ (将项目检出到当前目录下)

    2、简单同步更新思想

    做法:通过检测svn提交,服务器更新固定目录,达到同步更新的目的。

    优点:简单快捷

    缺点:每次同步都需要更新整个目录,项目一多就容易卡,更新缓慢。

    步骤如下:

    新建一个post-commit钩子

    vim /svn/repositores/test/hooks/post-commit

    添加以下代码:

    #!/bin/sh

    REPOS="$1"

    REV="$2"

    export LANG="zh_CN.UTF-8"    #防止乱码

    #设置登陆账号密码并不缓存

    svn update /web/test/ --username 帐号 --password 密码 --no-auth-cache

    注意事项:

    1)不要遗漏第一行的#!/bin/sh,否则post-commit会报代号255的错误,

    保存后,修改文件权限为755,否则SVN无法调用执行,这是一个比较安全的做法;

    (2)或者直接修改post-commit的权限为777,可省略#!/bin/sh

    (3)文件权限修改:chmod 755 /svn/repositores/test/hooks/post-commit

     

    3、同步更新优化思想

    做法:通过检测svn提交,来获取具体的更新目录或文件路径,对应更新,达到优化的   目的。

    优点:可大量缩短提交更新的时间

    缺点:需调用phpexec函数,降低安全性

    步骤如下:

    1)新建一个post-commit钩子

    vim /svn/repositores/test/hooks/post-commit

    添加如下代码:

    #!/bin/sh

    export LANG=en_US.UTF-8

    REPOS="$1"                   # 仓库的路径

    REV="$2"                     # 新提交的版本号

    LOGTIME=$(date "+%Y-%m-%d") # 日志时间

    UPFILE=/svn/log/"$LOGTIME "update.log     # 钩子脚本的日志(需创建对应目录)

    SVNLOOK=/usr/bin/svnlook # svn某一执行函数

    changed=$($SVNLOOK changed -r $REV $REPOS) # 比较改变的文件

    echo "$changed" >> $UPFILE # 输出比较结果到日志文件

    #  svn提交日志  start

    LOGFILE=/svn/log/"$LOGTIME "svn.log     # 钩子脚本的日志

    # 脚本的标准输出和标准错误输出都打印到日志文件里

    exec 1>>"$LOGFILE"

    exec 2>&1

    TIME=$(date "+%Y-%m-%d %H:%M:%S")   #提交时间

    AUTHOR=$($SVNLOOK author -r $REV "$REPOS")  #提交作者

    CHANGEDDIRS=$($SVNLOOK dirs-changed $REPOS) #修改的目录集合

    MESSAGE=$($SVNLOOK log -r $REV "$REPOS")    #提交时的备注信息,不建议用中文

    function myecho() {

        echo "$TIME" "$*"

    }

    myecho "**************************************************************"

    myecho "提交版本:$REV 作者:$AUTHOR"

    myecho "提交备注:$MESSAGE"

    myecho "修改目录:$(echo $CHANGEDDIRS | tr ' ' ' ')"

    #  svn提交日志  end

    /usr/local/php/bin/php /svn/repositories/test/hooks/svn_post_commit_resources.php # 执行脚本

    注意:标红行根据实际情况对应修改,需手动创建日志目录

    (2)新建一个php执行文件

    vim /svn/repositores/test/hooks/svn_post_commit_rescources.php

    添加以下代码:

    <?php

    //读取日志文件

    $date_time = date('Y-m-d');

    $f = file_get_contents('/svn/log/'.$date_time.' update.log');

    //以换行分割字符串,获取对应数组

    $files = explode(" ", $f);

    //判断是否数组,不是则强制转为数组

    if (!is_array($files))$files=(array)$files;

    //循环更新对应目录

    foreach ($files as $v) {

            // 取文件名

            $f_tem = trim(substr($v, 2));

    // 获取更新文件名

    $f_name = '/web/test2/' . $f_tem;

    // svn更新命令

            $cmd = "svn update '$f_name'";

            //执行svn命令

            exec($cmd, $out);

            // exec($cmd);

            //设置文件权限

            exec("chown www:www $f_name");

    }

    //删除日志文件

    // $rm_cmd = "rm -rf /svn/log/$date_time svn/log";

    // exec($cmd,$out);

    unlink('/svn/log/'.$date_time.' update.log');

    exit();

  • 相关阅读:
    [转]关于php后门的编写
    PHP写txt日志换行
    AngularJS 前端JS框架
    跨域上传
    [转] 多域名THINKPHP利用MEMCACHE方式共享SESSION数据
    关于TP的 文件目录安全
    关于浏览器内部和 手机浏览器 上传兼容
    [转]php计算到指定日期还有多少天的方法
    vi/vim下看十六进制文件
    dos2unix(windows脚本文件放到unix下运行要注意)
  • 原文地址:https://www.cnblogs.com/zhylioooo/p/8572538.html
Copyright © 2011-2022 走看看