php管理svn

1.环境

WEB测试、SVN服务器: 35.35.0.1

PHP版本: 7

web测试地址: http://35.35.0.1

web测试环境路径 /home/wwwroot

svn对外路径: svn://35.35.0.1

svn库路径:/home/svn

svn管理脚本: http://35.35.0.1/svn.php  /home/wwwroot/svn.php

线上服务器 122.55.11.33

web目录 /home/test


  1. vi /home/svn/hooks/post-commit

  2. #!/bin/bash
    export.utf-8
    
    REPOS="$1"
    REV="$2"
    echo `/usr/bin/php -f /home/wwwroot/svn.php` >> /home/svn.log
    echo "$REPOS" "$REV" >> /home/svn.log
  3. chmod u+x /home/svn/hooks/post-commit

  4. 线上服务器安装rsync,参考博文http://my.oschina.net/u/232595/blog/474674 第一点

  5. 测试服务器安装rsync,参考博文http://my.oschina.net/u/232595/blog/474674 第五点

  6. 配置线上服务器rsync(配置文件详解见http://www.cnblogs.com/lykyl/archive/2013/04/10/rsync.html) vi /etc/rsyncd.conf

  7. pid file = /var/run/rsyncd.pid
    port = 873
    address = 122.55.11.33
    uid = www
    gid = www
    use chroot = yes
    max connections = 1
    log file = /home/log/rsync.log
    motd file = /etc/rsyncd.motd
    log format = %t %a %m %f %b
    
    [test]
    path = /home/test/
    list = yes
    ignore errors
    auth users = root
    secrets file = /etc/rsyncd.secrets
    comment = test
    read only = false
  8. 设置密码 vi /etc/rsyncd.secrets

  9. 用户名:密码  root:1111111
  10.   修改WEB目录权限 chmod -R 755 /home/test

  11. 编写脚本 vi /home/wwwroot/svn.php

  12. <?php
    $users = [
     'admin' => '111111',
     'tester' => '222222'
    ];//管理页面的账号密码
    $svn_base_path = '/home/svn/';//svn版本库目录
    $svn_url = 'svn://35.35.0.1';//svn版本库访问地址
    $test_web_base_path = '/home/wwwroot/';//测试WEB目录绝对路径
    $svn = [
     'command_path' => '/usr/bin/',
     'user' => 'user',//svn账号
     'password' => 'password'//svn对应密码
    ];
    $projects = [//项目
     '项目英文名' => [
     'name' => '项目中文名',
     'svn_path' => $svn_url.'/项目英文名',//这里是项目在版本库的访问路径
     'test_web_path' => $test_web_base_path.'project_name',//project_name这里是测试环境项目访问目录名
     'publish' => [
     'password' => '1111111',//这里是第八步配置的密码
     'path' => 'root@122.55.11.33::test/project_name/',//project_name这里是正式环境项目访问目录名
     'exclude' => [//不被更新的文件或目录的集合,例如svn文件、附件文件、缓存文件等
     '.svn',
     ]
            ]
        ],
    ];
    if(isset($argv)){//控制台调用
     $output = [];
     $projectNames = [];
     exec($svn['command_path'].'svnlook changed '.$svn_base_path.' 2>&1', $output);
     foreach($output as $path){
     $name = substr($path, 4, strpos($path, "/") - 4);
     if(!in_array($name, $projectNames)){
     $projectNames[] = $name;
     update($projects[$name], $svn);
     }
        }
     exit();
    }
    session_start();
    
    ?>
    <?php if(null == $_SESSION['user']){
     if($_SERVER['REQUEST_METHOD'] == "POST"){
     $name = $_POST['name'];
     $password = $_POST['password'];
    
     if(!array_key_exists($name, $users)){?>
     login fail, no user;<script>setTimeout('location.href="svn.php"', 1000);</script>
     <?}else{
     if($users[$name] != $password){?>
     password error!<script>setTimeout('location.href="svn.php"', 1000);</script>
     <?}else{
     $_SESSION['user'] = $name;
     show($projects);
     }
            }?>
     <?php }else{?>
     <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>登陆</title>
            </head>
            <body>
            <form method="post" action="svn.php">
                <p>
     用户名:<input name="name"/>
                </p>
                <p>
     密码:<input name="password"/>
                </p>
                <p>
                    <input type="submit" value="登陆">
                </p>
            </form>
            </body>
            </html>
     <?php }?>
    <?php }else{
     if($_SERVER['REQUEST_METHOD'] == "POST"){
     switch($_REQUEST['action']){
     case 'logout':
     unset($_SESSION['user']);
     ?>
     logout success;<script>setTimeout('location.href="svn.php"', 1000);</script>
     <?php
                    break;
     case 'checkout':
                    checkout($projects[$_POST['project']], $svn, $projects);
     break;
     case 'publish':
                    publish($projects[$_POST['project']], $projects);
     break;
     default:
                    show($projects);
     break;
     }
        }else{
            show($projects);
     }
    
    }?>
    <?php
        function show($projects){?>
     <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>Title</title>
            </head>
            <body>
            <form action="svn.php" method="post">
                <p>
     项目:
                    <select name="project">
     <?php foreach($projects as $key => $project){?>
     <option value="<?=$key?>"><?=$project['name']?></option>
     <?php }?>
     </select>
                </p>
     <?php if($_SESSION['user'] == 'admin'){?>
     <p>
     动作:
                        <select name="action">
                            <option value="publish">发布</option>
                            <option value="checkout">迁出</option>
                        </select>
                    </p>
     <?}else{?>
     <input type="hidden" name="action" value="push">
     <?php }?>
     <p>
                    <input type="submit" value="发布">
                </p>
            </form>
    
            <form action="svn.php?action=logout" method="post">
                <input type="submit" value="登出"/>
            </form>
            </body>
            </html>
    <?}?>
    <?php
     function checkout($project, $svn, $projects)
    {
        if (file_exists($project['test_web_path'])) {
            echo 'project had checkout to path "' . $project['test_web_path'] . '"';
        } else {
            set_time_limit(0);
            ignore_user_abort(true);
            mkdir($project['test_web_path']);
            chmod($project['test_web_path'], 0755);
            putenv('LANG=C.UTF-8');
            exec('cd ' . $project['test_web_path']);
            print exec($svn['command_path'] . 'svn co --username ' . $svn['user'] . ' --password ' . $svn['password'] . ' ' .
                $project['svn_path'] . ' ' . $project['test_web_path'] . ' 2>&1');
            echo '迁出到测试环境成功';
            show($projects);
        }
    }
    
    function publish($project, $projects)
    {
        $command = '/usr/bin/rsync -arpvzP --delete';
        if (count($project['publish']['exclude'])) {
            foreach ($project['publish']['exclude'] as $f) {
                $command .= ' --exclude' . " '" . $f . "'";
            }
        }
        $command .= ' ' . $project['test_web_path'] . '/ ' . $project['publish']['path'] . ' 2>&1';
        $output = [];
        exec("RSYNC_PASSWORD=" . $project['publish']['password'] . " \n export RSYNC_PASSWORD \n " . $command, $output);
        echo '发布成功';
        show($projects);
    }
    
    
    function update($project, $svn)
    {
        print exec($svn['command_path'] . 'svn update --non-interactive --no-auth-cache --force --accept theirs-full --username '
            . $svn['user'] . ' --password ' . $svn['password'] . ' ' . $project['test_web_path'] . ' 2>&1');
    }
    ?>

注意:请保证exec函数可用


转载于:https://my.oschina.net/u/232595/blog/552220

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值