注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

骐骥一跃

日积跬步 业精于勤荒于嬉

 
 
 

日志

 
 

【原创】GitLab中webhook的使用  

2017-04-20 15:36:05|  分类: Unix/Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
【原创】GitLab中webhook的使用

Project webhooks allow you to trigger a URL if for example new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. GitLab will send a POST request with data to the webhook URL.

Webhooks can be used to update an external issue tracker, trigger CI jobs, update a backup mirror, or even deploy to your production server.

webhook 是一个钩子函数,但某些事件发生时,比如推送事件(标签推送事件,评论等),通过Webhook,你可以自定义一些行为通知到指定的URL去。换一种说法,git hooks 就是git执行特定事件(如commit,push,receive等)后触发运行的脚本,并且githook发送一个url请求到指定的URL。


【原创】GitLab中webhook的使用 - 卓格 - 骐骥一跃
 
 

这个url请求头和请求体类似如下,以push事件发生为例。

push events
Triggered when you push to the repository except when pushing tags.

Request header:
  1. de>X-Gitlab-Event: Push Hookde>

Request body:
  1. de>{de>
  2. de> "object_kind": "push",de>
  3. de> "before": "95790bf891e76fee5e1747ab589903a6a1f80f22",de>
  4. de> "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",de>
  5. de> "ref": "refs/heads/master",de>
  6. de> "checkout_sha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",de>
  7. de> "user_id": 4,de>
  8. de> "user_name": "John Smith",de>
  9. de> "user_email": "john@example.com",de>
  10. de> "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",de>
  11. de> "project_id": 15,de>
  12. de> "project":{de>
  13. de> "name":"Diaspora",de>
  14. de> "description":"",de>
  15. de> "web_url":"http://example.com/mike/diaspora",de>
  16. de> "avatar_url":null,de>
  17. de> "git_ssh_url":"git@example.com:mike/diaspora.git",de>
  18. de> "git_http_url":"http://example.com/mike/diaspora.git",de>
  19. de> "namespace":"Mike",de>
  20. de> "visibility_level":0,de>
  21. de> "path_with_namespace":"mike/diaspora",de>
  22. de> "default_branch":"master",de>
  23. de> "homepage":"http://example.com/mike/diaspora",de>
  24. de> "url":"git@example.com:mike/diaspora.git",de>
  25. de> "ssh_url":"git@example.com:mike/diaspora.git",de>
  26. de> "http_url":"http://example.com/mike/diaspora.git"de>
  27. de> },de>
  28. de> "repository":{de>
  29. de> "name": "Diaspora",de>
  30. de> "url": "git@example.com:mike/diaspora.git",de>
  31. de> "description": "",de>
  32. de> "homepage": "http://example.com/mike/diaspora",de>
  33. de> "git_http_url":"http://example.com/mike/diaspora.git",de>
  34. de> "git_ssh_url":"git@example.com:mike/diaspora.git",de>
  35. de> "visibility_level":0de>
  36. de> },de>
  37. de> "commits": [de>
  38. de> {de>
  39. de> "id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",de>
  40. de> "message": "Update Catalan translation to e38cb41.",de>
  41. de> "timestamp": "2011-12-12T14:27:31+02:00",de>
  42. de> "url": "http://example.com/mike/diaspora/commit/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",de>
  43. de> "author": {de>
  44. de> "name": "Jordi Mallach",de>
  45. de> "email": "jordi@softcatala.org"de>
  46. de> },de>
  47. de> "added": ["CHANGELOG"],de>
  48. de> "modified": ["app/controller/application.rb"],de>
  49. de> "removed": []de>
  50. de> },de>
  51. de> {de>
  52. de> "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",de>
  53. de> "message": "fixed readme",de>
  54. de> "timestamp": "2012-01-03T23:36:29+02:00",de>
  55. de> "url": "http://example.com/mike/diaspora/commit/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",de>
  56. de> "author": {de>
  57. de> "name": "GitLab dev user",de>
  58. de> "email": "gitlabdev@dv6700.(none)"de>
  59. de> },de>
  60. de> "added": ["CHANGELOG"],de>
  61. de> "modified": ["app/controller/application.rb"],de>
  62. de> "removed": []de>
  63. de> }de>
  64. de> ],de>
  65. de> "total_commits_count": 4de>
  66. de>}de>

webhook服务端接收到请求后就可以处理很多事情了。

我的需求是这样的:代码上传到gitlab仓库后,被gilab打包存储为gitlab自己的格式,而不是文本式的源码格式,比如php、js、html等源码文件推送到远程仓库后就被转存了。我的需求是要将php、html、js等源码文件提取出来,放到分发服务器上。一个解决方法是用git pull origin master将代码库拉取出来,并且实现自动拉取,避免人工操作。解决方案是用gitlab的webhook钩子函数实现。

操作过程:

一、webhook客户端(gitlab服务器,172.16.0.12)

1、安装好gitlab服务,具体安装步骤可看我另外一篇文章。
2、创建项目。

二、webhook服务端(接收url请求,172.16.0.11,代码分发服务器,做代码分发用的机器)

1、安装Apache或nginx,提供web服务。
2、关闭安全软件

  1. de>service iptables stopde>
  2. de>service ip6tables stopde>
  3. de>service postfix stopde>
  4. de>chkconfig iptables offde>
  5. de>chkconfig ip6tables offde>
  6. de>chkconfig postfix offde>
  7. de>setenforce 0de>

3、添加用户。

  1. de>groupadd -r webhookde>
  2. de>adduser -g webhook --system --shell /bin/bash --comment 'webhook' --create-home --home-dir /home/webhook/ webhookde>

3、创建接口目录。

  1. de>mkdir -pv /data/{hook,remote}de>
  2. de>mkdir /data/logs        #存放日志用的de>
  3. chown -R webhook:webhook /data

4、切换到webhoo用户,后面的操作以webhook用户身份操作

  1. de>su - webhookde>
  2. de>cd /data/hookde>
  3. de>git clone http://zoger:zoger12@git.pam.ee/bscoder/remote.gitde>

5、添加接口文件(以webhook用户运行)

  1. de>cat /data/hook/gitpull.shde>
  2. de>de>
  3. de>#!/bin/bashde>
  4. de>#de>
  5. de>cd /data/remotede>
  6. de>/usr/local/bin/git pull origin masterde>
  7. chown webhook:webhook /data/hook/gitpull.sh

6、认证文件

  1. de>cat /data/hook/webhook.phpde>
  2. de>de>
  3. de><?phpde>
  4. de>// 作为接口传输的时候认证的密钥de>
  5. de>$valid_token = 'XCPWh4nPfpgAeSVojGb7T7Ssj6zGFTm2raLLfsgsthweewtheHWRHfsgew';de>
  6. de>de>
  7. de>//运行调用该接口的ip地址,这里一般是git服务器de>
  8. de>$valid_ip = array('22.216.64.242','13.26.61.243'); de>
  9. de>$client_token = $_GET['token'];de>
  10. de>$client_ip = $_SERVER['REMOTE_ADDR'];de>
  11. de>de>
  12. de>//logs目录可以任意放置。de>
  13. de>$file = '/data/logs/auto_hook.log';de>
  14. de>$fs = fopen($file, 'a');de>
  15. de>fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);de>
  16. de>de>
  17. de>//调用接口被允许的ip地址de>
  18. de>if ($client_token !== $valid_token)de>
  19. de>{de>
  20. de> echo "error 10001";de>
  21. de> fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL);de>
  22. de> exit(0);de>
  23. de>}de>
  24. de>de>
  25. de>if ( ! in_array($client_ip, $valid_ip))de>
  26. de>{de>
  27. de> echo "error 10002";de>
  28. de> fwrite($fs, "Invalid ip [{$client_ip}]".PHP_EOL);de>
  29. de> exit(0);de>
  30. de>}de>
  31. de>de>
  32. de>$json = file_get_contents('php://input');de>
  33. de>$data = json_decode($json, true);de>
  34. de>de>
  35. de>fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);de>
  36. de>fwrite($fs, '======================================================================='.PHP_EOL);de>
  37. de>$fs and fclose($fs);de>
  38. de>de>
  39. de>//这里也可以执行自定义的脚本文件gitpull.sh,脚本内容可以自己定义。de>
  40. de>exec("/bin/sh /data/hook/gitpull.sh");de>
  41. de>//echo exec("cd /data/gitpull.sh;git pull origin master;");de>
  42. de>?>de>

三、验证

1、浏览器访问。找一台电脑验证,浏览器访问http://git.pam.ee/webhook.php?token=XCPWh4nPfpgAeSVojGb7T7Ssj6zGFTm2raLLfsgsthweewtheHWRHfsgew
2、查看 /data/logs目录是否生成了auto_hook.log文件。
3、在gitlab服务器上面添加web hooks(gitlab 9.0.5为例)。在“项目” - “设置” - “集成” 里面。

【原创】GitLab中webhook的使用 - 卓格 - 骐骥一跃    
 

4、找一台git客户端,测试上传代码到git服务器上,看会不会触发web hooks 。









  评论这张
 
阅读(107)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018