我的博客支持服务


背景需求

我的博客是使用Hugo开发的,代码存放在Gitee上,每次写来新的东西后git push上去,然后到服务器上git pull && hugo来更新。

这里会有一个需求——通过程序来执行这个更新代码并编译的操作。Gitee有WebHook功能,我需要开发一个接口绑定到WebHook,接口内执行更新操作即可。

设计思路

需求1.过滤非法请求

WebHook会发起一个Post请求,在Request Header中通过X-Gitee-Token携带令牌。所以需要一个Interceptor过滤掉没有带有这个Header的请求。

需求2.通过Java执行Shell命令

原来是手动在命令行执行git pull && hugo。现在需要在Java程序中执行Shell命令,所以需要一个工具来做这个事,Apache Commons Exec是一个这样的库。这里有一个简单的例子

技术方案

  • Spring Boot创建项目
  • Spring Web提供Web接口
  • Apache Commons Exec提供执行shell命令的能力。exec官网API文档

流程图

流程图

这其中有两个点是我没有做过的,一个是拦截器(检查是否带有X-Gitee-Token的),一个是执行shell命令。

代码实现

拦截器

找到了Spring Web MVC的文档,分两步,一是实现org.springframework.web.servletHandlerInterceptor拦截器接口,二是配置拦截器。

实现拦截器

1
2
3
4
5
6
public class GiteeInterceptorAdapter implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
        // ...
        return true;
    }
}

配置拦截器

1
2
3
4
5
6
7
@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new GiteeInterceptorAdapter());
    }
}

执行shell命令

我把这部分单独写了一篇博客——《Java执行Shell命令》

部署

  1. 打包——使用maven的package打包
  2. 上传到服务器——maven的deploy用不好,需要花些时间学习一下。暂时使用scp命令上传。
  3. 运行Jar包——使用systemd运行,参考这篇博客《使用systemd启动关闭Java程序》

收获

  1. 把一个手动工作实现了自动化。
  2. 通过查看Spring Web MVC的文档,找到并实现了拦截器的代码。
  3. 发现了一个工具库,通过查看它的文档,将它运用了起来。
  4. 第一次接触OutputStreamByteArrayOutputStream
  5. Jar包的部署❗️

总结

从这个服务的实现可以提炼出一种解决问题的方法吗?

  • 首先是确定目标,也就是需求——自动化。
  • 然后思考如何实现它——WebHook + 自己实现服务端功能——确定一个方案。
  • 设计流程。
  • 功能点和技术难题。
  • 解决技术难题——查文档/google/stackoverflow等。
  • 整个过程需要大量思考,需要多写,落实到纸上,以免遗忘和疏漏。
  • 尤其是对流程的思考。
  • 尤其是对难题的记录。
  • 完成后
  • 要总结学习到的知识点,计作“收获”
  • 要总结提炼方法,使其能沉淀为经验,计作“总结”
  • 更新技能树
updatedupdated2020-10-122020-10-12