钩子(hooks)—webhook-使用钩子自动触发部署

钩子(hooks)—webhook

 

http://fighter.blog.51cto.com/1318618/1670667

https://www.lovelucy.info/auto-deploy-website-by-webhooks-of-github-and-gitlab.html

什么是webhook?

 

 

wehook

A webhook is an API concept that's growing(激发) in popularity. As more and more of what we do on the web can be described by events, webhooks are becoming even more applicable. They're incredibly useful and a resource-light way to implement event reactions.

webhook是个在特定情况下触发的一种api. 越来越多在web上的操作被描述为事件.

 

那个 Payload URL 上填上需要部署到的服务器的网址,比方说 http://dev.lovelucy.info/incoming。然后之后每次有 push 事件 GitHub 都会主动往这个地址发送一个 POST 请求,当然你也可以选择任何事件都发个 POST 通知你。GitHub 还有个 Secret 的设定,就是一个字符串,如果加上的话就在 POST 请求的 HTTP 头中会带一个 Hash 值做验证密文,证明这个 POST 真是来自 GitHub,不然任何人都往那个地址 POST 忽悠你你都不知道谁是谁对吧……

 

what is events?

 

Events are at the core of webhooks. These webhooks fire whenever a certain action is taken on the repository, which your server's payload URL intercepts and acts upon.

事件是webhook的核心,当仓库发生特定action会触发webhook,

 

gitlab中解释: Web 钩子用于在项目发生相关事件时通知外部服务器

 

Git是在特定事件发生之前或之后执行特定脚本代码功能(从概念上类比,就与监听事件、触发器之类的东西类似)。
Git Hooks就是那些在Git执行特定事件(如commit、push、receive等)后触发运行的脚本。
gitlab的web hooks跟git hook类似。也是当项目发生提交代码、提交tag等动作会自动去调用url,这个url可以是更新代码,或者其他操作。
 

 


配置目的:

由于系统属于后台接口系统,开发提交完git仓库后要实时的部署到测试环境,这时候就需要用到gitlab的web hooks自动更新部署了。

客户端:要自动更新的测试服务器IP:192.168.1.2

服务端:Gitlab服务器IP:192.168.1.1

Gitlab Version:     7.13.0.pre

GitLab-Shell  Version:     2.6.3

 

 

1、在客户端上面配置apache配置文件,为web hooks添加一个接口访问

 
  1. #vim /usr/local/apache/conf/httpd.conf

  2. listen 81

  3. <VirtualHost *:81>

  4. ServerAdmin localhost

  5. DocumentRoot "/www/gitlab_web"

  6. <Directory "/www/gitlab_web">

  7. Options -Indexes +FollowSymLinks

  8. AllowOverride None

  9. Order allow,deny

  10. Allow from all

  11. </Directory>

  12. RewriteEngine on

  13. </VirtualHost>

2、在服务端gitlab上面为客户端添加gitlab新账号,然后将生成好的公钥添加到gitlab好的账号里面(profile setting-->SSH  Keys -->add ssh key)

  1. #su - webuser

  2. #ssh-keygen -t rsa

  3. 进入项目目录

  4. #cd /path/project

  5. 初始化git仓库

  6. #git clone git@192.168.1.1:test/test_api.git


3、在客户端上面添加接口文件

  1. [root@node1 gitlab_web]# pwd

  2. /www/gitlab_web

  3. [root@node1 gitlab_web]# cat index.php

  4. <?php

  5. //作为接口传输的时候认证的密钥

  6. $valid_token = 'd49dfa762268687eb2ca59498ce852';

  7. //调用接口被允许的ip地址

  8. $valid_ip = array('192.168.14.2','192.168.14.1','192.168.14.128');

  9. $client_token = $_GET['token'];

  10. $client_ip = $_SERVER['REMOTE_ADDR'];

  11. $fs = fopen('./auto_hook.log', 'a');

  12. fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);

  13. if ($client_token !== $valid_token)

  14. {

  15. echo "error 10001";

  16. fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL);

  17. exit(0);

  18. }

  19. if ( ! in_array($client_ip, $valid_ip))

  20. {

  21. echo "error 10002";

  22. fwrite($fs, "Invalid ip [{$client_ip}]".PHP_EOL);

  23. exit(0);

  24. }

  25. $json = file_get_contents('php://input');

  26. $data = json_decode($json, true);

  27. fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);

  28. fwrite($fs, '======================================================================='.PHP_EOL);

  29. $fs and fclose($fs);

  30. //这里也可以执行自定义的脚本文件update.sh,脚本内容可以自己定义。

  31. //exec("/bin/sh /root/updategit.sh");

  32. exec("/bin/echo $valid_ip >>/tmp/webhook.txt");

4、访问接口,测试接口是否成功

http://192.168.14.128:81/?token=d49dfa7622681425fbcbdd687eb2ca59498ce852

当然网页是空白的.

 

5、查看客户端日志

#cat /www/gitlab_web/auto_hook.log

=======================================================================
Request on [2015-07-03 14:05:02] from [112.122.112.112]
Data: 
=======================================================================

 

6、在服务端gitlab服务器上面添加web hooks

admin area->projects->test/edit->WEB Hooks->add WEB Hooks

 

7、提交修改代码到gitlab仓库,然后查看日志、查看测试环境是否更新

#cat /www/gitlab_web/auto_hook.log

Request on [2015-07-03 14:13:37] from [12.123.12.3]
Data: Array
(
    [object_kind] => push
    [before] => e5988b5dce7a038
    [after] => d8ce92ac4ab4ba046dd
    [ref] => refs/heads/master
    [checkout_sha] => d8ceefd5c4ab4ba046dd
    [message] => 
    [user_id] => 7
    [user_name] => test
    [user_email] => test@qq.com
    [project_id] => 3
    [repository] => Array
        (
            [name] => test_api
            [url] => git@192.168.1.1:test/test.api
            [description] => test.com product code
            [homepage] => http://xx./test_api
            [git_http_url] => http://xx./test_api 
            [git_ssh_url] => git@112.23.23.1:test.git
            [visibility_level] => 10
        )

    [commits] => Array
        (
            [0] => Array
                (
                    [id] => d8cec4ab4ba046dd
                    [message] => 测试gitlab的web hook接口。

                    [timestamp] => 2015-07-03T14:13:51+08:00
                    [url] => http://xxxx/test_api/commit/d8ce95c4ab4ba046dd
                    [author] => Array
                        (
                            [name] => test
                            [email] => test@qq.com
                        )

                )

        )

    [total_commits_count] => 1
)

 

注意事项:

1、配置完成后。调用接口的时候没有自动更新到测试环境。可以使用apache的运行用户测试命令是否可以执行成功

#su - webuser

#cd /path/project

#git pull

 

2、如果apache的用户无法执行命令或者无法更新git代码请检查一下apache用户的shell。

参考资料:

http://blog.ycnets.com/2013/10/19/automatic-update-version-with-gitlab-web-hook/#disqus_thread

 

 

什么是webhook

翻译,原文地址:https://sendgrid.com/blog/webhook-vs-api-whats-difference/

一、概述

Webhook是一个API概念,并且变得越来越流行。我们能用事件描述的事物越多,webhook的作用范围也就越大。Webhook作为一个轻量的事件处理应用,正变得越来越有用。

准确的说webhoo是一种web回调或者http的push API,是向APP或者其他应用提供实时信息的一种方式。Webhook在数据产生时立即发送数据,也就是你能实时收到数据。这一种不同于典型的API,需要用了实时性需要足够快的轮询。这无论是对生产还是对消费者都是高效的,唯一的缺点是初始建立困难。

Webhook有时也被称为反向API,因为他提供了API规则,你需要设计要使用的API。Webhook将向你的应用发起http请求,典型的是post请求,应用程序由请求驱动。

二、使用webhook

消费一个webhook是为webhook准备一个URL,用于webhook发送请求。这些通常由后台页面和或者API完成。这就意味你的应用要设置一个通过公网可以访问的URL。

多数webhook以两种数据格式发布数据:JSON或者XML,这需要解释。另一种数据格式是application/x-www-form-urlencoded or multipart/form-data。这两种方式都很容易解析,并且多数的Web应用架构都可以做这部分工作。

三、Webhook调试

调试webhook有时很复杂,因为webhook原则来说是异步的。你首先要解发他,然后等待,接着检查是否有响应。这是枯燥并且相当低效。幸运的是还有其他方法:

1、明白webhook能提供什么,使用如RequestBin之类的工具收集webhook的请求;

2、用cURL或者Postman来模拟请求;

3、用ngrok这样的工具测试你的代码;

4、用Runscope工具来查看整个流程。

四、webhook安全

因为webhook发送数据到应用上公开的URL,这就给其他人找到这个URL并且发送错误数据的机会。你可采用技术手段,防止这样的事情发生。最简单的方法是采用https(TLS connection)。除了使用https外,还可以采用以下的方法进一步提高安全性:

1、首先增加Token,这个大多数webhook都支持;

2、增加认证;

3、数据签名。

五、重要的问题

当作为webhook的消费者时有两件事需要铭记于心:

1、webhook通过请求发送数据到你的应用后,就不再关注这些数据。也就是说如果你的应用存在问题,数据会丢失。许多webhook会处理回应,如果程序出现错误会重传数据。如果你的应用处理这个请求并且依然返回一个错误,你的应用就会收到重复数据。

2、webhook会发出大量的请求,这样会造成你的应用阻塞。确保你的应用能处理这些请求。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值