Skip to content

svn 和 git webhook的使用 #70

Open
@yangweijie

Description

@yangweijie

最近由于想提高代码提交的效率不再git commit && git push 和 svn commit 后每次要去服务器更新代码。
就参考了 分享下使用svn或者git时,测试服务器代码自动更新、线上服务器代码手动更新的配置经验 孟康的文章。没有配置服务器上的文件

svn 用的svn bucket 免费的自带钩子

tim 20181008162318

这个工具比较好的是有钩子请求历史记录。

然后写了项目里的控制器代码:

<?php
namespace app\dev\home;

use think\Controller;

/**
 * Svn钩子
 * @package app\install\controller
 */
class Svn extends Controller
{

    protected function _initialize()
    {
        define('SVN_TOKEN', 'guihzip');
        header("Cache-Control:no-cache,must-revalidate");
    }

    public function commit()
    {
        header("Cache-Control:no-cache,must-revalidate");
        extract($_POST);
        if ($token == SVN_TOKEN) {
            switch ($event) {
                case 'test':
                    return 'ok';
                    break;
                case 'start-commit':
                    return 'ok';
                    break;
                default:
                    // ptrace($log);

                    if(stripos($log, '@commit') !== false){
                        $username   = 'XXXXX';
                        $password   = 'XXXXX';
                        $target_dir = realpath('..');
                        // ptrace($target_dir);
                        ini_set('disable_functions', '');
                        exec("sudo svn up --username {$username} --password {$password} --no-auth-cache {$target_dir} 2>&1", $output, $outresult);
                        ptrace(implode(PHP_EOL, $output).PHP_EOL.$outresult);
                        if ($outresult === 0) {
                            // echo '更新成功!';
                            //echo print_r($output);
                            return 'ok';
                        } else {
                            // echo '更新失败!';
                            // echo print_r($output);
                            return 'failed';
                        }
                    }else{
                        return 'no up';
                    }
                    break;
            }
        } else {
            return 'error token';
        }
    }
}

钩子运行时会报各种没权限,因为我的项目是root clone 出来的。于是查找各种办法,

php利用root权限执行shell脚本(二)

加入了www 用户组后 执行的svn 命令前面一定要带sudo 就可以了。

接下来是git 用的oschina 后来换名为了 gitee 。

在项目里 新增钩子,咱们只管push的钩子

image

对应的代码:

<?php
namespace app\dev\home;

use think\Controller;

/**
 * Git钩子
 * @package app\install\controller
 */
class Git extends Controller
{

    protected function _initialize()
    {
        define('GIT_TOKEN', 'guihzip');
        header("Cache-Control:no-cache,must-revalidate");
    }

    public function push()
    {
        header("Cache-Control:no-cache,must-revalidate");
        // ptrace($_POST);
        $rws_post = file_get_contents('php://input');
        $_POST = json_decode($rws_post, 1);

        // ptrace($_POST);
        extract($_POST);
        $header = $this->request->header();
        // ptrace($header);
        $token = $header['x-gitee-token'];
        $event = $header['x-gitee-event'];
        if ($token == GIT_TOKEN) {
            switch ($event) {
                case 'test':
                    return 'ok';
                    break;
                case 'start-commit':
                    return 'ok';
                    break;
                default:
                    // ptrace($log);
                	$log = $head_commit['message'];
                    if(stripos($log, '@push') !== false){
                        error_reporting ( E_ALL );
			$dir = realpath('..');//该目录为git检出目录
			exec("sudo cd {$dir} && git pull origin master 2>&1", $output, $outresult);
                        ptrace(implode(PHP_EOL, $output).PHP_EOL.$outresult);
                        if ($outresult === 0) {
                            // echo '更新成功!';
                            //echo print_r($output);
                            return 'ok';
                        } else {
                            // echo '更新失败!';
                            // echo print_r($output);
                            return 'failed';
                        }
                    }else{
                        return 'no up';
                    }
                    break;
            }
        } else {
            return 'error token';
        }
    }
}

git 遇到的问题:

1) 没有账号密码
2)git pull 说没有指定分支

第一个问题 通过 设置remote url 为带名称 密码的 地址就行 https://www.jianshu.com/p/8020de245f6a

第二个问题 通过 git branch --set-upstream 本地关联远程分支

孟康文章里的 output 不是一个字符串要自行转换。
gitee 里的post不是传统post 7.2 里 全局变量
$rws_post = $GLOBALS['HTTP_RAW_POST_DATA'];
$mypost = json_decode($rws_post,1);
方式 已经获取不到了 必须 file_get_contents('php://input'); 获取
x-gitee-token 在 gitee 的文章里 其实是大写的, 可能我的nginx环境不同,所以大家要自己调试一下获取header 看看。
ptrace 是自己封装的 钉钉告警函数,大家可以换成发邮件。

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions