php fwrite服务器上写不进去_一点也不复杂, GitLab Webhook 自动部署代码

771261c96ccb0bda6d0dd3c14d6a0e97.gif

1e6523f7990cd8f15cf3304a94eb774a.png 项目使用了gitlab托管,以前部署代码都是登录服务器,然后git pull代码。这样每次需要发布代码,都需要登录,太繁琐。 很早就了解到 gitlab支持 webhook,能够自动同步代码。今天尝试搭建成功了。

原理介绍

  1. 配置gitlab当push动作的时候,访问服务器上的一个链接比如pangxieke.com/tb.php

  2. tb.php里面写着一行代码,会让服务器git pull相应项目的代码到web目录。

  3. pull结束,代码就在web目录了,我们只要重新访问网站就可以了。

核心就是push的时候,gitlab会调用服务器上的脚本,服务器上的脚本就会从git重新拉取项目文件。同时还需要加入安全性的设计。

配置ssh密钥

先在服务端生成一对你的SSH密钥,因为之后服务器要用ssh方式免账号密码从gitlab上pull代码。用ssh-keygen在服务器上生成密钥,或者你已经有密钥了就跳过这一步。

因为项目配置的nginx和php的用户为www,所以代码执行时以www用户,所以需要www用户的ssh密钥

服务器添加www的密钥

修改www用户,允许登录,项目配置完成后,再修改回nologin

;www:x:22:22:www:/var/www:/usr/sbin/nologin
www:x:22:22:www:/var/www:/bin/bash

su www
cat ~/.ssh/id_rsa.pub

//如果没有
ssh-keygen

gitlab中配置ssh密钥

有了密钥之后,复制你的公钥,在你的gitlab profile个人资料里,找到SSH的目录,粘贴保存进去就可以了。这样gitlab上就有了你web服务器的公钥了,就可以正常SSH了。

也可以使用部署密钥。不同的项目,可以共用相同部署密钥,但记得在对应项目设置中启动此密钥

9861e4557b6dad890df8d47145f27a76.png

服务器脚本

先使用www用户调用sh脚本,如果成功,下一步是通过php执行脚本。
这里我们先使用www用户测试,需要用www用户登录服务器测试。

su www

如果不能成功,可能是设置了www用户为nologin,使用上述方法开启即可。

/home/www 下放了1个sh脚本, 内容如下

#!/bin/bash
cd /home/www/www.pangxieke.com
/usr/bin/git pull origin master

//或者 强制pull
git fetch --all
git reset --hard origin/master
然后使用www用户执行此脚本,测试是否能够获取代码。如果成功后,下一步就是通过钩子执行此脚本

php执行脚本

php通过exec函数执行脚本代码tb.php。需要调用exec函数,如果发现不成功,有可能php.ini配置中禁用了exec函数,重新开启即可
//作为接口传输的时候认证的密钥
$valid_token = '87ea722e507383fb651ff0515b588b';
//调用接口被允许的ip地址

$client_token = $_GET['token'];
$project = $_GET['project']; //多个项目
$client_ip = $_SERVER['REMOTE_ADDR'];
$fs = fopen('./auto_hook.log', 'a');
fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);
if ($client_token !== $valid_token)
{
echo "error 10001";
fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL);
exit(0);
}

$json = file_get_contents('php://input');
$data = json_decode($json, true);
fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);
//这里也可以执行自定义的脚本文件update.sh,脚本内容可以自己定义。if($project == 'pangxieke'){
$res = exec("/home/www/tb.sh", $result);
}else if($project == 'pangxieke2'){
$res = exec("/home/www/tb2.sh", $result);
}

fwrite($fs, 'Data: '.print_r($result, true).PHP_EOL);
fwrite($fs, '======================================================================='.PHP_EOL);
$fs and fclose($fs);
var_dump($result);

然后通过浏览器访问测试

www.pangxieke.com/tb.php?token=87ea722e507383fb651ff0515b588b&project=pangxieke

如果访问后,能够返回git信息,就是代表成功。这样就可以配置gitlab的触发器

如果失败,可以查看auto_hook.log日志

为支持多个项目 配置了project参数,可以部署多个项目。只需要在gitlab钩子中配置时,使用不同的project参数。

www.pangxieke.com/tb.php?token=87ea722e507383fb651ff0515b588b&project=pangxieke
www.pangxieke.com/tb.php?token=87ea722e507383fb651ff0515b588b&project=pangxieke2

gitlab钩子设置

2f1e9cedc7187baef23a48fd16a5c08b.png

然后就可以push代码到仓库,然后查看代码是否部署成功

部署完成记得修改www用户为nologin

来源:http://www.pangxieke.com/linux/1252.html

互联网、金融、通信 DevOps 转型落地经验,就在 GOPS 2020 · 深圳站

43e110fa5aff7f17a1d68d7f1d1d66c4.png

近期好文推荐:

重磅!2020 年 DevOps 持续交付标准和技术运营标准评估报名正式启动!

远程办公条件下,DevOps 如何加快研发交付

持续交付体系在高德的实践历程

有了自动化就是 DevOps?浅谈 DevOps 的反模式

交付全链路数据,苏宁消费金融在 DevOps 度量设计的思考

流程可视化的利器:Jenkins BlueOcean

我只是下了个订单,鬼知道我在微服务里经历了什么…

DevOps 时代的软件过程改进探讨

震惊!DevOps CI/CD 竟然对抗击新冠期间的工作开展有这么大的作用?

“DevOps时代”公众号诚邀广大技术人员投稿。

投稿邮箱:jiachen@greatops.net 或 添加联系人微信:135 2116 9787(同微信)。

点击,立即报名 GOPS 2020 · 深圳站

a7bdb24e720eb6319dc71b2588aa0191.png你点的每个赞,我都认真当成了喜欢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值