WebHooks

Webhook 允许第三方应用监听 Coding.net 上的特定事件,在这些事件发生时通过 HTTP POST 方式通知( 超时5秒) 到第三方应用指定的 Web URL。例如项目有新的内容 Push,或是Merge Request 有更新等。 Coding.net 用户可以在自己的项目 → 设置 → Webhook 中创建、设置 Webhook 所需监听的事件,并配置第三方应用的 Web URL 。WebHook 可方便用户实现自动部署,自动测试,自动打包,监控项目变化等。

WebHooks V2 是全新的一套 WebHook 系统。WebHooks V2 改变了一些原有的字段名,已经输出的数据结构,使得输出的数据更加全面,更加容易和第三方服务进行整合。为了使以前已经在使用 WebHooks 服务的用户能够不存在兼容性的问题,老版的 WebHooks 服务将会被保留。

WebHook 的功能设置目前在项目的「设置」菜单中。

事件

配置 WebHook 时,您可以选择要接收的事件。默认情况下,WebHooks 只订阅 push 与 merge request 事件。

每个事件都对应于您的项目可能发生的某些特定操作。 例如,如果您订阅了合并请求事件,您将在每次打开,关闭等操作时收到详细的事件内容。

目前可用的事件是(其余事件会陆续增加):

Events 说明
push 所有使用 Git 客户端对仓库执行 push 操作时间,包含新建删除分支,新建删除标签,以及在线编辑代码等。(默认选项)
merge request Merge Request 的新建,关闭,拒绝,合并等事件。(默认选项)

数据结构

每个事件类型都具有与该事件相关的数据结构。 不同事件的数据结构有所不同,但是都会包含事件的执行者(sender)以及事件发生所属的项目(repository)。

发送 Headers 说明

Header 说明
X-Coding-Event 事件名(例如: push, merge request)
X-Coding-Signature 通过 HMAC SHA1 加密算法、使用令牌作为 KEY 将发送内容加密后的值以十六进制显示(需要配置令牌),并包含前缀 sha1=
X-Coding-Delivery 标识此次发送的唯一 ID
User-Agent Coding.net Hook

发送的具体内容

POST /payload HTTP/1.1

Host: localhost:4567
Request method: POST
User-Agent: Coding.net Hook
X-Coding-Event: push
X-Coding-Delivery: bf3f043a-3883-433c-8e20-312b04c49b46

{
  "ref": "refs/heads/master",
  "before": "1b4d2b060ef9e9a32f86be8c416a84a24806b575",
  "after": "860385d69eda49a4af9379c844701163d19c8d6b",
  "compare": "https://test.coding.net//p/test-webhook/git/compare/1b4d2b060ef9e...860385d69eda4",
  ...
  "repository": {
    "id": 4021,
    "name": "test-webhook",
    "full_name": "test/test-webhook",
    "owner": {
      "id": 652,
      "login": "crystal",
      "url": "https://test.coding.net/user/key/crystal",
      "html_url": "https://test.coding.net//u/crystal"
    },
    ...
  },
  ...
  "sender": {
    "id": 613,
    "login": "jiong",
    ...
  }
}

签名解析 Demo

每个事件都包含的属性

Key Value
sender 事件触发者
repository 当前项目

Ping 事件

当您创建一个新的 WebHook 时,我们将向您发送一个简单的 ping 事件,让您知道 WebHook 是否能够成功发送。您可以在 WebHooks 列表中,通过点击 ping 按钮再次触发 ping。

事件名: ping

Key Value
zen Coding! 让开发更简单
hook_id 当前 WebHook 的 ID
hook 当前 WebHook 的配置数据

Push 事件

当您向您的仓库推送新的代码时,我们将向您发送一个的 Push 事件。

事件名: push

Key Value
hook_id 当前 WebHook 的 ID
hook 当前 WebHook 的配置数据
ref 推送的 commit sha
before 该分支之前的 commit sha
after 该分支新的 commit sha
compare compare 的 url 地址
commits 更新的 commits 内容
head_commit 最新的 commit 内容
pusher 推送者

MR 事件

当您进行一个代码合并相关操作时,我们将向您发送的 MR 事件。

事件名: merge request

Key Value
action (“synchronize”, “create”, “merge”)
number 项目内资源 id
mergeRequest 合并请求内容

Task 事件

当您进行任务相关操作时,我们将向您发送 Task 事件。

事件名: task

Key Value
action (“assigned”, “labeled”, “opened”, “edited”, “closed”, “reopened”, “deleted”)
task 任务内容

Document 事件

当您进行文件相关操作时,我们将向您发送 Document 事件。

事件名: document

Key Value
action (“create_file”, “create_dir”, “delete_file”, “delete_dir”, “update_file”, “update_dir”, “upload_file”, “move_file”, “delete_file_history”, “rename”, “move_folder”, “move_files_or_folders”, “share_file”, “stop_share_file”)
document 文件内容

Member 事件

当您新增或者删除项目成员时,我们将向您发送 Member 事件。

事件名: member

Key Value
action (“added”, “deleted”)
member member 内容

Node.js 示例代码

var express = require('express');
var bodyParser = require('body-parser');
var multer = require('multer');
var process = require('child_process');
var bodyParser = require('body-parser');
var multer = require('multer');
var app = express();

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data


app.post('/webhook', function(req,res){
    console.log('print', req.body);
    console.info(req.body["token"]);
    if('xxx' === req.body['token'] ){

    console.info(process);
    process.exec('git pull', {'cwd':'/home/coding/workspace'},
            function (error, stdout, stderr) {
                console.log('stdout========================\n' + stdout);
                console.log('stderr========================\n' + stderr);
                if (error !== null) {
                    res.send('<pre>fail!!!\n' + stdout + error + '</pre>');
                } else {
                    res.send('<pre>done!!!\n' + stdout + '</pre>');
                }
            });
    } else {
        console.log(' failed token ')
        res.send('<pre>token不正确?</pre>');
    }
});

app.set('port', 8080);

var server = app.listen( 8080, function() {
    console.log('Listening on port %d', server.address().port);
})

Ruby 示例代码

基于 sinatra 框架实现的 webhook 处理。

#!/usr/bin/env ruby

require "sinatra"
require "json/stream"

  get "/" do
    'Hello world!'
  end
  post "/hook" do
    @text = request.body.read
    @data = JSON::Stream::Parser.parse(@text)
    puts @data['token']
    puts @data['ref']
    puts @data['token']
    puts @data['zen']
    puts @data['commits']
    puts @data['repository']
    puts @data['url']

    if "123" == @data['tokne']
        puts `cd workspace`
        puts `git pull `
    end
  end
  get "/env" do
    content_type :text/plain
    html = ""
    html << "System Environment:\n\n"
    ENV.each do |key, value|
        html << "#{key}: #{value}\n"
    end
    html
  end

PHP 示例代码

<?php
  $pwd = getcwd();
  $command = 'cd ' . $pwd . ' && git pull';
  $output = shell_exec($command);
  print $output;
?>

相关文章