一般我们在写好文档后,会生成一份apidoc发给前端同学,好让前端同学了解接口格式,进行开发。一直以来,我都是在本机搭建了一个服务器,让其他同学访问本机,但是这样会有一个问题,由于ip是DHCP分出来的,有时候就会产生变化,这个时候,我就要重新发一下本机的ip,因为ip变动频率不高,工作又很多事,一直以来也都这么忍受了,今天突然想起这码事,又正好有空,于是折腾折腾。

这个问题的核心在于,需要一个固定的ip,而正好发现同事的开发机我也可以访问,于是以这台开发机为核心,开搞。

我想达成的目标是:写好apidoc之后,在本机执行一个命令,就可以部署到开发机。

首先,在开发机上建立一个裸仓库:

1
2
3
mkdir srv
cd srv
git init --bare apidoc.git

然后去本机初始化git并添加远程地址

1
2
git init
git remote add origin xxx@ip:srv/apidoc.git

这样,在本机执行git push origin master的时候,就会提交到这个裸仓库。

然后在开发机上建立一个目录,例如www/apidoc来存放文件。

1
2
3
4
mkdir -p www/apidoc
cd www/apidoc
git init
git remote add origin $HOME/srv/apidoc.git

这样开发机的git也配置好了,在apidoc目录执行git pull origin master就能把文档拉下来了,然后在nginx新建一个端口,指到这个目录,并且添加

1
2
3
4
5
6
  location / {

    autoindex on;
    autoindex_localtime on;

  }

以保证可以直接列出目录。

做完上面这些事,我们就有了一个可以使用的文档服务器,但是,这离我们的目标还有一些距离,因为现在发布一次文档,我们需要很多命令,还需要登录开发机,不爽。

首先,在srv/apidoc.git/hooks目录,添加文件post-receive,这个文件在每次有文件提交到服务器的时候触发。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh

IS_BARE=$(git rev-parse --is-bare-repository)
if [ -z "$IS_BARE" ]; then
echo >&2 "fatal: not bare"
exit 1
fi

unset GIT_DIR
DeployPath="$HOME/www/apidoc"

echo "======"
cd $DeployPath

git fetch --all
git reset --hard origin/master

time=`date`
echo "web build complate at time: $time"
echo "======"

这样,每次在本地push之后,就会自动触发钩子,更新开发机上的文件。然后,使用ssh-keygen生成秘钥对,在开发机添加ssh认证登陆,这样每次push的时候就不需要敲一次密码了。

现在,我们在本地的apidoc目录,敲一下git push origin master,就可以刷新网页看效果了。

但是,还是不爽,因为我要先执行apidoc生成文档,切换目录,再执行git。不过这个就没多少说的啦,写一个sh文件即可,然后起一个帅气的名字~

至此,目标完成,我们就拥有了一个,可以一键发布文档的文档服务器。