码云gitee WebHooks实现VuePress(git)自动部署
搭建了 Vuepress 博客后,觉得每次添加博文都要在本机写好文章,再上传到服务器,再手动编译太麻烦了,于是想趁机学一学自动部署。自动部署可以通过 Github 和 Gitee,由于 Github 国内访问不稳定,Gitee 的 Pages 自动部署是付费功能,这里使用 Gitee 的免费 WebHooks 实现一个自动部署。
# 什么是 WebHooks
Gitee 提供的 WebHooks 相当于一个事件钩子,可以在仓库发生特定事件时(如 Push)自动调用,发送 POST 请求给指定的 http 地址。
利用这个功能,我们几乎可以实现一切自定义的自动部署功能。我们只要按需求实现好指定的接口就可以了。这里我用这个功能实现服务器端 Git 的自动拉取和 Vuepress 编译。
# 步骤
创建相应网站接口
在 Gitee 库中添加 WebHooks
在 WebHooks 新建页中,填入你的接口地址和密码。建议使用 WebHook 密码或签名密钥,防止非法调用。我使用了 WebHook 密码做验证。
添加完成后,开始编辑接口代码,这里用 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”错误,则需要再进行下面的操作。
完成,现在每次推送 master 分支,服务器端都可以自动拉取并编译,我们只需要在本机进行 push 即可。
# 错误处理
# sudo: no tty present and no askpass program specified
查看 php 进程的用户名
ps -ef | grep php
修改
/etc/sudoers
,在root ALL=(ALL) ALL
下面加上php用户组 ALL=(ALL) NOPASSWD: ALL
root ALL=(ALL) ALL php用户组 ALL=(ALL) NOPASSWD: ALL
保存后,测试是否能够运行成功。如果依然不行,尝试把需要拉取的文件夹权限用户全部设为 php 用户组。如果出现
sudo: unable to initialize policy plugin
错误,请按照提示仔细检查/etc/sudoers
文件内的语句格式。
# 其他自动部署方法
使用 WebHooks 进行部署有一个缺点:项目打包过程在服务器上进行,占用了服务器的资源。对于低配服务器来说,其实可以采用另一种直接上传打包完成的文件的方法:SCP2