个人项目管理发布方案 (java maven 项目)
- 最原始的方式应该是本地打包,ftp到服务器部署了吧
- 在服务器上装好git,maven环境,本地push到仓库,登录到服务器,pull下代码,编译,打包,发布(目前我就是这样做的)
- 现在才知道git hook这个功能,真是惭愧,我们可以通过配置git hook实现自动部署,下面就记录下简单流程
1) 什么是Git 钩子?点击官方中文描述
2) 和其它版本控制系统一样,Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。 你可以随心所欲地运用这些钩子。
3) 钩子都被存储在 Git 目录下的 hooks 子目录中。 也即绝大部分项目中的 .git/hooks 。 当你用 git init 初始化一个新版本库时,Git 默认会在这个目录中放置一些示例脚本。这些脚本除了本身可以被调用外,它们还透露了被触发时所传入的参数。 所有的示例都是 shell 脚本,其中一些还混杂了 Perl 代码,不过,任何正确命名的可执行脚本都可以正常使用 —— 你可以用 Ruby 或 Python,或其它语言编写它们。 这些示例的名字都是以 .sample 结尾,如果你想启用它们,得先移除这个后缀。
4) 把一个正确命名且可执行的文件放入 Git 目录下的 hooks 子目录中,即可激活该钩子脚本。 这样一来,它就能被 Git 调用。 接下来,我们会讲解常用的钩子脚本类型。
简称服务器端称为 "S"
简称本地开发端称为 "C"
1.首先在S端操作,建立"裸仓"
1) 什么是"裸仓",那先要了解下
git init
与git init --bare
的区别。
2) bare汉语意思是:裸。这样初始化的仓库只会记录git历史提交的版本信息,不允许用户在上面操作的,把他当作“只读”看待。
3) 我们下面就建立一个“裸仓”,“C”端开发好的代码将push到这里。
4) ”裸仓“文件夹通常以'xxx.git'方式命名。
mkdir test.git
cd test.git/
git init --bare
ll -a #看下加了参数与不加参数有什么区别
drwxr-xr-x 2 root root 4096 11月 27 14:33 branches
-rw-r--r-- 1 root root 66 11月 27 14:33 config
-rw-r--r-- 1 root root 73 11月 27 14:33 description
-rw-r--r-- 1 root root 23 11月 27 14:33 HEAD
drwxr-xr-x 2 root root 4096 11月 27 14:33 hooks
drwxr-xr-x 2 root root 4096 11月 27 14:33 info
drwxr-xr-x 4 root root 4096 11月 27 14:33 objects
drwxr-xr-x 4 root root 4096 11月 27 14:33 refs
2.在"S"端建立打包的项目的地方
1) 从"裸仓" clone 到这里,就在这个代码里执行maven打包指令
mkdir workspace
cd workspace
git init
git clone ../test.git
chmod -R 777 ../workspace
3.在"S"端修改”钩子“文件
1) 返回 "裸仓" ,hooks下面存放着可配置文件,以.sample结尾,使用的时候拷贝一份进行编写
2) 官方文档对这些钩子的定义 https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90
3)查看文档,这里需要用到post-receive
,但当前版本居然没有该默认配置,自己建一个吧
4)post-receive 官方描述:
post-receive 挂钩在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户。 它接受与 pre-receive 相同的标准输入数据。 它的用途包括给某个邮件列表发信,通知持续集成(continous integration)的服务器,或者更新问题追踪系统(ticket-tracking system) —— 甚至可以通过分析提交信息来决定某个问题(ticket)是否应该被开启,修改或者关闭。 该脚本无法终止推送进程,不过客户端在它结束运行之前将保持连接状态,所以如果你想做其他操作需谨慎使用它,因为它将耗费你很长的一段时间。
cd /test.git/hooks
ll
-rwxr-xr-x 1 root root 452 11月 27 14:33 applypatch-msg.sample
-rwxr-xr-x 1 root root 896 11月 27 14:33 commit-msg.sample
-rwxr-xr-x 1 root root 189 11月 27 14:33 post-update.sample
-rwxr-xr-x 1 root root 398 11月 27 14:33 pre-applypatch.sample
-rwxr-xr-x 1 root root 1704 11月 27 14:33 pre-commit.sample
-rwxr-xr-x 1 root root 1239 11月 27 14:33 prepare-commit-msg.sample
-rw-r--r-- 1 root root 1348 11月 27 14:33 pre-push.sample
-rwxr-xr-x 1 root root 4951 11月 27 14:33 pre-rebase.sample
-rwxr-xr-x 1 root root 3611 11月 27 14:33 update.sample
vim post-receive
#!/bin/sh
localPath='pwd'
workPath= "/home/workspace"
cd $workPath
git pull
echo '更新完成'
mvn clean package
echo '打包完成'
#调用用发布脚本,重启服务等,根据自己的项目定
#hook_publish.sh
echo '发布完成'
cd $localPath
exit 0
chmod +x post-receive
4.本地开发环境推送代码
1) 本地项目根目录下添加remote推送目的。
2)当本地向目标源推送代码时,会触发我们配置的post-receive钩子
#设置自己的远程服务ip,22为默认端口,可以不用写
git remote add deploy root@xx.xx.xx.xx:22:/test.git
#代码修改后,
git add .
git push deploy master
#可能需要输入服务器密码
...