码云webHook自动部署

  1. 引文
  2. 参考
  3. 具体实现过程
  4. 容易出现的问题(权限,git记住密码,shell_exec开启)
  5. 结语

1.引文

说来惭愧,刚刚开始接触GIT,限于英文水平选择码云。不过码云也不错啦私有免费。公司的程序放到了,但是测试情况下每次改完代码还要去服务器pull这也太麻烦了叭,就打起了wenHook的注意,百度一下果然可行(不过正式服务器不推荐用,因为要使用PHP的shell_exec函数,不够安全),不过作为一个菜鸟还是折腾了一段时间。遂贴出详细教程,仅供各位同样的菜鸟们共同学习。


2.参考


3.具体实现过程

在码云添加webHook的通知地址

准备PHP接收通知程序

<?php
//自动部署
$git = "/usr/local/git/bin/git"; //默认是用git全局变量,有的环境可能要指明具体安装路径(我是需要置顶的)
$branch = ""; //指定pull分支,为空就是默认分支(本地的分支绑定好了远程的分支就不要指定)
$logName = "git_data"; //本地日志名称,与当前php文件在同一目录
$savePath = "/home/wwwroot/blog/"; //网站根目录,初次克隆确保目录为空
$gitSSHPath = ""; //代码仓库SSH地址
$password = ''; //在GITEE设置的密码
$is_test = false; //测试模式,无需密码:true打开,平时false关闭
$isCloned = true; //设置是否已经Clone到本地,true:已经clone,直接pull,false:先clone. //如果已经clone过,则直接拉去代码

if ($isCloned) {
    $requestBody = file_get_contents("php://input");
    if (empty($requestBody) && empty($is_test)) {
        die('send fail');
    } //解析码云发过来的JSON信息
    $content = json_decode($requestBody, true); //若是主分支且提交数大于0 //密码要正确
    if ($content['password'] == $password || !empty($is_test)) {
        if ($content['total_commits_count'] > 0 || !empty($is_test)) {
            if ($content['ref'] == "refs/heads/$branch" || !$branch || !empty($is_test)) {
                $cmd = "cd $savePath && $git reset --hard && $git clean -f && $git pull $branch 2>&1";
                $result = shell_exec($cmd); //关键命令,拉取代码,2>&1后台执行
                $res_log = "[ PULL START ]" . PHP_EOL;
                if (!empty($is_test)) {
                    $res_log.= date('Y-m-d H:i:s') . '执行测试。' . PHP_EOL;
                } else {
                    $res_log.= date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '项目的' . $content['ref'] . '分支push了' . $content['total_commits_count'] . '个commit:' . PHP_EOL;
                }
                $res_log.= $cmd . PHP_EOL;
                $res_log.= $result . PHP_EOL;
                $res_log.= "[ PULL END ]" . PHP_EOL;
                $res_log.= PHP_EOL . PHP_EOL;
                file_put_contents($logName . ".log", $res_log, FILE_APPEND); //写入日志
                echo $result;
            }
        }
    } else {
        file_put_contents($logName . ".log", '密码错误!', FILE_APPEND);
        echo '密码错误!';
    }
} else {
    $res = "[ CLONE START ]" . PHP_EOL;
    $res.= shell_exec("$git clone $gitSSHPath $savePath") . PHP_EOL;
    $res.= "[ CLONE END ]" . PHP_EOL;
    file_put_contents($logName . ".log", $res, FILE_APPEND); //写入日志
}

说明

我的做法是给自动部署专门做了个虚拟主机,这样就不用担心自动部署代码不小心传到了git代码仓,想改一下自动部署的代码也可以直接在服务器vim编辑。


4.容易出现的问题(权限,git记住密码,shell_exec开启)

PHP无权限执行拉取命令

比如我的网站根目录是/home/wwwroot/blog/,确认一下blog目录Nginx或者Apache有权限,我是把目录的用户所属用户改为了PHP-fpm的用户:WWW(这个根据自己的实际情况来)

具体如何查看请点击链接:

//修改文件夹所属用户组及用户命令
chown -R www:www /home/wwwroot/blog
chown -R 用户组:用户 文件夹路径

git记住密码

我用的是https的方式连接的代码仓,所以需要记住一下密码,命令如下:

git config –global credential.helper store

你如果用的ssh当我没说emmmmm

shell_exec开启

找到PHP.ini编辑
或者要先关掉安全模式 safe_mode = off,我不确定,我搜索到的结果告诉需要关闭。我自己没有操作这一步也可以。

//禁用函数列表
disable_functions = proc_open, popen, exec, system, shell_exec, passthru


结语

虽然可能在大佬看来不难,不过着实还是恶心了我好久,共勉。

本文系作者 @ 原创发布在 SUNNY。未经许可,禁止转载。

喜欢()
评论 (1)
热门搜索
佳靓
一个程序猿和一个摄影爱好者
9 文章
2 评论
10 喜欢
Top