利用webhooks进行自动化部署
最初,写完项目后,通过ftp把代码传到服务器上,后续如果有修改,再把修改的文件通过ftp上传到服务器进行覆盖,这个流程属实麻烦。
后来使用git代码仓库管理,本地写好代码后,push到仓库,然后到服务器上pull,操作相对比较方便。
但是,依旧觉得这样还是很麻烦,先不说本地push,然后到服务器pull,这只是1台服务器的情况下,如果有多台服务器呢?
其实可以利用webhooks进行自动化部署:本地push后,线上自动pull,这样就方便多了。
下面以gitee做例子,github也同理。
添加webhook
新建项目->打开项目地址->管理->webhooks->添加
URL:通知地址,根据项目填写地址即可,例如 https://xxx.com/webhooks.php
WebHook 密码/签名密钥:这里我用的是WebHook密码
事件的话按需选择,这里我选的是Push,也就是对项目进行push操作后会触发该webhook事件。
最后点击添加即可。
创建ssh公钥
一般php运行使用的是www用户,具体的可以在webhooks.php里面:
exec("cd ~ && cd - && cd -", $output);
print_r($output);然后在webhook里面点击测试,我这边输出的结果是:
Array ( [0] => /home/wwwroot/xxx.com/pay/public [1] => /home/www ) // [0]为项目路径 // [1]为用户目录,也就是执行git pull的是www用户
那么需要切换到www用户 su www 进行创建ssh公钥
如果出现错误,那么需要vim /etc/passwd,找到www用户,把最后面的修改为bin/bash:
// 只需修改最后的 sbin/nologin 为 bin/bash 即可,其它不用动,修改用后如下: www:x:1000:1000::/home/www:/bin/bash
保存后再su www即可。
接下来是创建ssh公钥:
ssh-keygen -t rsa -C "xxx@xx.com"
三次回车即可,接着:
cat ~/.ssh/id_rsa.pub
把输出的公钥添加到gitee项目的部署公钥管理里面:
首次请先在项目根目录下进行git pull,然后输入yes,后续就可以通过webhooks进行自动pull了。
编写webhooks.php
<?php
// 添加webhooks时候填写的密码
$secret = "password";
$payload = file_get_contents('php://input');
if (!$payload) {
die('Missing Request Body.');
}
$data = json_decode($payload, true);
if (!empty($data)) {
if ($data['password'] === $secret) {
$result = shell_exec("cd ".__DIR__." && cd ../ && git pull 2>&1");
print($result);
} else {
echo 'Password Error.';
}
} else {
echo 'Request Body Content Is Empty.';
}另外需要开放exec、shell_exec函数,一般环境中默认是禁用的,如果项目是laravel、tp5这些的话,一般也就已经打开了的。
另一种简单的方法
编辑项目根目录下的.git/config文件,修改url为下面格式即可:
url = https://gitee帐号:gitee密码@gitee.com/账号名/gitee仓库名.git
两种方法的区别
明显的,一个通过ssh公钥进行管理,一个是明文的账号密码,如果是自己的服务器,其实没多大关系,但仍然建议使用ssh公钥的方式。
2020.05.09更新:另一种方式生成ssh公钥进行webhooks进行自动化部署


主题更新要积极,催更小助手来提醒你