GitHub和WebHooks自动部署PHP项目

前言

在项目开发中,都会遇到两个过程,一个是版本控制,另外一个是代码发布php

版本控制目前有两种途径,一个是git,另外一个是svn。我用的是git,在这里就不介绍git和svn的差别了。vue

而代码发布,在最初的时候,用的都是ftp直接将代码拉倒服务器上(由于这是我本身的项目),这样子不只费事,还容易出事。nginx

下面就引入GitHub和WebHooks达到自动部署。git

使用

在咱们完成开发并测试经过以后,将代码提交到git上,git就自动调用hook将代码pull到服务器上。github

原理

步骤

建立项目的用户

在当git访问服务器上的webhook脚本时,主要任务就是执行git pull将代码更新到服务器上,这时是以nginx的运行用户(ps -ef | grep nginx 可查看)去执行这个命令的,因此运行nginx的用户要拥有对项目读写的权限。web

建立ssh-key并配置到github

上面提到的用户,须要给它配置ssh-key,配置ssh-key是为了可以方便在拉取代码pull的时候,能够不用输入账号密码,在当webHooks脚本执行的时候,用的是nginx的用户,因此应该要以nginx的运行用户去建立一个ssh-key。 能够本身建立一个新的用户,用这个用户去运行nginx(下面介绍),而后将项目的分给这个用户(下面介绍)。shell

建立webHooks并部署项目

这一步是为了在项目push到master版本的时候,由webHooks完成自动部署。json

  1. 在gitHub上为须要自动部署的项目新建一个WebHools浏览器

    Setting -> WehHooks -> Add web 服务器

    在建立的时候须要输入密码。

  2. 填写webhook基本信息

    • webhook请求的接口

      前面有说过了,这个接口其实是执行git pull将代码更新到服务器项目中,下面是php版本代码。

      <?php
      // 本地仓库路径 既项目路径
      $local = '/data/web/testWebHooks';
      
      // 若是仓库目录不存在,返回错误
      if (!is_dir($local)) {
          header('HTTP/1.1 500 Internal Server Error');
          die('Local directory is missing');
      }
      
      //若是请求体内容为空,返回错误
      if (!isset($_POST['payload'])) {
          header('HTTP/1.1 400 Bad Request');
          die('HTTP HEADER or POST is missing.');
      }
      
      // 上图中第2步的Content Type是application/x-www-form-urlencoded,所应用post接受
      $payload = json_decode($_POST['payload'], true);
      
      // 签名
      if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE']) || !$_SERVER['HTTP_X_HUB_SIGNATURE']) {
      	header('HTTP/1.1 403 Bad Request');
          die('Permission denied.' . json_encode($_SERVER));
      }
      $signature = $_SERVER['X-Hub-Signature'];
      
      list($algo, $hash) = explode('=', $signature, 2);
      //计算签名
      $secret = '******';	// 上图中第三部填写的密码
      $payloadHash = hash_hmac($algo, $payload, $secret);
      if ($hash !== $payloadHash){
          header('HTTP/1.1 403 Bad Request');
          die($signature . ' ' . $_SERVER['X-Hub-Signature']);
      }
      复制代码

      这是一个php脚本,主要有两个功能,一个是校验,另外一个是更新代码。校验是为了防止你的脚本被别人一直请求,第二个就是从git上拉取代码并更新。

      若是你的项目是vue或者是其余须要编译的项目,能够在更新代码以后执行编译过程。

      在git上填写信息以后,会自动去请求这个接口进行测试,http返回200表示成功。具体的请求记录在提交信息下方的Recent Deliveries

      注意

      1.确保PHP正常执行系统命令。写一个PHP文件,内容:

      <?php shell_exec('ls -la')
      复制代码

      在经过浏览器访问这个文件,可以输出目录结构说明PHP能够运行系统命令。

测试提交代码到git并完成自动部署

当咱们经过git push提交代码以后,能够在github的webhook页面最下面看到webhook的执行记录。若是提示成功了,能够去刷新页面查看是否有更新成功。

相关文章
相关标签/搜索