使用码云git的webhook实现生产环境代码的自动pull
作者: 郑晓 分类: 分享经验 发布于: 2018-05-31 23:53 浏览:145,146 评论(10)
普通公司小项目,传统更新线上代码是每次ftp/sftp上传,或提交到svn/git后再ssh到线上环境中去手动拉取代码,十分麻烦,虽然用上了版本控制,逼格还是不够高啊! 现在的线上仓库都支持hook技术,可以很方便的实现代码的自动化管理。比如我现在使用gitee.com仓库的webhook功能,监听master分支有push动作时,可以自动通过设置的hook通知生产环境中的脚本执行git pull拉取代码,自动更新,非常方便。
-
设置并使用公钥实现免密码 目标环境中使用
ssh-keygen -t rsa -C "xxxxx@zh30.com" #cat ~/.ssh/id_rsa.pub 查看公钥信息一路回车生成公钥,在码云项目管理-部署公钥管理中,提交这个公钥串。 修改项目.git/config文件的url为如下格式[remote "origin"] url = git@gitee.com:xxxxx/xxx.gitgit pull 测试 -
根目录或其它位置放一个php文作用webhook的通知接口,内容如下:
// 本地仓库路径 项目目录 $local = '/home/wwwroot/your_project';</p> </li> </ol> <p>// 密码 gitee项目管理webhook中设置 $password = '654321';</p> <p>//如果请求体内容为空,返回错误 $payload = file_get_contents('php://input'); if (!$payload) { header('HTTP/1.1 400 Bad Request'); die('HTTP HEADER or POST is missing.'); }</p> <p>// 如果启用验证,并且验证失败,返回错误 // gitee默认返回json,解析json后验证密码 $data = json_decode($payload, true); if(empty($data) || $data['password'] != $password) { header('HTTP/1.1 403 Permission Denied'); die('Permission denied.'); }</p> <p>// 如果仓库目录不存在,返回错误 if (!is_dir($local)) { header('HTTP/1.1 500 Internal Server Error'); die('Local directory is missing')}</p> <p>//输出执行结果 包括错误信息,在gitee webhook中可以查看和测试 echo shell_exec("cd {$local} && git pull 2>&1"); die("done " . date('Y-m-d H:i:s', time()));-
码云项目管理中,webhooks管理,添加,配置这个php的地址和对应的明文密码。保存测试,页面下方会显示最后一次的脚本执行信息。
-
执行出错的话,很多时候是权限问题。php脚本一般是由www或www-data等帐户权限来执行,所以整个项目目录对此帐户要有权限读写,比如全局chown -R www:www .。 可能需要把/root/.ssh和/root/.gitconfig 拷贝到/home/www中。
真的非常好用,现在就不需要再登录到ssh上手动git pull更新了,本地开发完测试完成后,直接push到git后,线上就自动更新了~~
-
本文采用知识共享署名-非商业性使用 3.0 中国大陆许可协议进行许可,转载时请注明出处及相应链接。
本文永久链接: https://www.zh30.com/webhook-git-pull.html
使用码云git的webhook实现生产环境代码的自动pull:目前有10 条留言
有没有pull时出现过js或css文件句柄被nginx占用导致pull失败的情况
求大佬具体一点的实现服务器自动pull的教程
这就是教程了啊, 你觉得哪里不明白,我改改
我是小白,看起来就很懵逼的这种
试一试楼中楼
试一试楼中楼2
老哥, 你这个文本编辑器(博文内容)不怎么好看, 不打算换一个么
麻烦,不想弄。
我看还好,哈哈~
对我这个小白来说有点干