当开发环境在本地,运行环境在服务端时,每次代码提交都需要在服务端拉取一次。使用git的hooks功能可以省去这一步。下面以码云的webhooks为例,实现服务端代码的自动同步部署。更新历史2017.12.29:完成初稿理解githooks关于githooksGit可以在特定重要动作发生时触发自定义脚本。有两组这样的钩子:客户端和服务器端。客户端挂钩由提交和合并等操作调用,而服务器端挂钩则作用于网络操作,例如接收推送的提交。您可以随心所欲地使用这些挂钩。如何使用钩子钩子存放在Git目录的==hooks==子目录中。在大多数项目中就是==.git/hooks==。当你使用==gitinit==初始化一个新的仓库时,Git默认会在这个目录下放置一些示例脚本。这些脚本除了能够被调用之外,还会暴露被触发时传入的参数。所有示例都是shell脚本,其中一些混合了Perl代码,但任何正确命名的可执行脚本都可以正常工作——您可以用Ruby、Python或其他语言编写它们。这些样本的名称都以==.sample==结尾,如果你想启用它们,你必须先去掉这个后缀。通过在Git目录的hooks子目录中放置一个正确命名的可执行文件来激活挂钩脚本。这样,它就可以被Git调用。接下来,我们将解释常见的钩子脚本类型。具体用法可以参考官方文档:GitHooks理解webhooks钩子函数(回调),就是帮助用户推送代码后自动回调一个你设置的http地址。这是一个通用的解决方案。用户可以根据不同的需求(如发送邮件、自动部署等)编写自己的脚本;目前,webhooks支持多种触发方式和多种选择。webhooks的请求方式为POST请求。有两种数据格式可供选择,JSON和Web表单参数。您可以选择是否使用密码来确认请求。(注:密码为明文)不同托管平台的POST数据格式不同,但不会有太大影响,解析数据时注意即可。以下是码云Push操作回调的json数据:{"before":"fb32ef5812dc132ece716a05c50c7531c6dc1b4d","after":"ac63b9ba95191a1bf79d60bc262851a66c12cda1","ref":"refs/heads/master","user,id":13"user"1user_name":"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"},"提交”:[{“id”:“ac63b9ba95191a1bf79d60bc262851a66c12cda1”,“消息”:“1234错误修复”,“时间戳”:“2016-12-09T17:28:0208:00”,“url”:“https://gitee.com/oschina/webhook/commit/ac63b9ba95191a1bf79d60bc262851a66c12cda1","author":{"name":"123","email":"123@123.com",“时间”:“2016-12-09T17:28:0208:00”}}}],“total_commits_count”:1,“commits_more_than_ten”:false,“项目”:{“名称”:“webhook”,“路径”:"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中Ubuntu+Apache+码云试用准备1、首先需要搭建LAMP开发环境。可以参考腾讯开发者实验室的课程。2.当然你得有git环境。3、代码端必须提供webhooks支持在代码托管平台上,如果自己搭建git服务器,需要实现webhooks回调,开始创建web服务器用户目录。这里我们以apache用户为例。不同环境请根据自己的环境修改:sudomkdir/var/www/.sshsudochown-Rapacheuser/var/www/.ssh///这里如果用户是Apache的运行用户,则生成两个公钥如下:1.git用户公钥,2.部署公钥:用户公钥(gitclone时的认证权限)ssh-keygen-trsa-C"sample@gmail.com"#填写你自己的邮箱#然后一直回车#生成的文件一般是/root/.ssh/id_rsa,如果你不是root用户,请查看提示上的路径部署公钥sudo-Huapacheuserssh-keygen-trsa#请选择“nopassphrase”并回车配置公钥用户publickeysudocat/root/.ssh/id_rsa.pub#查看内容生成的密钥,复制公钥的所有内容在用户->设置中粘贴到SSH公钥中部署公钥sudocat/var/www/.ssh/id_rsa.pub#查看生成的密钥内容,全部复制并将公钥内容添加到具体项目->管理部署公钥git全局配置sudo-Huapacheusergitconfig--globalcredential.helperstore#永久保存sudo-Huapacheusergitconfig--globaluser.name"name"sudo-Huapacheusergitconfig--globaluser.email"shample@gmail.com"#请使用与码云相同的邮箱地址。配置完成后,可以clone或者pull项目来验证是否配置成功(注意:需要切换到Apache运行用户下操作),如果想多次操作,只需要输入一次输入用户名和密码,配置成功。如果每次操作都输入用户名和密码,则配置不成功,需要重新检查配置准备hook文件在你的www目录下创建一个目录hook,在里面放一个php文件index.php,内容如下:比如验证,日志,请自行分析推送内容并操作//获取推送数据内容的方法$requestBody=file_get_contents("php://input");//只需一行代码即可拉取shell_exec("cd/var/www/Project&&gitpull");//把目录改成项目的目录?>修改目录权限:chown-Rapacheuser/var/www/hook#这里请改成你创建的hook目录chown-Rapacheuser/var/www/Project#Here,请切换到你的项目目录,确保你的钩子文件可以访问:http://example.com/hook/index...,钩子准备完成。配置网络钩子。如果链接可用,您就完成了。克隆仓库提交到码云,服务器自动拉取即可。注意如果配置没有问题,但是不会自动拉取,应该是用户权限问题。对于配置问题,可以先查看运行php代码的具体用户,然后为该用户启用权限。系统(“whoami”);//检查哪个用户执行了命令。参考文章使用PHP脚本远程部署git项目使用WebHook实现PHP自动部署Git代码exec(),passthru(),system(),shell_exec()
