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

利用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会被自动执行!

感谢你的阅读!

认真,可以让事情变得出乎意料地好!
本帖已被设为精华帖!
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6
Summer

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

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

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!