使用Jenkins自动发布

介绍使用 jenkins 来自动监控git仓库更新并生成HTML内容,再自动发布到nginx/apache等web服务器。

背景

github和gitbook都对书籍的发布提供了自动化的支持,比如github中可以方便的将生成的html page发布github pages上,gitbook更是天然支持。

但是对于一些不适合发布到github和gitbook的内容,比如公司内部的一些文档或者知识分享,就需要考虑其他的方式。

具体做法

准备jenkins和nginx

Jenkins/nginx的安装部署不在本书之列,我们假设jenkins/nginx服务器已经准备OK,而且在同一台物理机器上。

为什么要在同一台机器呢?

因为后面发布时涉及到文件复制,gitbook生成的文件终究是部署到nginx下的。如果是本地,就可以简单的通过shell命令复制文件,而如果不是本机,就需要其他的远程操作方式(比如scp),要复杂的多。

所以简单起见,在nginx所在的机器上安装一个文档自动发布的专用jenkins。

准备目录和权限

默认情况下jenkins执行脚本的用户名是 jenkins,为了让它可以有权限操作文件系统,需要修改目录权限。

假设我们需要将文档都放置到nginx下的docs目录,则需要提前准备这个目录:

  1. mkdir /usr/share/nginx/html/docs/
  2. chown jenkins:jenkins /usr/share/nginx/html/docs/

安装nodejs和gitbook

为了让jenkins可以执行 gitbook 的 build 命令,需要在jenkins所在机器上安装nodejs和gitbook,方法如前所述。

准备shell脚本

准备下面的bash脚本,保存为jenkins.sh,存放在git仓库的根目录下:

  1. #!/bin/bash
  2. source /etc/profile
  3. echo "**** env to build ****"
  4. echo `pwd`
  5. echo `id`
  6. echo "PATH=$PATH"
  7. echo "**** get content from git ****"
  8. echo `ls -l`
  9. echo
  10. echo "**** prepare nodejs ****"
  11. npm install
  12. echo "**** begin to build html ****"
  13. gitbook build
  14. echo "**** finish to build html ****"
  15. echo "static html content is located in _book folder:"
  16. echo `ls -l _book`
  17. echo "**** remove exist document ****"
  18. rm -rf /usr/share/nginx/html/docs/reference
  19. echo "**** copy content in _book to nginx ****"
  20. cp -r _book /usr/share/nginx/html/docs/reference
  21. echo "**** Done! ****"
  22. echo "new content is published to nginx:"
  23. echo `ls -l /usr/share/nginx/html/docs/reference`

创建jenkins的Job

在这个jenkins的Job中,设置 Poll SCM: H/2 * * * * 来每3分钟检查一次git,然后执行command sh jenkins.sh

总结

这样就实现了 jenkins 自动监控git仓库,发现更新就执行bash脚本,生成HTML内容,再自动复制文件到nginx服务器。做法不复杂,但是完成之后,后续的文档更新就简单了,只需要简单提交内容到git仓库,一些简单的修改甚至直接在gitlab的web界面上就可以完成。