前置条件
最近在撸一个个人项目,虽然是个人项目,但是觉得用ftp传代码不太好,都21世纪了,我们要用现代的方式来管理、部署代码。于是希望能有一个本地push代码之后,线上服务器就能更新代码的功能。
开发环境如下
1.本地有一个开发环境
2.阿里云有个服务器
3.代码通过gitlab管理
本文只针对个人开发者,团队开发感觉需要有更加严谨的流程。
原理、步骤说明
1、本地发起push请求后,gitlab触发一个钩子
2、触发gitlab钩子后,使用gitlab webhook调用阿里云服务器的一个链接,例:xxx.example.com/pull.php
3、pull.php里面执行代码,从gitlab git pull代码
配置流程
1.编写服务端脚本
脚本核心部分如下
exec("cd /var/www/html/; git pull"); //先定位到相应目录,然后git pull
当然这也并不安全,所以我们需要加上一些验证,在gitlab webhook处可以配置一个token,so,我们加上个token验证
<?php
$valid_token = 'secret_token';
$client_token = $_SERVER['HTTP_X_GITLAB_TOKEN'];
if ($client_token !== $valid_token) die('Token mismatch!');
exec("cd /var/www/html/; git pull origin master");
//exec("cd /var/www/html/; git pull origin master 2>&1", $output);
//var_dump($output); 这样可以用浏览器调试输出
?>
2、给脚本另开个端口
毕竟这个不是业务代码不是,放在一起总觉得哪里不对劲
server {
listen 4567;
listen [::]:4567;
server_name example.com;
root /var/www/script;
index index.html;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location / {
try_files $uri $uri/ =404;
}}
重启一下nginx
$ nginx -t
$ /etc/init.d/nginx restart
3、编辑www账户的账号权限
有几个要注意的地方
1.开放出去的web根目录www有没有权限编辑?
2.www 能不能连上gitlab?
3.脚本里的exec函数有么有被禁用?
第一个问题
假设项目的web根目录是/var/www/,那我们把这个文件夹交给www账户,不然他是没权限操作的
$ chown -R www:www /var/www/
第二个问题
www访问不到正常账户的.ssh文件夹,so 连不上gitlab
现在我们要登进www账户,创建ssh文件,然后连一下gitlab
1、放开www账户访问限制
vim /etc/passwd
;www:x:22:22:www:/var/www:/usr/sbin/nologin
www:x:22:22:www:/var/www:/bin/bash
2、生成ssh秘钥
你能找到这篇文章,我就默认这部你懂啦,把生成的ssh秘钥往gitlab上配一下,然后执行下 git pull把gitlab的公钥记下来
完成后把www账户的login权限去掉
第三个问题
到了这部,如果你的这个文件访问没有任何输出,好像什么事都没有发生的样子,那就去检查下php.ini里面exec函数是否被禁用,改完之后重启下php-fpm
然后应该就可以用啦
副记
1、gitlab的webhook在哪里??
这个我找了好久,一度以为这个功能被去掉了。
点进项目后,左侧setting,然后integrations
然后就是配置webhook的界面了
nice~enjoy your self
如果对你有帮助,点个赞再走啦~