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

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

感谢你的阅读!

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

本帖已被设为精华帖!
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6
Summer

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

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

2年前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!