简介
我们在部署我们的web
应用时 我们一般会寻求一些云平台服务器部署 当然也可以直接在服务器里拉取远程仓库的代码
当然我们也可以实现通过Webhooks
(钩子)来实现服务器与远程仓库代码的同步
这样一来我们在本地提交功能分支到仓库中 仓库也会同步到服务器 这样我们就无需自己手动去同步项目代码
选择
我们的项目大都托管在Github
当然Github
在建立私有仓库时是需要付费的 那么在自己的网站部署时 我们完全可以选择其他的平台
目前来说我们需要试下Webhooks
自动化部署 那么我们可以选择自己合适的平台 这里我选择GitLab
这些在国内都是不错的代码托管平台 你都可以创建自己的私有项目仓库
之前我的网站项目是托管在Coding
但是近期我重写我的网站项目 因为GitLab
本身可以建立自己的私有仓库并且没有限制
同样的也可以设置成员的权限 分支的工作流也十分清晰强大 现在很多的公司也都选择了GitLab
so 我还是会去尝试一下新的服务
前期准备
和Github
一样 我们都要去生成一个ssh key
这样我们以后在提交项目和项目分支时就可以免去身份验证
在本地终端执行
$ ssh-keygen -t rsa -C "youremail@example.com"
这里填写你GitLLab
注册的邮箱即可(最好保持一致)
你可以一直默认下去 当然为了和之前的发生冲突 你可以自己在生成的时候重新命名
我这里生成的是gitlab_rsa
和gitlab_rsa.pub
接着在命令行执行(添加刚生成的公钥和私钥)
eval $(ssh-agent -s)
ssh-add ~/.ssh/gitlab_rsa
查看我们的公钥内容
cat ~/.ssh/gitlab_rsa.pub
拿到我们的公钥内容 我们就可以去GitLab
添加我们的sh key
添加完毕之后当然是测试本地连接
$ ssh -T git@gitlab.com
如果没有问题的话 会回馈给我们正确的欢迎信息
具体的生成信息可以看官方的 ssh文档
我们在此之前在GitLab
已经上传了我们的项目 在项目中的Setting->Integrations
里添加脚本钩子
比如这边我添加的url是http://kobeman.com/hook/index.php
然后填入的token
是ispace
现在可以去服务器的站点目录下克隆远程仓库的项目 这里我的站点目录是/data/www
那么在这个目录下克隆我们远程的项目 克隆完毕后 当然这里以Laravel
项目为例 完成一些权限 这些可自行查阅
能够成功跑起来我们的项目就ok 这里我访问的网址是www.kobeman.com
下面就需要添加钩子文件
这里我们项目的根目录 这里可以是public
目录下新建hook
目录 添加一个index.php
具体内容如下
具体代码我已经放在我的gist上 如果有什么问题欢迎提出
issue
<?php
error_reporting(1);
$target = '/data/www/ISpace'; // 生产环境web目录
$token = 'ispace'; //GitLab 添加的token
$wwwUser = 'root';
$wwwGroup = 'root';
if (empty($_SERVER['HTTP_X_GITLAB_TOKEN']) || $_SERVER['HTTP_X_GITLAB_TOKEN'] !== $token) {
exit('error request');
}
/*if($_SERVER['HTTP_X_GITLAB_TOKEN'] == $token){
echo "校验成功";
}*/
//$repo = $json['repository']['name'];
// $cmds = array(
// "cd $target && git pull",
// "chown -R {$wwwUser}:{$wwwGroup} $target/",
// );
// foreach ($cmds as $cmd) {
// shell_exec($cmd);
// }
chdir($target);
$cmd = "sudo -Hu root git pull";
shell_exec($cmd);
这里的钩子文件需要注意以下几点
-
php
配置里需要注释掉shell_exec
这些被禁用的函数 详见 shell_exec - 执行命令时切换到管理员用户最好
- 查看是否进入你的项目目录 这里我是通过
chdir
进入项目目录 因为cd
命令是没有用的 详见 Can't 'cd' with PHP shell_exec() -
git pull
不能执行 这应该就是权限的问题 详见 shell 脚本中调用 git pull 命令无法执行
这里为什么我们需要获取这个$_SERVER
的参数呢 因为GitLab
是通过post
请求这个地址 所以为了验证之前填入的token
我们这里是去验证他的请求头部 因为他是以请求头部传递给我们的 如图所示
为了了解他的头部到底包含了什么信息 我们可以都打印出来看下
所以说如果我们验证这个token
成功的话再去进入到项目目录 执行git pull
拉取我们最新的代码
这样也就实现了 自动化的代码部署 在验证过程中我打印了下这个 $_SERVER['HTTP_X_GITLAB_TOKEN']
这样一来下次再去提交我们的最新的功能代码时就可以哦同步到我们的服务器
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。