运维手动pull的状态图:

要实现服务器自动pull的状态图:


因业务需要服务器都在阿里云上,并且代码也存在阿里云代码库中,代码库提供了WebHooks功能,目前需要实现的是开发者在本地push代码到阿里云代码库中,服务器能自动根据push动作将最新的代码git pull到服务器环境中

一、部署WebHooks

在前段web服务器的某个可访问的域名(这里以http://job.abc.com为例)根目录下新建webhooks.php文件,内容如下:

<?php#将服务器网站目录赋值给变量www_file$www_file='/var/www/apps';#以可写权限打开git_new.log文件,用于记录git日志$fs = fopen('/home/shell/git_new.log', 'a');fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL);#获取请求端的IP$client_ip = $_SERVER['REMOTE_ADDR'];#将时间与请求端IP写入日志文件fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);#执行shell命令cd到网站根目录执行git pull操作并把返回信息赋值给变量output$output=shell_exec("cd $www_file && git pull 2>&1");#将日志信息写入日志文件中fwrite($fs, 'Info:'. $output.PHP_EOL);fwrite($fs,PHP_EOL. '================ Update End ==============='.PHP_EOL.PHP_EOL);#关闭日志文件$fs and fclose($fs);
?>
修改PHP配置

因为webhooks用到的php代码中使用了 shell_exec 函数,一般配置php会禁止这个函数,需要打开 shell_exec 函数;
修改前端web服务器上php.ini的 disable_functions 列表,去掉 shell_exec;
重启php-fpm服务

重要操作

目前nginxphp都是用www用户运行,因此触发以上php脚本时会验证/home/www/.ssh目录的的密钥,因此如果没有此目录或者目录中没有.ssh,并且git一直都是用root用户去操作的,在这需要做多两步操作:

$ cp -rf /root/.ssh /home/www/
$ cp -rf /root/.gitconfig /home/www/

二、配置阿里云code





以上步骤都完成后即可在开发者的电脑上push一段代码上阿里代码库,然后查看下服务器上有没有执行git pull操作了,如有错误可在/home/shell/git_new.log文件中查看相关报错日志

最后记录网上一篇较全的脚本:

<?php
//网站目录
$www_file='/home/www/test/';//打开网站目录下的hooks.log文件,需要在服务器上创建,并给写权限
$fs = fopen('/home/www/test/hooks.log', 'a');fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL);//自定义字串掩码 用于验证
$access_token = 'QhNO8YHqym5PHQQsexapF7041xOhzm62DRH';//接受的ip数组,也就是允许哪些IP访问这个文件 这里是gitlab服务器IP
$access_ip = array('192.168.1.15','14.xxx.xxx.19');//如果使用www.xxx.com/xxx.php?token=xxxxxxx 的方式来传送验证字符串,则用这个方法获取
# $client_token = $_GET['token'];// 获取请求端的secret token
$client_token = $_SERVER["HTTP_X_GITLAB_TOKEN"];//获取请求端的IP
$client_ip = $_SERVER['REMOTE_ADDR'];//把请求的IP和时间写进log
fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);//验证token 有错就写进日志并退出
if ($client_token !== $access_token)
{echo "error 403";fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL);exit(0);
}//验证ip
if ( !in_array($client_ip, $access_ip))
{echo "error 503";fwrite($fs, "Invalid ip [{$client_ip}]".PHP_EOL);exit(0);
}//获取请求端发送来的信息,具体格式参见gitlab的文档
$json = file_get_contents('php://input');
$data = json_decode($json, true);//如果有需要 可以打开下面,把传送过来的信息写进log
# fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);//执行shell命令并把返回信息写进日志
$output=shell_exec("cd $www_file && git pull 2>&1");
fwrite($fs, 'Info:'. $output.PHP_EOL);fwrite($fs,PHP_EOL. '================ Update End ==============='.PHP_EOL.PHP_EOL);$fs and fclose($fs);?>

如文章对您有帮助,请打开支付宝扫码领取红包,就当做对作者的支持,谢谢

利用阿里CODE或码云的Webhooks功能,实现开发者push代码后服务器自动pull代码相关推荐

  1. 微信小程序云函数服务器,微信小程序云开发(云函数) 使用got发出http、https 请求服务器数据(示例代码)...

    为什么使用云函数发送http请求? 1.不受5个可信域名限制 ,另外一个意思就是可以不是可信域名 2.所请求的域名可以不备案 注: 以上规则在笔者学习的时候还是有效的! 想要在云函数中发送http请求 ...

  2. Svn、Git、GitHub、GitLab、码云 区别

    一.吐槽个黑历史 git诞生: git 由Linus Linus花了两周时间自己用C写了一个分布式版本控制系统,在2008 正式上线.(这里和Linux有一段黑历史). github: github代 ...

  3. git 码云 使用记录

    使用了码云的私有仓库. 一.首先下载安装git 安装完成后,在开始菜单里找到"Git"->"Git Bash",蹦出一个类似命令行窗口的东西,就说明Git ...

  4. 码云团队如何使用码云?

    ​ 很多团队每天花很多时间切换不同的工具中来做代码版本控制和项目管理!我们是否可以减少在这个过程中浪费的时间?能不能「直接」在单个系统内完成以上操作? 废话不多说,一起看看开源中国如何使用码云完成开发 ...

  5. vue.js — 安装Webpake创建一个完整的项目并上传至码云

    vue.js - 安装Webpake创建一个完整的项目并上传至码云 今天总结一下之前几天学习的一整套的创建项目方法: 前提条件:已安装node.js.npm/cnpm最新版本.vue-cli. VS ...

  6. github、码云的使用

    转载自https://www.liaoxuefeng.com/ 使用GitHub 我们一直用GitHub作为免费的远程仓库,如果是个人的开源项目,放到GitHub上是完全没有问题的.其实GitHub还 ...

  7. 码云(Gitee)团队如何使用码云完成开发?

    很多团队每天花很多时间切换不同的工具中来做代码版本控制和项目管理!我们是否可以减少在这个过程中浪费的时间?能不能「直接」在单个系统内完成以上操作? 废话不多说,一起看看开源中国如何使用码云完成开发? ...

  8. 用码云搭建简单的个人个性博客

    很简单,大概一个小时就可以做好! 先说下原理 码云pages是一个静态网站托管地方,再加上码云本来就是个代码托管的地方,集成pages后,可以很方便的部署你的代码 本文原理:利用 马克飞象生成博客的m ...

  9. 码云碰瓷马云,马云躺枪!

    昨天有两件事在群里引起了热聊.一件是51信用卡,大家都心知肚明,我就是51信用卡的资深用户之一.第二件事就是我今天要说的码云碰瓷马云. 马爸爸退休有一段时间了,但是首富的光环让多数人都想蹭蹭他的热度. ...

最新文章

  1. Android多线程死锁定位,Java---多线程之死锁
  2. 最有价值的100句话
  3. 章节三、2-方法_演示实例
  4. 客户端渲染(CSR)
  5. Leetcode每日一题:127.word-ladder(单词接龙)
  6. ZOJ-2575 Full of Painting 动态规划
  7. 你能想到几种方式实现数组扁平化(越多越好)
  8. 视频教程-网络安全技术(CCNA-HCNA)-网络技术
  9. java工作流flowable
  10. Matlab线型,颜色及标记的自定义
  11. linux下使用 sb接口扫描仪,怎样在Linux下设置和使用扫描仪.doc
  12. 自费出书多少钱?如何出书
  13. 计算平均指令时间_上海原油期货将推出TAS指令
  14. -TEST 16 for NOIP 让scar_lyw都绝望的T3(120-300)
  15. 为什么电脑浏览器显示时钟快了_打开网站提示您的时钟快了_网页显示您的时钟慢了,解决方法...
  16. 办公软件使用学习笔记:excel第五节。excel表格筛选和排序使用方法总结。
  17. 用python写一个自动注册脚本_python实现自动登录
  18. 微信商城开发:公众号平台接口配置及调试
  19. 渣蜀黍 - iOS 个人笔记(一)_数据处理
  20. 详细解析电源滤波电容的选取与计算

热门文章

  1. 姜宁:开源不是简单的代码开放,是依托项目构建一个共同体丨COSCon'20 专访
  2. Prometheus PromSQL
  3. Fakelocation模拟KEEP运动记录
  4. 软考高级之信息系统案例分析七重奏-《7》
  5. 几何向量:Gerstner
  6. win10查看g++/gcc版本
  7. JavaWeb_10_mvc案例_注册登录
  8. matlab如何实现隔直滤波器,单电源单运放二阶滤波加直流偏置(不能隔直)
  9. 【Python】scikit-learn教程
  10. 让早餐,更新鲜,只要一瓶零度果坊早橙好NFC果汁