mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-15 07:09:47 +01:00
bb25f85ce8
This was intended to be a small followup for https://github.com/go-gitea/gitea/pull/23712, but...here we are. 1. Our docs currently use `slug` as the entire URL, which makes refactoring tricky (see https://github.com/go-gitea/gitea/pull/23712). Instead, this PR attempts to make future refactoring easier by using slugs as an extension of the section. (Hugo terminology) - What the above boils down to is this PR attempts to use directory organization as URL management. e.g. `usage/comparison.en-us.md` -> `en-us/usage/comparison/`, `usage/packages/overview.en-us.md` -> `en-us/usage/packages/overview/` - Technically we could even remove `slug`, as Hugo defaults to using filename, however at least with this PR it means `slug` only needs to be the name for the **current file** rather than an entire URL 2. This PR adds appropriate aliases (redirects) for pages, so anything on the internet that links to our docs should hopefully not break. 3. A minor nit I've had for a while, renaming `seek-help` to `support`. It's a minor thing, but `seek-help` has a strange connotation to it. 4. The commits are split such that you can review the first which is the "actual" change, and the second is added redirects so that the first doesn't break links elsewhere. --------- Signed-off-by: jolheiser <john.olheiser@gmail.com>
190 lines
4.9 KiB
Markdown
190 lines
4.9 KiB
Markdown
---
|
||
date: "2016-12-01T16:00:00+02:00"
|
||
title: "Webhook"
|
||
slug: "webhooks"
|
||
weight: 30
|
||
toc: false
|
||
draft: false
|
||
aliases:
|
||
- /zh-tw/webhooks
|
||
menu:
|
||
sidebar:
|
||
parent: "usage"
|
||
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
|
||
- Packagist
|
||
|
||
### 事件資訊
|
||
|
||
**警告**: 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 設定中有一個傳送測試資料按鈕,它可讓你測試您的設定並將結果顯示於最近傳送記錄。
|