唯品秀前端博客

很抱歉网站傍晚岩机3个多小时。因为最近看到有瓜娃子在我面前耍帅,说他的项目都不用手动更新就可以直接上线,只要把代码提交到仓库即可,听到这话你能忍么?我忍不了。。。于是我就用脚趾头想了下,大概猜到其原理无非就是提交到git仓库后触发某个监听机制,如果监听代码有更新,通知线上服务器执行脚本拉取代码,我想大概就做这么件事,事实也正是如此,于是傍晚一直通过博客线上服务器直接捣鼓,导致那么一会儿没完全捣鼓好,就岩机了下,好尴尬。。。下面以github项目来讲解具体怎么实现。

找对对应项目仓库

首先我现在GitHub上创建了一个项目,项目创建之后我们需要对该项目设置(Settings),里面有一选项Webhooks,点击进去

服务器配置

最后我们需要在服务器上创建PHP文件(git-webhook.php,可自定义名称)来接收,你可以放在网站任何目录下,该文件地址就是要填写在我们上面github配置中通知服务器更新的hook地址,我博客后台是php语言所以用php实现,这不是重点,重点你要知道流程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
//git webhook 自动部署脚本
$requestBody = file_get_contents("php://input"); //该方法可以接收post传过来的json字符串
if (empty($requestBody)) { //判断数据是不是空
    die('send fail');
}
$content = json_decode($requestBody, true); //数据转换
//若是主分支且提交数大于0
if ($content['ref'] == 'refs/heads/master') {
    //PHP函数执行git命令
    $res = shell_exec('cd /www/wwwroot/wp-content/themes/Art_Blog/
           && git reset --hard origin/master && git clean -f
           && git pull 2>&1 && git checkout master'
);

    //$file 是我们通过触发hook通过上面shell_exec命令拉取到的仓库代码到了/www/wwwroot/wp-content/themes/Art_Blog/目录下
    $file = '/www/wwwroot/wp-content/themes/Art_Blog/dist';
    //$newFile 再将上面拉取到的代码dist里面打包文件复制到网站实际项目地址文件夹(也就是我网站主题Art_Blog目录下)
    $newFile = '/www/wwwroot/wp-content/themes/Art_Blog/';
    file_copy($file, $newFile);

    $res_log = '-------------------------' . PHP_EOL;
    $res_log.= ' 在' . date('Y-m-d H:i:s') . '向' . $content['repository']['name']
               . '项目的' . $content['ref'] . '分支push' . $res;
    //将每次拉取信息追加写入到日志里
    file_put_contents("git-webhook.txt", $res_log, FILE_APPEND);
}

function file_copy($src, $dst) {
    $dir = opendir($src);
    @mkdir($dst);
    while (false !== ($file = readdir($dir))) {
        if (($file != '.') && ($file != '..')) {
            if (is_dir($src . '/' . $file)) {
                file_copy($src . '/' . $file, $dst . '/' . $file);
            } else {
                copy($src . '/' . $file, $dst . '/' . $file);
            }
        }
    }
    closedir($dir);
}

上传.git文件到服务器

这一步网上大多都没提,当然会者不难难者不会,如果第一次玩可能还没明白具体原理玩法,导致失败,因此在这里我尽可能每一步都说详细点

我们通过上面已经创建好了hook文件,并且在github后台中配置了该文件地址,那是否现在推送就可以达到目的?显示是不行,因为我们还要将本地的.git文件上传到服务器上,这时你应该明白,实际我们就是通过hook去触发自动在服务器上拉取仓库代码

php执行xsell_exec命令没反应?

  1. 文件权限不够,执行命令 chmod 755 git-webhook.php 无效?执行命令 chmod 777 git-webhook.php
  2. 在php.ini下进行更改(通过宝塔很容易看到,如下图) ,查找disable_function,去掉exec和xsell_exec,重启php

注意

  1. 因国内github访问十分不稳定,所以如果是通过GitHub推送方式进行自动更新部署失败率很高(亲测高达40%+),可以通过码云gitee仓库解决,用起来还是比较nice的
  2. 一旦通过此方式更新线上代码,就不要轻易试图在推送失败后手动再通过ftp更新,否则很容易导致线上代码混乱冲突,除非是你清楚该操作可能引起的后果有意为之

小结

流程就是,代码仓库向服务器发出指令告诉自己有更新,然后服务器收到指令去拉仓库新的代码,了解流程,再去看任何这类部署,就都是大致相通的。

本站所有文章、图片、资源等如无特殊说明或标注,均为来自互联网或者站长原创,版权归原作者所有;仅作为个人学习、研究以及欣赏!如若本站内容侵犯了原著者的合法权益,可联系我们进行处理,邮箱:343049466@qq.com
赞(8) 打赏
标签:

上一篇:

下一篇:

相关推荐

1 条评论关于"GitHub项目代码提交后自动同步部署到线上服务器"

表情

最新评论

  1. 曾几何时下雪之日
    Windows 10 Firefox 47.0

    关注一下。。。。

  2. 暂无留言哦~~
谢谢你请我吃鸡腿*^_^*

支付宝扫一扫打赏

微信扫一扫打赏