作为一个懒人,在本地写完的代码,自然是不愿意在服务器再把编译、部署等命令敲一遍的,昨天受小伙伴的启发,加上一番瞎折腾,配置好了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到远程分支,服务器就会自动编译并部署项目,简直是懒人必备。