git webhook配置

2018-12-10 03:01:15   工作备份

  Git自动部署   coding  

基于CODING仓库配置 GIT自动部署

项目中每次提交合并后都需要在服务器拉取,操作很麻烦,所以研究了下git的自动部署(由于服务器在局域网内部,不得以又做了端口转发,做一次中转,端口转发的操作,这里不再赘述,我之后会再详细介绍)

基本流程如下:当你把代码推送到服务器后,coding会向你设置的webhook地址发送一个请求,当你的服务器接收到这个请求后,进行git pull操作即可

我们需要:部署公钥(coding需要)

  1. .生成部署公钥:
    1. //我们以宝塔默认创建的用户www为例(密码请选择: no passphrase,之后一路回车即可)
    2. sudo -Hu www ssh-keygen -t rsa
    3. //如果提示没有/home/www/.ssh/目录的化,手动创建/home/www/即可(注意在root用户下创建,创建后需要注意用户组和用户主为www)
  2. 编写webhook可访问的钩子文件
    1. //创建目录以及修改目录权限
    2. mkdir /www/wwwroot/webhook.com/
    3. chown www:www /www/wwwroot/webhook.com/
    4. //编写钩子文件
    5. sudo -Hu www touch /www/wwwroot/webhook.com/webhook.php
  3. 钩子文件内容

    1. $target = '/www/wwwroot/'; // 生产环境web目录
    2. error_reporting(E_ALL|E_STRICT);
    3. ini_set("display_errors",'1');
    4. $json = json_decode(file_get_contents('php://input'), true);
    5. //可以根据json内容做逻辑判断
    6. $repo = isset($json['repository']['name'])?$json['repository']['name']:"silicon";//silicon 默认项目目录名 换成自己的
    7. $target = $target.$repo;
    8. $cmd = "cd $target && git pull 2>&1";
    9. opcache_reset();//清空opcache
    10. echo shell_exec($cmd);
  4. 配置coding用户公钥

    1. 复制/root/.ssh/id_rsa.pub的内容,在下面地址内添加公钥即可
    2. https://coding.net/user/account/setting/keys
  5. 配置部署公钥
    1. 复制/home/www/.ssh/id_rsa.pub的内容,在coding项目 内设置部署公钥即可
  6. 添加webhook
    1. 同样在coding项目设置内设置webhook地址,该地址为第三步创建的公网上可访问的待部署服务器上的钩子文件地址(所以需要你的服务器可被公网访问,如果不行,那就只能配置端口转发来实现这个目的
    2. 添加完成后,点击测试,弹出绿色对勾既是访问正常

    到这里我们前期的准备工作就告一段落,开始Git的初始化操作

    我们现在服务器上将代码clone一次
  1. //一定注意 指定初始化clone必须使用www用户以及Git仓库地址为ssh地址
  2. sudo -Hu www git clone git@git.coding.net:******.git --depth=1

现在我们在本地提交一次代码,并推送到master,就会自动拉取了

故障排雷

倘若部署成功后,cli模式下运行正常,但是浏览器模式下运行总是失败的话

  1. 亲身经历,部署时浏览器访问无返回值,修改钩子代码

    1. .......
    2. $cmd = "cd $target && git pull 2>&1";#增加输出
    3. echo shell_exec($cmd);
  2. 输出显示error: cannot open .git/FETCH_HEAD: Permission denied
    将对应.git目录授予777权限即可
  3. 可惜后来还是出现问题,经过查证,是php运行用户www权限不足导致的,手动提权后才恢复正常(不建议提权

    1. 切换为root用户
    2. 执行visudo,修改配置文件(sudo提权,免输密码)
    3. 添加 www ALL=(ALL) NOPASSWD: ALL
    4. 保存
    5. 修改钩子文件
    6. .......
    7. $cmd = "cd $target && sudo git pull 2>&1";#使用sudo 提权
    8. echo shell_exec($cmd);