14

1340.640.jpg


引言

之前我在这篇文章里面简单的介绍了一下git钩子,pre-commit与eslint的关系与作用git钩子与eslint
今天继续介绍另外的两个git钩子,以及使用它们来进行简单的自动化部署的两个例子。

钩子分类

Git钩子就是git在特定的重要动作发生时触发自定义脚本。

钩子都被存储在 Git 目录下的 hooks 子目录中。 也即绝大部分项目中的 .git/hooks 。 当你用 git init 初始化一个新版本库时,Git 默认会在这个目录中放置一些示例脚本。这些示例的名字都是以 .sample 结尾,如果你想启用它们,得先移除这个后缀。

Git 含有两种类型的钩子:客户端的和服务器端的。客户端的钩子pre-commit之前介绍过了

和自动化部署有关的钩子有两个,一个是post-update,一个是github基于post-update封装的webhook
img.jpeg

自动部署原理

这里先不谈docker和jeckins,大家先想一想部署的原理是什么,
部署就是服务器展示目录里面的文件变成最新的文件即可
我们可以手动把文件传上去,也可以进入服务器展示目录,让它去拉最新代码即可
如果我们通过shell脚本让这个过程变成自动的,并且我们能自动在某个时机执信shell脚本,是不是我们就完成了自动化部署?

post-update

定义

This hook reacts to git push and updates reference(s) in its repository. It executes on the remote repository once after all the refs have been updated.


自动部署过程

本地git push,远程仓库xxx-bar.git所有文件更新完触发这个钩子执行我们的shell脚本,进入www目录(nginx上配置的展示目录),从xxx-bar.git拉最新文件,完成自动化部署

实操

  1. ssh 连接到远程服务器 (看注意事项)
  2. 在/home/user目录下新建一个www目录 ,niginx展示页指向www/index.html
  3. 在/home/user下初始化一个裸库 git init --bare xxx-bare.git
  4. 进入xxx-bare.git/hooks,在相关钩子里编辑脚本

    cd /home/user/xxx-bare.git/hooks
    cp post-update.sample post-update
    vim post-update

    下面再编辑post-update脚本

    #!/bin/sh
    unset GIT_DIR 
    DIR_ONE=/home/user/www/  #此目录为服务器页面展示目录 
    cd $DIR_ONE
    git init
    git remote add origin /home/user/xxx-bare.git
    git clean -df
    git pull origin master          #核心代码,自动部署的本质
    
  5. 在本地test目录下 git clone 远程服务端刚才创建的裸库xxx-bare.git

    git clone root@你自己服务器的ip:/home/user/xxx-bar.git
  6. 在本地刚克隆的xxx-bar.git里面随便添加一个index.html文件,然后git add .&& git commit -m 'dp' && git push
  7. 我们可以看到,远程/home/user/www目录里面多了一个index.html,此时可以通过浏览器访问这个文件了
  8. 本地xxx-bar.git里改变index,然后git add .&& git commit -m 'dp' && git push,刷新浏览器,可以看到浏览器里面到网页也变化了,至此完成了自动化部署

注意事项

1.服务器权限的问题,我建议还是个人拥有个人的服务器比较好,root权限,想怎么整就怎么整。如果用公司的服务器,ningx访问的时候跨目录可能出问题,ssh配置也可能出问题
这里强烈推荐一下腾讯云,最近做活动,88玩一年,安全耐操
0.1折服务器链接。买了不会玩的可以私聊我,三陪政策,包教包会.....

2.ssh怎么配

首先登录远程服务器,命令行输入 ssh-keygen,生成ssh公钥私钥

其次本地首先看有没有~/.ssh目录,没有的化也执行上面的操作

然后 scp ~/.ssh/id_rsa.pub [遠端主機名稱]:~/.ssh/authorized_keys (把本地共钥复制到远程服务器authorized_keys这个文件中)

再在本地的~/.ssh中添加一个config文件,里面这么写

Host           qq
HostName      你的qq服务器ip
Port          22
User              root
IdentityFile    ~/.ssh/id_rsa

大功告成,当在控制台输入ssh qq 就自动脸上qq服务器了

总结

介绍了post-update钩子以及利用它进行简单自动化部署的实例。并对其中各种可能遇到的问题做了说明。希望能给大家带来一些帮助。本来准备把webhook也写了的,但是由于篇幅原因,只能在下篇文章中介绍webhook,以及利用webhook部署一个真实的vue项目啦。


题外话,写文章真的很辛苦,写了这么久了,竟然一个打赏也没收到,已哭晕。有没有哪位大哥能给个打赏,让我开开荤,支持支持我呗......


Runningfyy
1.3k 声望661 粉丝