前言

2018年第一篇文章,没啥技术含量,权当笔记

我们一般都会用git或者svn来管理我们的代码

每次代码更新后还要手动的去把服务器上的代码也更新一遍

项目小了还好 项目大了着实浪费时间

要是服务器上的代码也能像git那样增量更新就好了

今天就说说如何通过webhook的形式来让服务器自动拉取我们push的代码

原理

现在的Git服务器一般都会有个webhook服务

什么意思呢?

就是我们在执行了push、merge等一系列的操作的时候

Git服务器会发送一个请求到我们指定的URL

并且会把此次动作的相关数据也发送过去

这里我们使用开源中国的码云演示

在帮助文档中可以看到

当我们发生push之类的操作的时候

Git服务器会像我们指定的url发送以下数据

{
"before": "fb32ef5812dc132ece716a05c50c7531c6dc1b4d",
"after": "ac63b9ba95191a1bf79d60bc262851a66c12cda1",
"ref": "refs/heads/master",
"user_id": 13,
"user_name": "123",
"user": {
"name": "123",
"username": "test123",
"url": "https://gitee.com/oschina"
},
"repository": {
"name": "webhook",
"url": "http://git.oschina.net/oschina/webhook",
"description": "",
"homepage": "https://gitee.com/oschina/webhook"
},
"commits": [
{
"id": "ac63b9ba95191a1bf79d60bc262851a66c12cda1",
"message": "1234 bug fix",
"timestamp": "2016-12-09T17:28:02 08:00",
"url": "https://gitee.com/oschina/webhook/commit/ac63b9ba95191a1bf79d60bc262851a66c12cda1",
"author": {
"name": "123",
"email": "123@123.com",
"time": "2016-12-09T17:28:02 08:00"
}
}
],
"total_commits_count": 1,
"commits_more_than_ten": false,
"project": {
"name": "webhook",
"path": "webhook",
"url": "https://gitee.com/oschina/webhook",
"git_ssh_url": "git@gitee.com:oschina/webhook.git",
"git_http_url": "https://gitee.com/oschina/webhook.git",
"git_svn_url": "svn://gitee.com/oschina/webhook",
"namespace": "oschina",
"name_with_namespace": "oschina/webhook",
"path_with_namespace": "oschina/webhook",
"default_branch": "master"
},
"hook_name": "push_hooks",
"password": "pwd"
}

于是乎,我们就可以拿这些数据来做做文章了

准备

  • 一个git仓库
  • 安装了web服务器与git支持的服务器

步骤

服务器篇

1.首先我们需要为www用户创建一个ssh密钥

切换到www用户下并生成一个rsa密钥

su - www
ssh-keygen -t rsa

密钥一般生成在 /var/www/.ssh/ 这个路径下

文件名为 id_rsa

  1. 创建一个可供Git服务器通知的页面

网站的建立这里不再敷述

文件内容如下

<?php
//git webhook 自动部署脚本
//项目存放物理路径
$path = "你的项目部署路径";
$requestBody = file_get_contents("php://input");
if (empty($requestBody)) {
die('send fail');
}
$content = json_decode($requestBody, true);
//若是主分支且提交数大于0
if ($content['ref']=='refs/heads/master' && $content['total_commits_count']>0) {
$res = shell_exec("cd {$path} && git pull 2>&1");//以www用户运行
$res_log = '-------------------------'.PHP_EOL;
$res_log .= $content['user_name'] . ' 在' . date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '项目的' . $content['ref'] . '分支push了' . $content['total_commits_count'] . '个commit:' . PHP_EOL;
$res_log .= $res.PHP_EOL;
file_put_contents("git-webhook.txt", $res_log, FILE_APPEND);//追加写入
}
echo '很棒:'.date('y-m-d H:i:s');

以上代码相信都可以看懂

Git发送过来的数据相当丰富

我们可以用这些数据来做些过滤来决定是否需要更新服务器上的本地代码

代码库篇

  1. 创建代码仓库

创建方法这里不在敷述

2. 添加ssh密钥

在项目管理中把上面步骤第一步中得到的ssh密钥添加到仓库的部署密钥中

这样我们的web服务器就有了拉取代码的权限

3.添加hook路径

同样在项目管理中添加webhook链接

这里可以添加一个密码,我偷懒这里没加

需要加的话可以在hook文件中添加一个验证

可以防止被恶意访问

联合

最后我们需要在我们的部署目录先把git初始化一次

su - www
git clone git仓库地址 项目部署地址

然后我们往git仓库中提交一次代码更新

稍等一下

如果一切正常的话我们的项目目录就会自动拉取你刚才提交的代码了


在hook路径中也有log记录

不需要的话可以把代码注释掉

php与Git下基于webhook的自动化部署的更多相关文章

  1. 基于 Jenkins Pipeline 自动化部署

    最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置 ...

  2. [转]基于AWS的自动化部署实践

    作者 徐桂林 发布于 2014年1月22日 -------------------------------------------------------------------- 1. 背景 在过去 ...

  3. 使用Git实现Laravel项目的自动化部署

    简介 不知道大家一开始是怎么使用 git 进行开发的,反正我个人是先将代码提交到 github 仓库,然后用 SSH 登录到服务器,然后进行克隆或者版本更新.听起来就很麻烦,当然实际操作中也很麻烦,那 ...

  4. 基于AWS的自动化部署实践

    过年前,我给InfoQ写了篇文章详细介绍我们团队在过去4年基于AWS的自动化部署实践.文章包括了:为什么选择AWS.AWS上自动化部署的优势和挑战.我们的解决方案,以及和AWS DevOps方案(Op ...

  5. Jenkins+Maven+Git搭建持续集成和自动化部署的配置手记

    前言    持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示.自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误.之前一直没有把这个做起来,最近的新 ...

  6. Jenkins学习总结(3)——Jenkins+Maven+Git搭建持续集成和自动化部署的

    前言 持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示.自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误.之前一直没有把这个做起来,最近的新项目正 ...

  7. [自动化]基于kolla-ceph的自动化部署ceph集群

    kolla-ceph来源: 项目中的部分代码来自于kolla和kolla-ansible kolla-ceph的介绍: 1.镜像的构建很方便, 基于容器的方式部署,创建.删除方便 2.kolla-ce ...

  8. [自动化]基于kolla的自动化部署ceph集群

    kolla-ceph来源: 项目中的部分代码来自于kolla和kolla-ansible kolla-ceph的介绍: 1.镜像的构建很方便, 基于容器的方式部署,创建.删除方便 2.kolla-ce ...

  9. git 远程服务器创建项目自动化部署、克隆推送免密码

    1.用git用户 在git目录下 创建裸仓库 git init --bare project_01.git 2.在裸仓库的 hooks目录下创建 post-receive 文件775 3.post-r ...

随机推荐

  1. js中if else switch 条件判断的替代方法

    function condition(test){ return({ cat :function(){console.log('cat');}, dog :function(){console.log ...

  2. bootstrap轮播图不能显示左右箭头

    引入font文件夹即可 原文 :http://www.imooc.com/qadetail/64277

  3. 20135337朱荟潼Java实验报告二

    20135337朱荟潼 实验二 Java面向对象程序设计 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L ...

  4. 2018-2019-20172329 《Java软件结构与数据结构》第九周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十五章-图 一.图及无向图 1.图的相关概 ...

  5. cnblogs用户体验评价

    1. 是否提供良好的体验给用户(同时提供价值)? 博客园就相当于现在生活中处处可见的微博,所有人都在上面发表自己的一些看法,当然我们比较关注的是计算机编程方面的一些博客,大多数编程人员愿意分享自己的代 ...

  6. 第二阶段Sprint冲刺会议8

    进展:重新规划主界面,把视频录制暂放到主页面里,先实现功能,视频提醒后期再做.

  7. KEIL C51代码优化详细分析

    阅读了<单片机与嵌入式系统应用>2005年第10期杂志<经验交流>栏目的一篇文章<Keil C51对同一端口的连续读取方法>(原文)后,笔者认为该文并未就此问题进行 ...

  8. web国际化,在不同的浏览环境,显示不同的语言

    所谓国际化就是支持多种语言,web应用在不同的浏览环境中可以显示出不同的语言.假设我们正在开发一个支持多国语言的Web应用程序,要求系统能够根据客户端的系统的语言类型返回对应的界面:英文的操作系统返回 ...

  9. 微信小程序组件 模块化错和叹号

    wxml 页面 <import src="/pages/lianxi/lianxi.wxml" />  //引入文件 <view style='position: ...

  10. Jquery 中 $.getJSON的用法

    之前类似的方法用过 $.post, $.get,$.ajax,还是第一次用这个 $.getJSON. 前三个都是用作异步请求的,那么最后一个呢?其实也是异步请求的,和 $.get 最类似,因为他也是将 ...