利用WebHook实现Github或Coding代码的自动部署

admin 9月前 71

在开发过程中会遇到这样的一个问题本地代码提交Git之后,还要去服务器执行以下git pull,所以会感到很繁琐。所以必须要搭建的便利神器,WebHook实现Github或Coding代码自动部署。本地修改只需commit push,至于服务器的部署,让他自动pull,随时更改随时生效。

简单说下整个流,当你把代码push到git服务器上时,服务器收到请求会像你设置的地址发送一个请求,当服务器收到这个请求之后,进行git pull操作进行代码更新

下面我们就以nginx服务器进行详细演示

首先说下Coding的详细步骤

1.生成公钥

公钥有两个:1. git用户公钥,2. 部署公钥:

git用户公钥

ssh-keygen -t rsa -C "813711465@qq.com"
# 然后一直回车就行
# 生成的文件通常是 /root/.ssh/id_rsa,如果非root用户请查看提示上的路径

部署公钥

sudo -Hu www ssh-keygen -t rsa 
# 请选择 “no passphrase”,一直回车下去 这里以www用户作为演示

2. 准备钩子文件

创建和修改目录权限:

#创建目录
mkdir /data/wwwroot/shitou 
#修改目录权限
chown -R www:www /data/wwwroot/shitou

写入钩子文件:

创建文件

sudo -Hu www touch /data/wwwroot/shitou/webhook.php

钩子文件内容

<?php
    error_reporting(1);
    $target = '/www/wwwroot/shitou'; // 生产环境web目录
    $token = 'shitou';
    $wwwUser = 'www';
    $wwwGroup = 'www';
    
    // 获取push数据内容的方法
    $json = json_decode(file_get_contents('php://input'), true);
    if (empty($json['token']) || $json['token'] !== $token) {
        exit('error request');
    }
    //$repo = $json['repository']['name'];
    $cmd = "cd $target && ls && git pull";
    print_r(shell_exec($cmd));
    //print_r(shell_exec("ls")); //检查php是否开启该函数
    //shell_exec("sudo -Hu www cd $target && git pull"); // 目录换成项目的目录
    //$requestBody = file_get_contents("php://input");
    //sudo -Hu www cd /www/wwwroot/cashbox && git pull

确保你的hook文件可以访问:http://xiuno.laoshiji.cc/shitou/webhook.php,钩子准备完成。

配置Coding的webhook

1.添加用户公钥

复制/root/.ssh/id_rsa.pub内容到个人设置页的SSH公钥里添加即可(https://coding.net/user/account/setting/keys)

2.添加部署公钥

复制/home/www/.ssh/id_rsa.pub的内容并添加到部署公钥:

选择项目 > 设置 > 部署公钥 > 新建 > 粘贴到下面框并确认

3.添加hook

选择项目 > 设置 > WebHook > 新建hook > 粘贴你的coding-webhook/webhook.php所在的网址。比如:http://xiuno.laoshiji.cc/shitou/webhook.php, 令牌可选,但是建议写上。

稍过几秒刷新页面查看hook状态,显示为绿色勾就OK了。

初始化

1.我们需要先在服务器上clone一次,以后都可以实现自动部署了:

sudo -Hu www git clone https://coding.net/u/shitou/p/shitou/git /data/wwwroot/shitou  --depth=1

这个时候应该会要求你输入一次Coding的帐号和密码,因为上面我们设置了永久保存用户名和密码,所以之后再执行git就不会要求输入用户名和密码了。

!!注意,这里初始化clone必须要用www用户

2.往Coding.net提交一次代码测试:

在本地clone的仓库执行:

git commit -am "test webhook" --allow-empty
git push

OK,稍过几秒,正常的话你在配置的项目目录里就会有你的项目文件了。

凡是路,都会有坑,以下列出我遇到的,希望你们遇到跳过去

坑1: php的默认安全策略把敏感函数关掉了,在php.ini中把 shell_exec 这哥们放出来,关我做什么,我要出去执行git pull

改完记得重启php

#1. 停止命令
pkill php-fpm
#2.重启或启动命令
php-fpm -R

坑2: 无权限,一定要把文件的归属权限给到

chown -R www:www /www/wwwroot/shitou

坑3: 无权发起git pull命令

虽然webhook.php可以访问.git了,但是发起git pull命令的时候,仍然是以www用户去发起的。而我们线上服务器是以root,用https的方式发起的git请求,www用户无权限。

去网上查了很多资料,得到如下解决方法:以www用户发起git请求,并记录用户密码

i、sudo -Hu www git config --global credential.helper store: 记住用户名密码

ii、sudo -Hu www git pull

第一次拉取的时候,要求输入用户名密码,输入正确之后,下次再执行就不用输入用户名密码了。

总之遇到问题记住一点:一定要多看日志,一定要多看日志,一定要多看日志,通过日志分析问题,如果还是跳不过去就发email给我吧,813711465@qq.com(在我有空的前提下可以help下)


最新回复 (0)
全部楼主
返回
发新帖
老师机论坛