背景需求 #
我的博客是使用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
拦截器接口,二是配置拦截器。
实现拦截器 #
|
|
配置拦截器 #
|
|
执行shell命令 #
我把这部分单独写了一篇博客—— 《Java执行Shell命令》。
部署 #
- 打包——使用maven的package打包
- 上传到服务器——maven的deploy用不好,需要花些时间学习一下。暂时使用scp命令上传。
- 运行Jar包——使用systemd运行,参考这篇博客 《使用systemd启动关闭Java程序》。
收获 #
- 把一个手动工作实现了自动化。
- 通过查看
Spring Web MVC
的文档,找到并实现了拦截器的代码。 - 发现了一个工具库,通过查看它的文档,将它运用了起来。
- 第一次接触
OutputStream
和ByteArrayOutputStream
。 - Jar包的部署❗️
总结 #
从这个服务的实现可以提炼出一种解决问题的方法吗?
- 首先是确定目标,也就是需求——自动化。
- 然后思考如何实现它——WebHook + 自己实现服务端功能——确定一个方案。
- 设计流程。
- 功能点和技术难题。
- 解决技术难题——查文档/google/stackoverflow等。
- 整个过程需要大量思考,需要多写,落实到纸上,以免遗忘和疏漏。
- 尤其是对流程的思考。
- 尤其是对难题的记录。
- 完成后
- 要总结学习到的知识点,计作“收获”
- 要总结提炼方法,使其能沉淀为经验,计作“总结”
- 更新技能树