利用 webhook 实现线上服务器自动部署

分享 ShelterYa ⋅ 于 2年前 ⋅ 最后回复由 JiaFeiX 2周前 ⋅ 7970 阅读

利用webhook实现线上服务器自动部署

tags: blog


大家好!我是shelter。

最近弄了下webhook,踩了一些在windows server下的坑,在这里和大家分享下!
Linux版本

webhook简介

还在为团队每次push代码后,每次都要到线上服务器跑 git pull 部署代码而感到烦恼?
webhook(钩子)或许能够帮到你!

file

使用步骤

环境:
服务器:阿里云服务器 | windows server 2012 | apache2.4 | php5.4
远程仓库: coding 官方webhook手册
本地: win10 | apache2.4 | php5.4

1.制作ssh rsa key

首先,先配置系统环境变量登录用户的个人目录路径
制作ssh密钥和密钥的使用都需要到该环境变量。window server 2012没有默认配置)

file

打开cmd 运行

ssh-keygen -t rsa -C "youremail@example.com"

通常是直接存到HOME路径并且不需要到密钥密码,所以直接三个回车

可以C:\Users\shelter.ssh目录下看到id_rsa、id_rsa.pub两个文件
在生产密钥成功!(失败的话,可能是前面HOME环境变量配置有问题)


2.配置到远程coding库

将上面生产的id_rsa.pub,配置到项目coding远程仓库的部署公钥上

file

(部署公钥只有项目管理员才能设置)


3.更改apache服务器的登录用户

因为 shell_exec()运行git pull的时候,需要去获取上面制作的ssh密钥,因此需要拥有系统登陆账号的权限才能读到C:\Users\shelter.ssh目录下的id_rsa、id_rsa.pub

修改apache服务的登录用户即可

file

重启apahce服务器,可以在任务管理器看到

file

修改成功!

这个方法算是比较妥协的做法,弊端是,服务器刚开机的时候,钩子会失效,因为开机自启apache的时候,还是算是SYSTEM账号的。需要自己登陆上去后,重启apache,钩子能用。
不知道大家有没有更好的做法!


4. 编写项目钩子

编写webhook.php到 需要自动部署的项目根目录下

<?php

  //coding会以post请求发送一些认证数据,防止别人恶作剧
  //具体数据查看 https://open.coding.net/webhook.html 
  //这里不能用$_POST接受,无法接收到 RAW_POST_DATA
  $post_data =  json_decode($GLOBALS['HTTP_RAW_POST_DATA']);

  //这里是一个认证的token,下面我们就会设置到
  if($post_data->token === 'shelter') {

      $pwd = getcwd();

      // '2>$1' 配置管道输出错误,方便调试
      // 这里已经配置了上面coding仓库的remote,并且-u 绑定了默认remote,所以直接使用'git pull'
      // 建议先在cmd里面把这条命令跑通了先!
      $command = 'cd ' . str_replace('\\', '/\\', $pwd) . ' & git pull 2>&1';

      $status = shell_exec($command);

      print $status;
  }
?>

这里webhook.php的位置可以自由存放,只要放在能够被外网访问到的位置即可。
如果放在和项目根目录路径不同的位置,那上面的\$command要做出相应修改
(可以在cmd里面跑\$command以测试是否正确)


5. 配置coding远程仓库webhook

file

填写webhook.php的外网url还有核实身份用的token(上面代码中有用到)。

点击确定后,coding会立刻发送一个测试包裹,只要请求结果为200,便视为成功!(如果超过5秒未响应,则失败!)

file

恭喜你,到这里windows server 下的自动部署已经成功了!

每次团队push代码,都会触发coding的push事件并调用你配置的webhook,服务器上的webhook.php就会被执行,也就是git pull会被自动执行!

感谢你的阅读!

本文章首发在 Laravel China 社区

认真,可以让事情变得出乎意料地好!

本帖已被设为精华帖!
回复数量: 6
  • Summer MOD A Life-long learner.
    2年前

    不错,就是得小心有人搞破坏。

    可以使用类似于 Laravel HTTP 基础认证 做下安全认证

  • ShelterYa 他们都说我是个怪人。。。
    2年前

    @Summer 配置coding仓库的时候,有个token,可以做验证 哈 我没提到。赶着去上课。。。

  • ShelterYa 他们都说我是个怪人。。。
    2年前

    @jessynt 嗯嗯,我这里是针对windows server的。。linux的还没弄。。下次再分享linux下的

  • Clarencep
    2年前

    忍不住吐槽几句:

    1. 居然是用Windows服务器?搞PHP用Windows作为生成环境,很好奇性能如何?
    2. $post_data = json_decode($GLOBALS['HTTP_RAW_POST_DATA']); 中居然还用废弃的HTTP_RAW_POST_DATA, 建议换成file_get_contents("php://input")
    3. $command = 'cd ' . str_replace('\\', '/\\', $pwd) . ' & git pull 2>&1'; 你家生成服务器上直接用git部署代码?总感觉怪怪的
  • ShelterYa 他们都说我是个怪人。。。
    2年前

    @Clarencep 1.因为一些特殊的原因,服务器用的是windows。。。 2.原先用的是file_get_contents("php://input"),但是居然发现无法接受到coding 的raw post data。我也感觉很奇怪,还没去深究。 3.我的webhook是搭在测试服务器上的。。啊哈哈。。至于那个恶心的路径问题,是windows的坑啊。。

  • JiaFeiX
    2年前

    服务器安全性。另外,可以逐步积累成为方案

暂无评论~~
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 100 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档