php与Git下基于webhook的自动化部署
前言
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
- 创建一个可供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发送过来的数据相当丰富
我们可以用这些数据来做些过滤来决定是否需要更新服务器上的本地代码
代码库篇
- 创建代码仓库
创建方法这里不在敷述
2. 添加ssh密钥
在项目管理中把上面步骤第一步中得到的ssh密钥添加到仓库的部署密钥中
这样我们的web服务器就有了拉取代码的权限
3.添加hook路径
同样在项目管理中添加webhook链接
这里可以添加一个密码,我偷懒这里没加
需要加的话可以在hook文件中添加一个验证
可以防止被恶意访问
联合
最后我们需要在我们的部署目录先把git初始化一次
su - www
git clone git仓库地址 项目部署地址
然后我们往git仓库中提交一次代码更新
稍等一下
如果一切正常的话我们的项目目录就会自动拉取你刚才提交的代码了
在hook路径中也有log记录
不需要的话可以把代码注释掉
php与Git下基于webhook的自动化部署的更多相关文章
- 基于 Jenkins Pipeline 自动化部署
最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置 ...
- [转]基于AWS的自动化部署实践
作者 徐桂林 发布于 2014年1月22日 -------------------------------------------------------------------- 1. 背景 在过去 ...
- 使用Git实现Laravel项目的自动化部署
简介 不知道大家一开始是怎么使用 git 进行开发的,反正我个人是先将代码提交到 github 仓库,然后用 SSH 登录到服务器,然后进行克隆或者版本更新.听起来就很麻烦,当然实际操作中也很麻烦,那 ...
- 基于AWS的自动化部署实践
过年前,我给InfoQ写了篇文章详细介绍我们团队在过去4年基于AWS的自动化部署实践.文章包括了:为什么选择AWS.AWS上自动化部署的优势和挑战.我们的解决方案,以及和AWS DevOps方案(Op ...
- Jenkins+Maven+Git搭建持续集成和自动化部署的配置手记
前言 持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示.自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误.之前一直没有把这个做起来,最近的新 ...
- Jenkins学习总结(3)——Jenkins+Maven+Git搭建持续集成和自动化部署的
前言 持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示.自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误.之前一直没有把这个做起来,最近的新项目正 ...
- [自动化]基于kolla-ceph的自动化部署ceph集群
kolla-ceph来源: 项目中的部分代码来自于kolla和kolla-ansible kolla-ceph的介绍: 1.镜像的构建很方便, 基于容器的方式部署,创建.删除方便 2.kolla-ce ...
- [自动化]基于kolla的自动化部署ceph集群
kolla-ceph来源: 项目中的部分代码来自于kolla和kolla-ansible kolla-ceph的介绍: 1.镜像的构建很方便, 基于容器的方式部署,创建.删除方便 2.kolla-ce ...
- git 远程服务器创建项目自动化部署、克隆推送免密码
1.用git用户 在git目录下 创建裸仓库 git init --bare project_01.git 2.在裸仓库的 hooks目录下创建 post-receive 文件775 3.post-r ...
随机推荐
- Daily Scrum5 11.7
今日任务: 姓名 任务 时长 徐钧鸿 学习了java连接sqlserver的方法并且实现了连接池 2h 张艺 继续完成和用户管理有关的类的移植(Register.Success.Validate等) ...
- Spring MVC controller的方法返回值
ModeAndView 可以在构造时确定需要跳转的页面也可以通过setViewName方法来确定需要跳转的页面 String 指定返回页面的视图名称,页面跳转,如果加了@ResponseBody注解, ...
- b4
吴晓晖(组长) 过去两天完成了哪些任务 昨天FloatingActionButton和权限获取调整 今天复习,没写东西,晚点有空了写 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还 ...
- 蜗牛慢慢爬 LeetCode 11. Container With Most Water [Difficulty: Medium]
题目 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai ...
- Beta阶段——第四篇 Scrum 冲刺博客
i. 提供当天站立式会议照片一张: ii. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 充值与账单的数据库操作结合,实现余额功能 (2) 今天计划完成的工作: 用户权限 ...
- Cron表达式简单的介绍
1.Cron是什么,用来做什么的 根据百度百科的解释:计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思.在Linux中,我们经常用到 cron 服务器来完成这项工作.cron服务器可以 ...
- Delphi报的错误
引入单元时提示Unit 'Unit1' already uses all the units in the project. 可能是没有添加环境变量造成的,需要手动输入代码引用单元. 和Environ ...
- 一条慢SQL引发的血案
直接切入正题吧: 通常来说,我们看到的慢查询一般还不致于导致挂站,顶多就是应用响应变慢不过这个恰好今天被我撞见了,一个慢查询把整个网站搞挂了先看看这个SQL张撒样子: # Query_time: 70 ...
- 【Java】提取JSON数值时遇到数组集合时使用的K-V方式转换
1.实体类转换方法 参照文章:http://www.cnblogs.com/dflmg/p/6933811.html 2.K-V方法(此方法比较笨,但是没有办法,我现在不知道有没有相关的简单API,只 ...
- [BZOJ4556][Tjoi2016&Heoi2016]字符串 后缀数组+主席树
4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec Memory Limit: 128 MB Description 佳媛姐姐过生日的时候,她的小 ...