使用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目录,则需要提前准备这个目录:
mkdir /usr/share/nginx/html/docs/
chown jenkins:jenkins /usr/share/nginx/html/docs/
安装nodejs和gitbook
为了让jenkins可以执行 gitbook 的 build 命令,需要在jenkins所在机器上安装nodejs和gitbook,方法如前所述。
准备shell脚本
准备下面的bash脚本,保存为jenkins.sh,存放在git仓库的根目录下:
#!/bin/bash
source /etc/profile
echo "**** env to build ****"
echo `pwd`
echo `id`
echo "PATH=$PATH"
echo "**** get content from git ****"
echo `ls -l`
echo
echo "**** prepare nodejs ****"
npm install
echo "**** begin to build html ****"
gitbook build
echo "**** finish to build html ****"
echo "static html content is located in _book folder:"
echo `ls -l _book`
echo "**** remove exist document ****"
rm -rf /usr/share/nginx/html/docs/reference
echo "**** copy content in _book to nginx ****"
cp -r _book /usr/share/nginx/html/docs/reference
echo "**** Done! ****"
echo "new content is published to nginx:"
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界面上就可以完成。