Coding+Webhook实现PHP项目自动部署

#1 webhook的作用

目前是学生党一枚,平时涉及的也都是自己的个人项目(PHP)。对于自己的个人项目开发部署,正常流程应该是本地开发,然后git push到Coding托管平台的远程仓库上,最后登录服务器从Coding上面git pull下来,一个PHP个人项目就部署好了。

但是,一旦需要本地不断变更,线上同时想要实时看到变更效果(如线上调试),就会不断git push与git pull,fix bug的时候简直…啧啧啧,而webhook的出现则让我们省掉了登录服务器去手动git pull这一步!!!

#2 webhook工作原理简单概述

在实践之前可以大致了解一下webhook的工作原理。可以分为以下几步

  • 开发者在本地执行git push,将本地仓库的代码推到Coding托管平台的对应仓库中。
  • Coding托管平台中的项目仓库在接收本地push之后,根据当前仓库的webhook设置,自动请求处于服务器端项目仓库中的钩子文件,并传递具有一定格式的数据。还有就是并非只有push事件可以触发webhook,Coding还支持以下事件发生时触发webhook。
  • 服务端项目仓库中的钩子文件被触发执行,接收Coding传递的参数,在验证身份之后,开始自动执行git pull操作,将代码pull到服务器项目仓库中。

#3 准备工作

环境说明:需要必须安装的,新手自行Google如何安装

  • 本地 Windows 10
  • 服务器 CentOS7
  • 服务器、本地皆已经安装了Git(必须)
  • 根据编写服务器端钩子文件的语言类型,搭建好服务器端钩子文件运行环境,这里的钩子文件是PHP写的,因此需要搭建LAMP(必须)

前期准备

  • 在Coding上面创建一个项目仓库

  • 在本地初始化项目仓库,并关联上一步创建的Coding的远程项目仓库

    1. 创建一个新的文件夹,并Git初始化项目仓库
     git init
    2. 关联Coding上的项目仓库
     git remote add origin git@git.coding.net:xxx/xxx.git(填写你的Coding项目仓库地址,没有设置秘钥验证的请选择https形式的链接)
  • 在服务器端初始项目仓库,同样需要关联Coding的远程项目仓库,同上一步,在关联那一步请选择git形式的链接

    1. 创建一个新的文件夹,并Git初始化项目仓库
     git init
    2. 关联Coding上的项目仓库(这里一定要选择git形式的项目仓库链接)
     git remote add origin git@git.coding.net:xxx/xxx.git
    
     之所以要选择git形式的项目仓库链接,是因为https形式的链接会在每次git push、pull的时候需要手动输入账号密码,那这样webhook的自动git pull就不起作用了,也就没意义了。而git形式只要事先配置好秘钥,就可以自动验证了。

附带SSH访问Coding仓库的传送门

注意

扫描二维码关注公众号,回复: 3218581 查看本文章
  • 一定要先创建并Git初始化好服务器端的项目仓库,因为会涉及到服务器端项目文件夹的权限修改,一开始的时候我总是忽略这点,总是在项目文件夹的权限修改之后,才进行Git初始化,这导致项目文件夹下Git初始化所创建的文件夹的权限没有被修改,也就会造成钩子无法自动git pull,因为没有权限!!!

#4 添加Coding部署公钥

服务器生成公钥、秘钥文件

cd /usr/share 
sudo chown apache httpd/ # 修改httpd目录的所有者
sudo -Hu apache ssh-keygen -t rsa # 一直回车下去
sudo cat /usr/share/httpd/.ssh/id_rsa.pub # 查看生成的公钥内容,并复制公钥全部内容

部署公钥至Coding
进入Coding对应的项目仓库当中,选择设置-->部署公钥-->新建部署公钥,将上一步复制的公钥添加即可。

#5 编写钩子文件

服务器端项目仓库创建钩子文件webhook.php,这里给出PHP版的钩子文件例子。

注意

<?php
error_reporting(1);
// 项目仓库文件夹路径
$dir =  '/var/www/html/SmallPunchMiniProgramAfterEnd';


// Coding新版本的webhook若是设置了token,Coding则对每个请求进行了哈希签名
// 这个签名会放在请求头 X-Coding-Signature,在服务器端我们需要进行签名解析才能拿到真正数据

// token验证令牌,与Coding webhook上设置的一致,用于与Coding进行身份验证,防止恶意提交代码
$token = 'xxx';
// 从请求头中获取签名
$signature = $_SERVER['HTTP_X_CODING_SIGNATURE'];

// 接收Coding post传递的参数
$json_post = file_get_contents('php://input');

// 进行签名解析
$sha1 = hash_hmac("sha1",$json_post,$token);

$calculate_signature = 'sha1='. $sha1;

// 进行身份验证
if ($calculate_signature !== $signature) {
    exit('error request');
}

// shell_exec()即PHP用于执行系统命令的函数
// cd $dir:进入上面设置的项目仓库文件夹中
// git checkout -f 撤销本地的修改
// git pull origin master  从Coding的项目仓库master分支拉取最新代码,注意origin为远程仓库的别名,要与 git remote add 远程仓库
别名 仓库地址 中的远程仓库别名保持一致
echo shell_exec("cd $dir && git checkout -f && git pull origin master 2>&1");

#6 给予apache操作项目仓库目录的权限

直接授予最高的777权限,注意后面的-R不要漏了。

sudo chmod 777 /var/www/html/SmallPunchMiniProgramAfterEnd/ -R

#7 (注意)服务器端手动pull一次

在编写好钩子文件、授予完操作项目目录权限之后,还需要在服务器端项目仓库中以apache的身份手动git pull一次,在此之前请先在本地提交一次到Coding的项目仓库中。

cd /var/www/html/SmallPunchMiniProgramAfterEnd/
sudo -u apache git pull origin master

#8 配置Coding的webhook

# 结语

由于懒拖了超级久,这次趁着作业项目终于整理了出来,然后又被Coding 新版的Webhooks 签名加密的验证机制耗了半天…但也由于拖太久,起初的一些坑我可能忘了(例如要安装什么的),若有什么错误,希望谅解!

最后提醒大家一点的是,这是针对PHP项目的Coding+webhook实现自动部署,使用于使用Apache作为web 服务器,若是用的是Nginx可能不行,之前舍友试过,等我有空再去折腾一下吧!

相关参考

猜你喜欢

转载自blog.csdn.net/qq_32346189/article/details/82627299