通过GIT自动部署代码到服务器
代码提交需要版本控制,一方面是协同开发所必须,一方面也是可以有效做到代码保全和版本回退,再高级点还是可以通过分支或者子模块的形式减少重复工作量。
但代码开发完成后进行服务器部署的过程中,或者在生产过程中遇到需要紧急进行修改的情况下,又如何保证代码的完整性,和确保开发人员有对临时改动进行记录和准备好改动的回退方法。
GIT作为功能强大的版本控制工具,提供了Webhooks和Deploy Keys的功能,可以轻松实现通过git进行服务器部署。同时因为如果部署代码都是通过GIT进行提交,也有效的保证了代码的完整性和可回退。下面以gitlab为例记录具体的实现方法
生成服务器公钥
首先是要在服务器上生成ssh公钥和私钥,并将公钥复制作为Deploy Keys,Deploy Keys其实也就是为该GIT项目添加一个只读的用户,并且因为添加了SSH key所以可以免输入用户名密码pull 该项目
至于要使用服务器的那个用户创建SSH key并作为Deploy Keys,要看程序所需。因为设置后,pull下来的文件的所有者就是该用户。比如,工程是php,那我们生成www用户的ssh key,pull下来的文件所有者就会都是www用户所有者,那么就不会有执行的权限问题。
sudo -Hu www ssh-keygen -t rsa
然后在/home/www/.ssh/ 文件夹下就会有id_rsa和id_rsa.pub 文件
查看id_rsa.pub的内容,将其复制到Deploy Keys
首次部署
以为已经为www用户配置了Deploy Keys,所以该项目可以使用www用户直接clone下来
sudo -Hu www git clone git@xxx.xxx.com:xxx/xxxx.git
写入钩子接口
这里使用php做一个简单做个接口来接收gitlab通过webhooks POST过来的数据,并执行相关操作。
<?php
$secret = '12345';
$targetBranch = 'refs/heads/master';
$deployDir = '/home/wwwroot/xxx';
$gitDir = $deployDir."/.git";
//获取http 头
$headers = array();
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
// $headers[str_replace('_', '-', substr($name, 5))] = $value;
}
}
//github发送过来的token
$gitToken = $headers['X-Gitlab-Token'];
//获取body内容
$payload = file_get_contents('php://input');
$payloadArray=json_decode($payload,true);
$branch=$payloadArray["ref"];
// 判断签名是否匹配
if ($secret === $gitToken){
if($branch==$targetBranch){
$cmd="git --work-tree=".$deployDir." --git-dir=".$gitDir." pull";
echo exec($cmd);
}
}
这里主要是校验了后面我们要在webhooks设置的token是对应,另一方面简单设置了只更新master分支,对更新操作也只是简单pull,可以根据项目情况进行更改。
设置Webhooks
关于触发条件可以根据所需进行设置,比如默认是只要有push提交那就会触发。满足触发条件gitlab就会向该URL POST数据,具体数据字段可以查看gitlab的文档