Git是什么自不必说。Git和gitlab安装和实践在后边的俩篇中会写。本篇仅重点写Git自动部署。

Git同样有Hooks,可以用于各种需求。可以控制提交commit名称,可以控制代码规范,也当然包含以下要介绍的自动部署,也不仅包含这些。


Git自动部署简单的思想是这样:

  1. 在服务端创建空版本库

  2. 在客户端创建真实版本库,关联远程版本库

  3. 在服务端部署代码

  4. 在服务端版本库中修改新增钩子程序




  1. 服务端创建空版本库 

 [yu@argcv-com ~]$ cd 
 [yu@argcv-com ~]$ mkdir repo
 [yu@argcv-com ~]$ cd repo/
 [yu@argcv-com repo]$ git init --bare test.git
 Initialized empty Git repository in /home/yu/repo/test.git/
 [yu@argcv-com repo]$

2. 在客户端创建真实版本库,关联远程版本库

[yu@argcv-com ~]$ cd /tmp/
[yu@argcv-com tmp]$ mkdir client
[yu@argcv-com tmp]$ cd client/
[yu@argcv-com client]$ git init
Initialized empty Git repository in /tmp/client/.git/
[yu@argcv-com client]$ git remote add origin yu@localhost:repo/test.git
[yu@argcv-com client]$ touch README.md
[yu@argcv-com client]$ git add .
[yu@argcv-com client]$ git commit -m "init"
[master (root-commit) 00da9a9] init
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md
[yu@argcv-com client]$ git push origin --all 
Counting objects: 3, done.
Writing objects: 100% (3/3), 210 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To yu@localhost:repo/test.git
 * [new branch]      master -> master
[yu@argcv-com client]$


3.在服务端部署代码

[yu@argcv-com ~]$ cd /tmp/
[yu@argcv-com tmp]$ mkdir deploy
[yu@argcv-com tmp]$ cd deploy/
[yu@argcv-com deploy]$ git clone ~/repo/test.git .
Cloning into '.'...
done.


4.在服务端版本库中修改新增钩子程序

[yu@argcv-com repo]$ pwd
/home/yu/repo
[yu@argcv-com repo]$ cd test.git/
[yu@argcv-com test.git]$ cd hooks/
[yu@argcv-com hooks]$ vi post-receive
[yu@argcv-com hooks]$ cat post-receive
#!/bin/sh
unset GIT_DIR
NowPath=`pwd`
echo "now path is :"$NowPath
DeployPath="/tmp/deploy"
echo "deploy path is :"$DeployPath
cd $DeployPath
echo "cd deploy path"
#git add . -A && git stash # remove local changes 
git pull origin master # pull data from master
# the follow line is also ok:
# git add . && git fetch origin && git reset --hard origin/master
echo "deploy done"
cd $NowPath
echo "fine"
# --- Finished
exit 0
[yu@argcv-com hooks]$ chmod +x post-receive
[yu@argcv-com hooks]$


5.测试

[yu@argcv-com client]$ touch newfile
[yu@argcv-com client]$ git add .
[yu@argcv-com client]$ git commit -m "add new file"
[master 68efdcf] add new file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 newfile
[yu@argcv-com client]$ git push origin
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 384 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: now path is :/home/yu/repo/test.git
remote: deploy path is :/tmp/deploy
remote: cd deploy path
remote: From /home/yu/repo/test
remote:    6627165..5ac80ec  master     -> origin/master
remote: Updating 6627165..5ac80ec
remote: Fast-forward
remote:  newfile | 0
remote:  1 file changed, 0 insertions(+), 0 deletions(-)
remote:  create mode 100644 newfile
remote: deploy done
remote: fine
To yu@localhost:repo/test.git
   b3a32f2..5ac80ec  master -> master
[yu@argcv-com client]$