利用git配置服务端自动部署

日期 2018-09-02 服务器,C# 作者 叫我蓝火火 共0评论

作为一个懒人,在本地写完的代码,自然是不愿意在服务器再把编译、部署等命令敲一遍的,昨天受小伙伴的启发,加上一番瞎折腾,配置好了git的远程仓库自动部署。
大概步骤很简单,开发机有一个本地仓库,服务器有两个git项目,一个作为开发机的远程仓库,另一个clone一下前面那个仓库。
说干咱就干。
首先你得有个ssh登录的服务器,我觉得这个不需要再说一次,详细步骤请上网查。
先设置服务器,创建一个名为git的用户,把常登录的用户的密钥复制过来,或者生成新的密钥随便你,反正是配置到能登录,能用sudoer就行。

$sudo adduser git
$cd /home/git
$sudo mkdir .ssh
$sudo cp ~/.ssh/authorized_keys .ssh/
$sudo chown -R git.git .ssh
$sudo chmod -R 755 .ssh

$sudo nano /etc/sudoers
#末尾添加"git ALL=(ALL:ALL) NOPASSWD: ALL",不写引号

我是在/opt新建了两个文件夹,然后git下创建一个裸仓库,dotnet下clone一下前面的裸仓库。

$cd /opt
$sudo mkdir git
$sudo mkdir dotnet

$sudo chown -R git.git git
$sudo chown -R git.git dotnet
$sudo chmod -R 777 git
$sudo chmod -R 777 dotnet

$cd git
$git init --bare MyTestProject.git

$cd ../dotnet
$git clone /opt/git/MyTestProject.git

这样每次更新,在/dotnet里的MyTestProject文件夹里执行

$git reset --hard
$git pull

就可以更新项目啦。

之后配置本地仓库,本地安装git客户端,然后打开git bash,运行

$git init
$git remote add origin ssh://git@my_host_address/opt/git/MyTestProject.git
$git add .
$git commit -m "first commit"
$git push origin master

然后去服务器执行

$cd /opt/dotnet/MyTestProject
$git reset --hard
$git pull

项目代码是不是就都同步过来了?但是并不是自动的,这时候我们要利用git的hook功能。
hook,直译就是钩子,我的理解是在git执行某些操作之后,会触发这些钩子。这些钩子都是脚本文件,我们这里利用被push之后会触发的post-receive钩子。

$cd /opt/git/MyTestProject.git/hooks
$sudo touch post-receive
$sudo nano post-receive

里面键入

#!/bin/sh

#设置项目文件夹
DEPLOY_PATH=/opt/dotnet/MyTestProject/

#这句很重要,不写会导致根目录不符合预期
unset GIT_DIR

进入项目文件夹
cd $DEPLOY_PATH

git reset --hard
git pull

#这里运行一些后续的部署代码

sudo supervisorctl stop all    #关闭守护进程
dotnet build -c Release >> build.log    #编译代码
sudo supervisorctl start all   #打开守护进程

这时候随便写点修改,提交,push,然后再去/opt/dotnet/MyTestProject目录下看一眼,build.log已经存在了,以后修改完项目,合并到master,然后push到远程分支,服务器就会自动编译并部署项目,简直是懒人必备。

如果有错误请告诉我,谢谢各位大佬