当进行开发的环境在本地,而运行的环境要在服务端时,每一次提交代码都须要在服务端pull一次。而利用git的hooks功能,可以让咱们省去这一步,下面我就以码云的webhooks为例,实现服务端的代码自动同步部署。php
更新历史html
Git 能在特定的重要动做发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操做所调用,而服务器端钩子做用于诸如接收被推送的提交这样的联网操做。 你能够为所欲为地运用这些钩子。git
钩子都被存储在 Git 目录下的 ==hooks== 子目录中。 也即绝大部分项目中的 ==.git/hooks== 。 当你用 ==git init== 初始化一个新版本库时,Git 默认会在这个目录中放置一些示例脚本。这些脚本除了自己能够被调用外,它们还透露了被触发时所传入的参数。 全部的示例都是 shell 脚本,其中一些还混杂了 Perl 代码,不过,任何正确命名的可执行脚本均可以正常使用 —— 你能够用 Ruby 或 Python,或其它语言编写它们。 这些示例的名字都是以 ==.sample== 结尾,若是你想启用它们,得先移除这个后缀。github
把一个正确命名且可执行的文件放入 Git 目录下的 hooks 子目录中,便可激活该钩子脚本。 这样一来,它就能被 Git 调用。 接下来,咱们会讲解经常使用的钩子脚本类型。web
具体使用能够参考官方文档:Git Hookesshell
钩子功能(callback),是帮助用户 push 了代码后,自动回调一个你设定的 http 地址。 这是一个通用的解决方案,用户能够本身根据不一样的需求,来编写本身的脚本程序(好比发邮件,自动部署等);目前,webhooks 支持多种触发方式,支持复选。apache
webhooks 的请求方式为POST请求,有两种数据格式能够选择,JSON 和 web 的 form参数,能够自行选择是否使用密码来肯定请求。(注意:该密码是明文)json
不一样托管平台的POST数据格式都不太同样,不过也不会有太大影响,只是解析数据的时候注意就好了,下面是码云的 Push 操做回调的 json 数据:bash
{ "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" }
其余的具体数据能够到各个官网查看:码云、Coding、GitHub服务器
一、首先你要搭建好LAMP的的开发环境 能够看腾讯开发者实验室的课程
二、固然要有git的环境了
三、要将代码方在一个提供webhooks支持的代码托管平台上,若是本身搭建 git 服务器则要本身实现 webhooks 回调
sudo mkdir /var/www/.ssh sudo chown -R apacheuser /var/www/.ssh/ // 这里的用户要是 Apache 的运行用户,下同
公钥有两个:1. git用户公钥,2. 部署公钥:
ssh-keygen -t rsa -C "sample@gmail.com" # 填本身的邮箱 # 而后一直回车就行 # 生成的文件一般是 /root/.ssh/id_rsa,若是非root用户请查看提示上的路径
sudo -Hu apacheuser ssh-keygen -t rsa # 请选择 "no passphrase",一直回车下去
sudo cat /root/.ssh/id_rsa.pub # 查看生成的密钥内容,复制所有
将公钥的内容粘贴到用户->设置 中的SSH公钥中
sudo cat /var/www/.ssh/id_rsa.pub # 查看生成的密钥内容,复制所有
将公钥内容添加到具体项目 -> 管理 中的部署公钥
sudo -Hu apacheuser git config --global credential.helper store # 永久保存 sudo -Hu apacheuser git config --global user.name "name" sudo -Hu apacheuser git config --global user.email "shample@gmail.com" # 邮箱请与码云上一致
配置完成以后能够 clone 或 pull 项目来验证是否配置成功(注意:要切换成Apache运行用户来进行操做),若屡次操做只需输入一次用户名、密码,即配置成功,若每一次操做都有输入用户名密码,则配置不成功,须要从新检查配置。
在你的www目录创建一个目录hook, 里面放上一个php文件index.php,内容以下:
<?php // 这里只是最简单的拉取代码,若是要作更加多的操做,如验证、日志,请本身解析push内容并操做 // 获取push数据内容的方法 $requestBody = file_get_contents("php://input"); // 只需这一行代码即可拉取 shell_exec("cd /var/www/Project && git pull"); // 目录换成项目的目录 ?>
修改目录权限:
chown -R apacheuser /var/www/hook # 这里请改为你建立的hook目录 chown -R apacheuser /var/www/Project # 这里请改为你的项目目录
确保你的hook文件能够访问:http://example.com/hook/index... ,钩子准备完成。
若是连接可用,则大功告成,只需把仓库 clone 以后,再向码云提交,变回自动被 服务器 pull
若是配置都没有问题,可是就是不会自动拉取,那应该是用户的权限配置问题,能够先查看运行php代码的具体用户是什么,而后为该用户开启权限。
system("whoami"); // 查看是哪一个用户执行该命令