利用 webhook 实现线上服务器自动部署
利用webhook实现线上服务器自动部署
tags: blog
大家好!我是shelter。
最近弄了下webhook,踩了一些在windows server下的坑,在这里和大家分享下!
Linux版本
webhook简介
还在为团队每次push代码后,每次都要到线上服务器跑 git pull 部署代码而感到烦恼?
webhook(钩子)或许能够帮到你!
使用步骤
环境:
服务器:阿里云服务器 | windows server 2012 | apache2.4 | php5.4
远程仓库: coding 官方webhook手册
本地: win10 | apache2.4 | php5.4
1.制作ssh rsa key
首先,先配置系统环境变量登录用户的个人目录路径
(制作ssh密钥和密钥的使用都需要到该环境变量。window server 2012没有默认配置)
打开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远程仓库的部署公钥上
(部署公钥只有项目管理员才能设置)
3.更改apache服务器的登录用户
因为 shell_exec()运行git pull的时候,需要去获取上面制作的ssh密钥,因此需要拥有系统登陆账号的权限才能读到C:\Users\shelter.ssh目录下的id_rsa、id_rsa.pub
修改apache服务的登录用户即可
重启apahce服务器,可以在任务管理器看到
修改成功!
这个方法算是比较妥协的做法,弊端是,服务器刚开机的时候,钩子会失效,因为开机自启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
填写webhook.php的外网url还有核实身份用的token(上面代码中有用到)。
点击确定后,coding会立刻发送一个测试包裹,只要请求结果为200,便视为成功!(如果超过5秒未响应,则失败!)
恭喜你,到这里windows server 下的自动部署已经成功了!
每次团队push代码,都会触发coding的push事件并调用你配置的webhook,服务器上的webhook.php就会被执行,也就是git pull会被自动执行!
感谢你的阅读!
不错,就是得小心有人搞破坏。
可以使用类似于 Laravel HTTP 基础认证 做下安全认证