我的博客支持服务
背景需求
我的博客是使用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
是一个这样的库。这里有一个简单的例子。
技术方案
流程图
这其中有两个点是我没有做过的,一个是拦截器(检查是否带有X-Gitee-Token的),一个是执行shell命令。
代码实现
拦截器
找到了Spring Web MVC的文档,分两步,一是实现org.springframework.web.servlet
的HandlerInterceptor
拦截器接口,二是配置拦截器。
实现拦截器
public class GiteeInterceptorAdapter implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
// ...
return true;
}
}
配置拦截器
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new GiteeInterceptorAdapter());
}
}
执行shell命令
我把这部分单独写了一篇博客——《Java执行Shell命令》。
部署
- 打包——使用maven的package打包
- 上传到服务器——maven的deploy用不好,需要花些时间学习一下。暂时使用scp命令上传。
- 运行Jar包——使用systemd运行,参考这篇博客《使用systemd启动关闭Java程序》。
收获
- 把一个手动工作实现了自动化。
- 通过查看
Spring Web MVC
的文档,找到并实现了拦截器的代码。 - 发现了一个工具库,通过查看它的文档,将它运用了起来。
- 第一次接触
OutputStream
和ByteArrayOutputStream
。 - Jar包的部署❗️
总结
从这个服务的实现可以提炼出一种解决问题的方法吗?
- 首先是确定目标,也就是需求——自动化。
- 然后思考如何实现它——WebHook + 自己实现服务端功能——确定一个方案。
- 设计流程。
- 功能点和技术难题。
- 解决技术难题——查文档/google/stackoverflow等。
- 整个过程需要大量思考,需要多写,落实到纸上,以免遗忘和疏漏。
- 尤其是对流程的思考。
- 尤其是对难题的记录。
- 完成后
- 要总结学习到的知识点,计作“收获”
- 要总结提炼方法,使其能沉淀为经验,计作“总结”
- 更新技能树