shadowfish和他的代码

vuePress-theme-reco shadowfish    2020 - 2023
shadowfish和他的代码

Choose mode

  • dark
  • auto
  • light
时间轴

shadowfish

49

Article

42

Tag

时间轴

码云gitee WebHooks实现VuePress(git)自动部署

vuePress-theme-reco shadowfish    2020 - 2023

码云gitee WebHooks实现VuePress(git)自动部署

shadowfish 2020-08-09 GiteeVuePressWebHooks自动部署

搭建了 Vuepress 博客后,觉得每次添加博文都要在本机写好文章,再上传到服务器,再手动编译太麻烦了,于是想趁机学一学自动部署。自动部署可以通过 Github 和 Gitee,由于 Github 国内访问不稳定,Gitee 的 Pages 自动部署是付费功能,这里使用 Gitee 的免费 WebHooks 实现一个自动部署。

# 什么是 WebHooks

Gitee 提供的 WebHooks 相当于一个事件钩子,可以在仓库发生特定事件时(如 Push)自动调用,发送 POST 请求给指定的 http 地址。

利用这个功能,我们几乎可以实现一切自定义的自动部署功能。我们只要按需求实现好指定的接口就可以了。这里我用这个功能实现服务器端 Git 的自动拉取和 Vuepress 编译。

# 步骤

  1. 创建相应网站接口

  2. 在 Gitee 库中添加 WebHooks

    image.png

    在 WebHooks 新建页中,填入你的接口地址和密码。建议使用 WebHook 密码或签名密钥,防止非法调用。我使用了 WebHook 密码做验证。

  3. 添加完成后,开始编辑接口代码,这里用 php 为示例

    <?php
    
    //函数来自https://blog.csdn.net/LJFPHP/article/details/78897951,用于提取header数据
    function get_all_header()
      {
        // 忽略获取的header数据。这个函数后面会用到。主要是起过滤作用
        $ignore = array('host','accept','content-length','content-type');
    
        $headers = array();
        //这里大家有兴趣的话,可以打印一下。会出来很多的header头信息。咱们想要的部分,都是‘http_'开头的。所以下面会进行过滤输出。
    /*    var_dump($_SERVER);
        exit;*/
    
        foreach($_SERVER as $key=>$value){
          if(substr($key, 0, 5)==='HTTP_'){
          //这里取到的都是'http_'开头的数据。
          //前去开头的前5位
            $key = substr($key, 5);
            //把$key中的'_'下划线都替换为空字符串
            $key = str_replace('_', ' ', $key);
            //再把$key中的空字符串替换成‘-’
            $key = str_replace(' ', '-', $key);
            //把$key中的所有字符转换为小写
            $key = strtolower($key);
    
        //这里主要是过滤上面写的$ignore数组中的数据
            if(!in_array($key, $ignore)){
              $headers[$key] = $value;
            }
          }
        }
    //输出获取到的header
        return $headers;
    
      }
    //进行身份验证
     if(get_all_header()['x-gitee-token']!=='你的WebHook密码')
        die('error');
    $result;
    //拉取最新代码,如果输出为空则说明出错,可以在git语句后添加2>&1输出错误信息
    exec('cd yourGitPath  && sudo git fetch && sudo git reset --hard origin/master',$result);
    var_dump($result);
    //执行Vuepress编译
    exec('cd yourGitPath &&  yarn docs:build',$result);
    var_dump($result);
    ?>
    

    由于编译时间比较长,Gitee 测试时显示 Request Timeout 为正常现象,只需要等一会后查看文件是否修改成功即可

    如果返回值为空,说明 git 执行出错,可以在 git 语句后添加 2>&1 查看错误信息。第一次操作可能会遇到“sudo: no tty present and no askpass program specified”错误,则需要再进行下面的操作。

  4. 完成,现在每次推送 master 分支,服务器端都可以自动拉取并编译,我们只需要在本机进行 push 即可。

# 错误处理

# sudo: no tty present and no askpass program specified

  1. 查看 php 进程的用户名

    ps -ef | grep php
    
  2. 修改/etc/sudoers,在root ALL=(ALL) ALL下面加上php用户组 ALL=(ALL) NOPASSWD: ALL

    root    ALL=(ALL)       ALL
    php用户组 ALL=(ALL)  NOPASSWD: ALL
    
  3. 保存后,测试是否能够运行成功。如果依然不行,尝试把需要拉取的文件夹权限用户全部设为 php 用户组。如果出现sudo: unable to initialize policy plugin错误,请按照提示仔细检查/etc/sudoers文件内的语句格式。

# 其他自动部署方法

使用 WebHooks 进行部署有一个缺点:项目打包过程在服务器上进行,占用了服务器的资源。对于低配服务器来说,其实可以采用另一种直接上传打包完成的文件的方法:SCP2