git自定义hooks

Git 能在特定的重要动作发生时触发自定义脚本。 有两组钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。
在.git目录下可以查看hooks文件夹,Git 默认会在这个目录中放置一些示例脚本。所有的示例都是 shell 脚本,这些示例的名字都是以 .sample 结尾,如果你想启用它们,得先移除这个后缀。

客户端钩子

  • pre-commit:钩子在键入提交信息前运行。 它用于检查即将提交的快照
  • commit-msg: 可以用来在提交通过前验证项目状态或提交信息。
  • prepare-commit-msg:钩子在启动提交信息编辑器之前,默认信息被创建之后运行。
  • post-commit: 在整个提交过程完成后运行。
  • pre-rebase: 运行于变基之前,以非零值退出可以中止变基的过程。可以使用这个钩子来禁止对已经推送的提交变基。
  • pre-rewrite:
  • pre-push:在 git push 运行期间, 更新了远程引用但尚未传送对象时被调用。

    服务器端钩子

  • pre-receive: 处理来自客户端的推送操作时,最先被调用的脚本是 pre-receive。

  • update: update 脚本和 pre-receive 脚本十分类似,不同之处在于它会为每一个准备更新的分支各运行一次。
  • post-recevie: 在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户。

image.png

git remote add XXX

执行git remote那句话,就是先将本地仓库与远端仓库建立一个链接,那么add xx什么呢?xx就是要为远程仓库起的名称,一般叫origin。也可随意定义ceres或者earth、

  1. git remote add Ceres your_first_git_address //将第一个git address命名为Ceres
  2. git push -u Ceres master //注意咯,我要向远端木星发射了,太远了,一定要用push
  1. git remote add Mars your_second_git_address //将第二个git address命名为Mars
  2. git push -u Mars master //再次发射,目标火星上的master分支

创建服务端hooks

由于hooks区分客户端和服务端。需要把项目代码放项目目录中,把提交历史放到单独的服务端文件git仓库目录。
登入服务器,在服务器的 /home/cicd/git_hook/ 目录下创建一个裸仓库 test-hook.git

  1. git init --bare test-hook.git

git init —bare说明创建一个裸仓库,只放git项目的操作记录,不存放项目代码。进入test-hook.git,里面有个hooks文件夹,用来存放git钩子。默认存放的带有example后缀【示例文件不执行】。所谓“钩子”,其实就是一个 shell 文件。

刚开始我把post-receive添加到项目代码的hooks中,该钩子是服务端钩子,在项目代码中无法触发该钩子执行。

添加push钩子

  1. $ cd /home/cicd/git_hook/test-hook.git/hooks
  2. $ vi post-receive

post-receive内容

  1. #
  2. !/bin/bash
  3. echo 'server: received code push...'
  4. cd /home/cicd/git_hook/tic-tac
  5. echo 'server: checkout latest code from git...'
  6. git --git-dir=/home/cicd/git_hook/test-hook.git --work-tree=/home/cicd/git_hook/tic-tac checkout -f master
  7. echo 'server: running npm install...'
  8. npm install \
  9. && echo 'server: buildding...' \
  10. && npm run build \
  11. && echo 'server: done...'

添加好修改文件的权限,将权限设置为可执行。

  1. chmod +x post-receive

这里有两个重要概念:项目目录 和 git 仓库。项目目录就是 package.json 文件所在的目录,我们的代码放在这里。git 仓库是项目目录下的 .git 文件夹,它是个隐藏目录,在 git init 时自动生成。然后在当前项目目录下使用其他目录下的git仓库。

  • —git-dir 参数就允许你指定一个其他的 git 仓库
  • —work-tree参数就允许你指定项目目录

    客户端

    前面在服务器建好了 git 裸仓库 test-hook.git,回到客户端只需要做一件事:将代码推到这个裸仓库。

    推送代码

    先在本地项目下,将这个裸仓库添加为远程仓库

    1. git init
    2. git add .
    3. git commit -m "init"
    4. git remote add githook ssh://root@1.123.34.35/home/cicd/git_hook/test-hook.git

    接下来直接push操作就会触发post-receive钩子。查看服务器下的 /home/cicd/git_hook/tic-tac 目录,会看到源文件和打包后的 build 文件

    nginx解析

    上面自动化构建完成,接下来添加nginx设置自动化部署。
    部署完成,并打包了 build 文件夹。这个文件夹就是要部署的文件夹。最后一步,则是配置一个域名,解析到这个文件夹。

    1. cd /etc/nginx/conf.d
    2. vi testhook.conf

    在 testhook.conf 文件中写上如下配置

    1. server {
    2. listen 80;
    3. server_name 1.123.34.35; # 如 www.baidu.com
    4. root /home/cicd/git_hook/tic-tac/build; # 指向打包后的目录
    5. location / {
    6. index index.html;
    7. }
    8. }

    保存并退出后,nginx -s reload,这样解析就配好,至此,服务器端的打包,部署,解析流程就全部完成