美文网首页
2020-05-20码云webhooks版本自动推送配置及代码

2020-05-20码云webhooks版本自动推送配置及代码

作者: longtianze | 来源:发表于2020-02-28 14:48 被阅读0次

            公司开发团队使用码云版本管理,近期开发新的网站,要使用码云的webhooks版本自动推送功能,其实以前配置开发过,但没有记录操作过程和相关代码,这次又耗费了几个小时才配置开发好,感觉这些操作过程需要记录下来以备后用,也感觉有共享的价值,所以写这篇文章介绍相关经验。

          新的网站用php框架thinkphp5.1开发,所以相关代码也是thinkphp5.1的。

           首先,要测试服务器的php用户,可以用代码echo exec('whoami')获取php网页的用户,有的用户名是apache,有的用户名是www,把.git文件夹下的文件FETCH_HEAD的用户组归属者修改为现有的用户名apache或www,如果exec函数不可用,要修改php.ini,先在php.ini里找到php.ini里面的disable_functions = exec , popen, system …然后把这个里面的exec去掉,如果其中有shell_exec也去掉,后面的代码有用,最后再重启下apache或nginx就可以用了。

         然后,检查服务器的php用户在服务器的git是否可以做git pull操作,如果不能,需要在php用户的名下重新生成公钥,把公钥加入码云的设置里的公钥列表,重新克隆码云的版本,shell脚本是:git clone git@gitee.com:xxx/xxx.git xxx。

         然后,在网站代码的文件夹application下创建文件夹webhooks,在webhooks下创建文件夹controller,在controller下创建网页Index.php,在Index.php里加入如下代码:

    <?php

    namespace app\webhooks\controller;

    use think\Controller;

    class Index extends Controller{

        public function index(){

    //git webhook 自动部署脚本

    //项目存放物理路径,第一次clone时,必须保证该目录为空

    $savePath = "/www/wwwroot/xxx";

    $gitPath  = "git@gitee.com:xxx/xxx.git";//代码仓库

    $email = "xxx@xxx.com";//用户仓库邮箱

    $name  = "xxx";//仓库用户名,一般和邮箱一致即可

    $isClone = true;//设置是否已经Clone到本地,true:已经clone,直接pull,false:先clone.

    //如果已经clone过,则直接拉去代码

    if ($isClone) {

    $requestBody = file_get_contents("php://input");

    if (empty($requestBody)) {

    die('send fail');

    }

    //解析Git服务器通知过来的JSON信息

    $content = json_decode($requestBody, true);

    //$str='|'.$content['ref'].'--'.$content['total_commits_count'];

    //file_put_contents("git-webhook_log.txt",$str, FILE_APPEND);

    //若是主分支且提交数大于0

    if ($content['ref']=='refs/heads/master' && $content['total_commits_count']>0) {

            shell_exec("cd {$savePath} && git pull {$gitPath} 2>&1");//拉代码

    /* $res = PHP_EOL."pull start --------".PHP_EOL;

    $res .= shell_exec("cd {$savePath} && git pull {$gitPath}");//拉去代码

    $res_log = '-------------------------'.PHP_EOL;

    $res_log .= $content['user_name'] . ' 在' . date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '项目的' . $content['ref'] . '分支push了';

    $res_log .= $content['total_commits_count'] . '个commit:';

    $res_log .= $res.PHP_EOL;

    $res_log .= "pull end --------".PHP_EOL;

    file_put_contents("git-webhook_log.txt", $res_log, FILE_APPEND);//写入日志到log文件中*/

    }

    }

    /*else {

    $res = "clone start --------".PHP_EOL;

    //注:在这里需要设置用户邮箱和用户名,不然后面无法拉去代码

    $res .= shell_exec("git config --global user.email {$email}}").PHP_EOL;

    $res .= shell_exec("git config --global user.name {$name}}").PHP_EOL;

    $res .= shell_exec("git clone {$gitPath} {$savePath}").PHP_EOL;

    $res .= "clone end --------".PHP_EOL;

    file_put_contents("git-webhook_log.txt", $res, FILE_APPEND);//写入日志到log文件中

    }*/

        }

    }

    然后,到码云配置webhooks参数,把上一步创建的Index.php运转路径加入webhooks参数的url,如果要加上密码,那需要到Index.php加上密码验证,参数加好了,就可以测试了。

    测试也可以修改网页直接运转网页,$result= shell_exec("cd {$savePath} && git pull {$gitPath} 2>&1");var_dump($result);,加入了2>&1,$result可以获取报错信息。

    相关文章

      网友评论

          本文标题:2020-05-20码云webhooks版本自动推送配置及代码

          本文链接:https://www.haomeiwen.com/subject/dtzkhhtx.html