利用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进行自动化部署
主题更新要积极,催更小助手来提醒你