简单应用场景:代码提交到git仓库,仓库监控到变化的jar包,而后把变化的jar包推到私服maven仓库。git
Git预约义了触发时机:服务器
ClientSide hooks:maven
1 pre-commit,当执行commit动做时先执行此hook,能够用此hook作一些检查,好比代码风格检查,或者先跑测试。ide
2 prepare-commit-msg, 当commit时须要输入message前会触发此hook,能够用此hook来定制本身的default message信息。post
3 commit-msg,当用户输入commit的message后被触发,能够用此hook校验message的信息,好比是否符合规定,有没有cr等。测试
4 post-commit, 当commit完成后被触发,能够用此hook发送notification等。3d
5 pre-rebase, rebase以前会被触发,能够用此hook来拒绝全部的已经push的commits进行rebase操做。blog
6 post-merge, 当merge成功后,会触发此hook。rem
7 pre-push, 当push时,remote refs被更新,可是在全部的objects传输前被触发。it
8 pre-auto-gc, 当git gc --auto执行前被触发。在垃圾回收以前作一些验证或备份是挺不错的。
ServerSide hooks:
1 pre-receive, 当收到push动做以前会被执行。
2 update, 也是收到push动做以前被执行,可是有可能被执行屡次,每一个branch一次。
3 post-receive, 当push动做已经完成的时候会被触发,能够用此hook来push notification等,好比发邮件,通知持续构建服务器等。
简单解决方案(git仓库使用的是裸仓库):因为裸仓库不保存实际文件,只保存变化过程。因此在检测到仓库有变化是,须要先把变化git pull到服务器的另一个单独的目录,这样才能获取到实际存在仓库的代码或者文件,以后再deloy到私服。在钩子脚本post-receive阶段使用read oldValue newValue refName 获取到变化以前的commitId1 和变化后的commitId2,而后执行git diff commitId1 commitId2 --name-only 获得变化的文件,而后使用mvn deloy 把变化的文件推到仓库。
注意点