mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-09-08 12:49:13 +02:00
* 企业微信webhook * 企业微信webhook * 企业微信webhook * Update templates/admin/hook_new.tmpl Co-authored-by: a1012112796 <1012112796@qq.com> * Update services/webhook/wechatwork.go Co-authored-by: a1012112796 <1012112796@qq.com> * 修善wechatwork * 修善wechatwork * fix * Update locale_cs-CZ.ini fix * fix build * fix * fix build * make webhooks.zh-cn.md * delet unnecessary blank line * delet unnecessary blank line * 企业微信webhook * 企业微信webhook * 企业微信webhook * Update templates/admin/hook_new.tmpl Co-authored-by: a1012112796 <1012112796@qq.com> * Update services/webhook/wechatwork.go Co-authored-by: a1012112796 <1012112796@qq.com> * 修善wechatwork * 修善wechatwork * fix * fix build * fix * fix build * make webhooks.zh-cn.md * delet unnecessary blank line * delet unnecessary blank line * 企业微信webhook * 企业微信webhook * 企业微信webhook * 企业微信webhook * 企业微信webhook * fix * fix * 企业微信webhook * 企业微信webhook * 企业微信webhook * fix wechat * fix wechat * fix wechat * fix wechat * Fix invalid params and typo of email templates (#16394) Signed-off-by: Meano <meanocat@gmail.com> * Add LRU mem cache implementation (#16226) The current default memory cache implementation is unbounded in size and number of objects cached. This is hardly ideal. This PR proposes creating a TwoQueue LRU cache as the underlying cache for Gitea. The cache is limited by the number of objects stored in the cache (rather than size) for simplicity. The default number of objects is 50000 - which is perhaps too small as most of our objects cached are going to be much less than 1kB. It may be worth considering using a different LRU implementation that actively limits sizes or avoids GC - however, this is just a beginning implementation. Signed-off-by: Andrew Thornton <art27@cantab.net> * [skip ci] Updated translations via Crowdin * Replace `plugins/docker` with `techknowlogick/drone-docker`in ci (#16407) * plugins/docker -> techknowlogick/drone-docker * It is multi-arch * docs: rewrite email setup (#16404) * Add intro for both the docs page and mailer methods * Fix numbering level in SMTP section * Recommends implicit TLS Signed-off-by: Bagas Sanjaya <bagasdotme@gmail.com> * Validate Issue Index before querying DB (#16406) * Fix external renderer (#16401) * fix external renderer * use GBackground context as fallback * no fallback, return error Co-authored-by: Lauris BH <lauris@nix.lv> * Add checkbox to delete pull branch after successful merge (#16049) * Add checkbox to delete pull branch after successful merge * Omit DeleteBranchAfterMerge field in json * Log a warning instead of error when PR head branch deleted * Add DefaultDeleteBranchAfterMerge to PullRequestConfig * Add support for delete_branch_after_merge via API * Fix for API: the branch should be deleted from the HEAD repo If head and base repo are the same, reuse the already opened ctx.Repo.GitRepo * Don't delegate to CleanupBranch, only reuse branch deletion code CleanupBranch contains too much logic that has already been performed by the Merge * Reuse gitrepo in MergePullRequest Co-authored-by: Andrew Thornton <art27@cantab.net> * [skip ci] Updated translations via Crowdin * Detect encoding changes while parsing diff (#16330) * Detect encoding changes while parsing diff * Let branch/tag name be a valid ref to get CI status (#16400) * fix #16384# * refactor: move shared helper func to utils package * extend Tests * use ctx.Repo.GitRepo if not nil * fix * fix * 企业微信webhook * 企业微信webhook * 企业微信webhook * fix build * fix build * Apply suggestions from code review Co-authored-by: a1012112796 <1012112796@qq.com> Co-authored-by: myheavily <myheavily> Co-authored-by: zhaoxin <gitea@fake.local> Co-authored-by: Meano <Meano@foxmail.com> Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: GiteaBot <teabot@gitea.io> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: Bagas Sanjaya <bagasdotme@gmail.com> Co-authored-by: Norwin <noerw@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: Jimmy Praet <jimmy.praet@telenet.be> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
187 lines
4.9 KiB
Markdown
187 lines
4.9 KiB
Markdown
---
|
||
date: "2016-12-01T16:00:00+02:00"
|
||
title: "Webhook"
|
||
slug: "webhooks"
|
||
weight: 10
|
||
toc: false
|
||
draft: false
|
||
menu:
|
||
sidebar:
|
||
parent: "features"
|
||
name: "Webhook"
|
||
weight: 30
|
||
identifier: "webhooks"
|
||
---
|
||
|
||
# Webhook
|
||
|
||
Gitea 的儲存庫事件支援 web hook。這可以有儲存庫管理員在設定頁 `/:username/:reponame/settings/hooks` 中調整。Webhook 也可以按照組織調整或按照全系統調整。
|
||
所有的事件推送都是 POST 請求。此方法目前被下列服務支援:
|
||
|
||
- Gitea (也可以是 GET 請求)
|
||
- Gogs
|
||
- Slack
|
||
- Discord
|
||
- Dingtalk
|
||
- Telegram
|
||
- Microsoft Teams
|
||
- Feishu
|
||
- Wechatwork
|
||
|
||
### 事件資訊
|
||
|
||
**警告**: Payload 中的 `secret` 欄位已經在 Gitea 1.13.0 棄用,並且將在 1.14.0 移除: https://github.com/go-gitea/gitea/issues/11755
|
||
|
||
下面是一個將由 Gitea 發送到 Payload URL 的事件資訊的範例:
|
||
|
||
```
|
||
X-GitHub-Delivery: f6266f16-1bf3-46a5-9ea4-602e06ead473
|
||
X-GitHub-Event: push
|
||
X-Gogs-Delivery: f6266f16-1bf3-46a5-9ea4-602e06ead473
|
||
X-Gogs-Event: push
|
||
X-Gitea-Delivery: f6266f16-1bf3-46a5-9ea4-602e06ead473
|
||
X-Gitea-Event: push
|
||
```
|
||
|
||
```json
|
||
{
|
||
"secret": "3gEsCfjlV2ugRwgpU#w1*WaW*wa4NXgGmpCfkbG3",
|
||
"ref": "refs/heads/develop",
|
||
"before": "28e1879d029cb852e4844d9c718537df08844e03",
|
||
"after": "bffeb74224043ba2feb48d137756c8a9331c449a",
|
||
"compare_url": "http://localhost:3000/gitea/webhooks/compare/28e1879d029cb852e4844d9c718537df08844e03...bffeb74224043ba2feb48d137756c8a9331c449a",
|
||
"commits": [
|
||
{
|
||
"id": "bffeb74224043ba2feb48d137756c8a9331c449a",
|
||
"message": "Webhooks Yay!",
|
||
"url": "http://localhost:3000/gitea/webhooks/commit/bffeb74224043ba2feb48d137756c8a9331c449a",
|
||
"author": {
|
||
"name": "Gitea",
|
||
"email": "someone@gitea.io",
|
||
"username": "gitea"
|
||
},
|
||
"committer": {
|
||
"name": "Gitea",
|
||
"email": "someone@gitea.io",
|
||
"username": "gitea"
|
||
},
|
||
"timestamp": "2017-03-13T13:52:11-04:00"
|
||
}
|
||
],
|
||
"repository": {
|
||
"id": 140,
|
||
"owner": {
|
||
"id": 1,
|
||
"login": "gitea",
|
||
"full_name": "Gitea",
|
||
"email": "someone@gitea.io",
|
||
"avatar_url": "https://localhost:3000/avatars/1",
|
||
"username": "gitea"
|
||
},
|
||
"name": "webhooks",
|
||
"full_name": "gitea/webhooks",
|
||
"description": "",
|
||
"private": false,
|
||
"fork": false,
|
||
"html_url": "http://localhost:3000/gitea/webhooks",
|
||
"ssh_url": "ssh://gitea@localhost:2222/gitea/webhooks.git",
|
||
"clone_url": "http://localhost:3000/gitea/webhooks.git",
|
||
"website": "",
|
||
"stars_count": 0,
|
||
"forks_count": 1,
|
||
"watchers_count": 1,
|
||
"open_issues_count": 7,
|
||
"default_branch": "master",
|
||
"created_at": "2017-02-26T04:29:06-05:00",
|
||
"updated_at": "2017-03-13T13:51:58-04:00"
|
||
},
|
||
"pusher": {
|
||
"id": 1,
|
||
"login": "gitea",
|
||
"full_name": "Gitea",
|
||
"email": "someone@gitea.io",
|
||
"avatar_url": "https://localhost:3000/avatars/1",
|
||
"username": "gitea"
|
||
},
|
||
"sender": {
|
||
"id": 1,
|
||
"login": "gitea",
|
||
"full_name": "Gitea",
|
||
"email": "someone@gitea.io",
|
||
"avatar_url": "https://localhost:3000/avatars/1",
|
||
"username": "gitea"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 範例
|
||
|
||
此範例示範在發生推送事件時,如何使用 webhook 觸發 php 程式。
|
||
使用下列參數在您的儲存庫設定 Webhook 中建立一個 Gitea webhook:
|
||
|
||
- 目標 URL: http://mydomain.com/webhook.php
|
||
- HTTP 請求方法:POST
|
||
- POST Content Type:application/json
|
||
- Secret:123
|
||
- 觸發條件:推送事件
|
||
- 啟用:勾選
|
||
|
||
現在請到您的伺服器上建立 webhook.php 檔案
|
||
|
||
```
|
||
<?php
|
||
|
||
$secret_key = '123';
|
||
|
||
// check for POST request
|
||
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
|
||
error_log('FAILED - not POST - '. $_SERVER['REQUEST_METHOD']);
|
||
exit();
|
||
}
|
||
|
||
// get content type
|
||
$content_type = isset($_SERVER['CONTENT_TYPE']) ? strtolower(trim($_SERVER['CONTENT_TYPE'])) : '';
|
||
|
||
if ($content_type != 'application/json') {
|
||
error_log('FAILED - not application/json - '. $content_type);
|
||
exit();
|
||
}
|
||
|
||
// get payload
|
||
$payload = trim(file_get_contents("php://input"));
|
||
|
||
if (empty($payload)) {
|
||
error_log('FAILED - no payload');
|
||
exit();
|
||
}
|
||
|
||
// get header signature
|
||
$header_signature = isset($_SERVER['HTTP_X_GITEA_SIGNATURE']) ? $_SERVER['HTTP_X_GITEA_SIGNATURE'] : '';
|
||
|
||
if (empty($header_signature)) {
|
||
error_log('FAILED - header signature missing');
|
||
exit();
|
||
}
|
||
|
||
// calculate payload signature
|
||
$payload_signature = hash_hmac('sha256', $payload, $secret_key, false);
|
||
|
||
// check payload signature against header signature
|
||
if ($header_signature !== $payload_signature) {
|
||
error_log('FAILED - payload signature');
|
||
exit();
|
||
}
|
||
|
||
// convert json to array
|
||
$decoded = json_decode($payload, true);
|
||
|
||
// check for json decode errors
|
||
if (json_last_error() !== JSON_ERROR_NONE) {
|
||
error_log('FAILED - json decode - '. json_last_error());
|
||
exit();
|
||
}
|
||
|
||
// success, do something
|
||
```
|
||
|
||
Webhook 設定中有一個傳送測試資料按鈕,它可讓你測試您的設定並將結果顯示於最近傳送記錄。
|