最初,写完项目后,通过ftp把代码传到服务器上,后续如果有修改,再把修改的文件通过ftp上传到服务器进行覆盖,这个流程属实麻烦。

后来使用git代码仓库管理,本地写好代码后,push到仓库,然后到服务器上pull,操作相对比较方便。

但是,依旧觉得这样还是很麻烦,先不说本地push,然后到服务器pull,这只是1台服务器的情况下,如果有多台服务器呢?

其实可以利用webhooks进行自动化部署:本地push后,线上自动pull,这样就方便多了。

下面以gitee做例子,github也同理。

添加webhook

新建项目->打开项目地址->管理->webhooks->添加


利用webhooks进行自动化部署 热爱折腾 第1张


利用webhooks进行自动化部署 热爱折腾 第2张


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项目的部署公钥管理里面:


利用webhooks进行自动化部署 热爱折腾 第3张


首次请先在项目根目录下进行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.';
}

另外需要开放execshell_exec函数,一般环境中默认是禁用的,如果项目是laravel、tp5这些的话,一般也就已经打开了的。

另一种简单的方法

编辑项目根目录下的.git/config文件,修改url为下面格式即可:

url = https://gitee帐号:gitee密码@gitee.com/账号名/gitee仓库名.git

两种方法的区别

明显的,一个通过ssh公钥进行管理,一个是明文的账号密码,如果是自己的服务器,其实没多大关系,但仍然建议使用ssh公钥的方式。


2020.05.09更新:另一种方式生成ssh公钥进行webhooks进行自动化部署