Yan
Yan Just a simple man.

githooks自动部署

githooks自动部署

githooks实现自动部署到服务器

简述

travis只能部署开源的项目,并且travis部署过程中出现问题,极其难以调试,对账号和服务器都有安全风险,并且使用travis,源仓库就不能放在服务器上. 如果是部署在服务器上,无论是开源还是闭源项目,githooks都是简单好用且安全的方法

  1. 在服务器上设置好githooks
  2. 本地push代码触发hooks,完成自动部署

使用traivs自动化部署可参考–> travis实现自动化部署

环境准备

主要是服务器上关于git的设置

服务器

服务器使用阿里云或者腾讯云都可以,配置基本可以走最低配置,大多数时候只跑一个nginx而已.系统选择ubuntu或者centos.下面以ubuntu18.04的阿里云为例

登录服务器以后先更新系统

1
2
root# apt update 
root# apt upgrade

为了避免安全风险,应该先建立一个带有sudo权限的普通用户部署博客.按照linux新建用户里面的方法新建. 之后所有操作切换到普通用户进行.

git

安装git

服务器上需要安装git工具

1
$ sudo apt install git 

nginx

ngix在服务器上的安装与设置请参考Nginx安装配置

配置好环境以后,root的路径先不用配置

部署过程

主要是生成hooks Repositories,触发后编译静态网页,nginx部署

生成hooks Repositories

这一步的操作在服务器上完成

1
2
$ cd ${workspace}
$ git init --bare ${hooks-name}.git

git init时加上--bare参数声明生成的仓库是一个空的bare仓库,这个仓库就是我们要使用的githooks仓库

1
$ cd ${workspace}/${hooks-name}.git/hooks

这里就是存放触发脚本的地方,在此目录下新建触发脚本post-receive.设置执行权限chmod +x post-receive

进入你想要放置源码的目录

1
$ cd ${sourcespace}

githooks仓库clone过来

1
$ git clone ${workspace}/${hooks-name}.git 

${sourcespace}目录会多出一个${hooks-name}文件夹.以后,每次推送代码触发hooks,hooks机会将代码同步到这个文件夹

回到githooks目录,设置触发脚本,内容如下

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
unset GIT_DIR
NowPath=`pwd`
DeployPath="${sourcespace}/${hooks-name}"
cd $DeployPath
git config user.email ${email}
git config user.name ${user}
git add . -A && git stash
git pull origin master
bash ${script-name}.sh

其中${script-name}.sh是触发hooks,同步完代码以后执行的脚本,你可以在里面添加你想要执行的任意代码,如编译静态网页等

本地Repositories设置

1
2
$ cd ${sourcesapce}
$ mkdir ${script-name}.sh

在里面添加编译的脚本,如

1
2
3
4
5
6
7
# jekyll
bundle install 
jekyll build

# hexo
npm install
npm build

然后git commit提交代码.开始添加远程仓库

1
$ git remote add ${hooks} ${user}@${youripaddr}:${workspace}/${hooks-name}.git 

添加完以后push代码

1
$ git push ${hooks} master

服务器上的hooks接收push代码以后,就会同步到${sourcespace}/${hooks-name},同时执行${script-name}.sh.完成自动编译

nginx部署

nginx配置文件中将目录指向编译生成的_site

1
2
3
4
5
location / {
                        root ${sourcespace}/${hooks-name}/site;
                        index index.html index.htm;
                }

整个自动化部署流程就结束了,以后每次在本地push代码都会触发自动化部署

多人协作

一般一个复杂的项目可能由多人完成,每个人只负责其中一部分.也值需要更新一部分,每个人的执行脚本可能都不一样,那么每个人都可以在服务器上生成自己的githooks仓库.然后在${sourcespace}git clone多个hooks仓库就能实现多人协作自动部署

但是避免代码混乱,建议还是使用相同的hooks,这样子源码不会出现无法commit的情况

note

  1. ${}都需要进行替换

issues

如果有疑惑或错误,请提issues –> Issues