版本管理接口(表级)
引言
版本管理相关的接口,在管理台外部调用的时候需要配合鉴权密钥authId/authKey
所有接口都需要带下述query
参数,接口专属参数会详细说明
query id | 说明 |
---|---|
appid | 项目id |
schemaid | 表id |
authid | 鉴权ID |
authkey | 鉴权key |
拉取版本列表
+ GET
/api/version
拉取表的版本列表,支持查询参数
示例 :
curl -X GET "http://{HOST}/api/version/?appid=vqq_com&schemaid=qq_icon"
-H "Content-Type: text/plain; charset=UTF-8"
-H "Staffname: user_id"
响应 :
{
"data":[
{
"_id":"15",
"schemaId":"qq_icon",
"sourceApp":"vqq_com",
"sourceSchema":"qq_icon_15",
"operator":"katecjzheng",
"desc":"挂件按钮",
"_ctime":"2021-05-27T01:02:45.237Z",
"_mtime":"2021-05-27T01:02:45.273Z",
"id":15
},
...
],
"code":200
}
拉取当前发布的版本
+ GET
/api/version/release
拉取当前发布的版本,支持查询参数
示例 :
curl -X GET "http://{HOST}/api/version/release?appid=vqq_com&schemaid=qq_icon"
-H "Content-Type: text/plain; charset=UTF-8"
-H "Staffname: user_id"
响应 :
{
"data":{
"_id":"qq_icon",
"status":1,
"version":"11", // ⚠️当前版本号,认准version字段
"id":"qq_icon",
"_ctime":"2020-04-22T13:50:35.701Z",
"_mtime":"2021-05-27T12:08:11.784Z",
"versionInfo":{
"_id":"11",
"schemaId":"qq_icon",
"sourceApp":"vqq_com",
"sourceSchema":"qq_icon_11",
"operator":"katecjzheng",
"desc":"sss",
"_ctime":"2021-05-26T07:56:53.501Z",
"_mtime":"2021-05-26T07:56:53.548Z",
"id":11
}
},
"code":200
}
获取某个版本的信息
+ GET
/api/version/:versionId
获取某个版本的信息,支持查询参数
示例 :
curl -X GET "http://{HOST}/api/version/11?appid=vqq_com&schemaid=qq_icon"
-H "Content-Type: text/plain; charset=UTF-8"
-H "Staffname: user_id"
响应 :
{
"data": {
"_id": "11",
"schemaId": "qq_icon",
"sourceApp": "vqq_com",
"sourceSchema": "qq_icon_11",
"operator": "katecjzheng",
"desc": "sss",
"_ctime": "2021-05-26T07:56:53.501Z",
"_mtime": "2021-05-26T07:56:53.548Z",
"id": 11
},
"code": 200
}
创建版本
+ POST
/api/version
创建版本。系统会以当前表的状态进行全表拷贝,相当于一个快照。此时只需要填写desc
(版本描述)
示例 :
curl -X POST "http://{HOST}/api/version?appid=vqq_com&schemaid=qq_icon"
-H "Content-Type: text/plain; charset=UTF-8"
-H "Staffname: user_id"
-d '{"desc": "发布版本的描述"}'
响应 :
{
"data":{
"id":"16",
"sourceApp":"vqq_com",
"sourceSchema":"qq_icon_16"
},
"code":200
}
发布版本
+ POST
/api/version/release/:versionId
发布版本
示例 :
curl -X POST "http://{HOST}/api/version/release/16?appid=vqq_com&schemaid=qq_icon"
-H "Content-Type: text/plain; charset=UTF-8"
-H "Staffname: user_id"
响应 :
{
"data": true,
"code":200
}
基于全量版本发布部分数据
+ POST
/api/version/cherrypick
提交表版本时,仅想提交部分ID的数据,可使用该接口。把需要发布的数据ID进行提交。
示例 :
curl -X POST "http://{HOST}/api/version/cherrypick?appid=vqq_com&schemaid=qq_icon"
-H "Content-Type: text/plain; charset=UTF-8"
-H "Staffname: user_id"
-d '{"desc": "发布版本的描述", "ids": ["id1", "id2"]}'
响应 :
{
"data": {
"id": versionId,
},
"code":200
}
创建一个灰度版本,逐步发布到全量
灰度版本,从创建到全量发布,步骤如下:
- 使用创建版本接口
POST /api/version
生成一个版本号。比如生成的版本号data.id
为16,我们用变量versionId
代表这个版本号。
创建版本接口的详细调用见上文。
- 使用创建灰度版本接口
POST /api/private/strategy
创建一个带策略的灰度版本
示例 :
curl -X POST "http://{HOST}/api/private/strategy?appid=vqq_com&schemaid=qq_icon"
-H "Content-Type: text/plain; charset=UTF-8"
-H "Staffname: user_id"
-d '见下面body'
body :
{
objects: "[]", // 直接复制
priority: versionId, // 替换为你的版本号ID
// 直接传入rules。其实是JSON.stringify以下对象[{ type: "and", rules: [{ object, field, relation, value }]}]。如果不知道你的对象的值,可以在管理台上操作后抓包看请求
rules: "[{\"type\":\"and\",\"rules\":[{\"object\":\"env\",\"field\":\"content\",\"relation\":\"includes\",\"value\":\"Hello\"}]}]", // 直接传入rules。其实是JSON.stringify([])
schemaId: "qq_icon", //替换为你的schemaId
stage: 0, // 直接复制
status: 1, // 直接复制
strategyInfo: "{\"type\":\"grayScaleRelease\"}", // 直接复制
target: versionId, // 替换为你的版本号ID
title: "(自动生成的策略)", // 直接复制
type: "switch", // 直接复制
}
响应 :
{
"data": {
creator: "katecjzheng",
id: "12",
objects: "[]",
priority: 3,
rules: "[{\"type\":\"and\",\"rules\":[{\"object\":\"env\",\"field\":\"content\",\"relation\":\"includes\",\"value\":\"Hello\"}]}]",
schemaId: "demo_",
stage: 0,
status: 1,
strategyInfo: "{\"type\":\"grayScaleRelease\"}",
target: "2",
title: "(自动生成的策略)",
type: "switch",
_ctime: 1639106184448,
_id: "12",
_mtime: 1639106184448,
},
"code":200
}
这样理论上已经发布了一个灰度版本。
- (可选)如果有多个灰度步骤,可逐步发布。
POST
/api/private/strategy/patch/{strategyId}
curl -X "POST" "http://{HOST}/api/private/strategy/patch/{strategyId}?appid=vqq_com&schemaid=qq_icon
-H "Content-Type: text/plain; charset=UTF-8"
-H "Staffname: user_id"
-d '传入上一步创建灰度策略接口的响应,并累增`stage`字段'
- `strategyId`为上一步创建灰度策略响应中的`id`
- `stage`为当前的灰度阶段,从`0`开始计数(第一阶段)。如果想要发布到第二阶段,改成`1`即可
- 使用发布版本接口全量你的灰度版本。
POST /api/version/release/
:versionId``
发布版本接口的详细调用见上文。
拉取当前所有灰度中的版本
+ GET
/api/private/strategy
curl "http://{HOST/api/private/strategy?appid=vqq_com&schemaid=qq_icon&size=total&filter=status%3D1"
该接口参数对齐查询参数
其中字段status的值含义为:全量
2
,灰度1
,普通0
。因此获取灰度版本需要筛选status=1,并且filter内参数要经过encode
响应:
{
"data": [
{
"_id": "57",
"title": "(自动生成的策略)",
"target": "12",
"type": "switch",
"status": 1,
"schemaId": "qq_icon",
"objects": "[]",
"rules": "[{\"type\":\"and\",\"rules\":[{\"object\":\"env\",\"field\":\"content\",\"relation\":\"includes\",\"value\":\"Hello\"}]}]",
"strategyInfo": "{\"type\":\"grayScaleRelease\"}",
"priority": 57,
"_ctime": "2021-12-13T04:49:33.327Z",
"_mtime": "2021-12-13T04:49:33.916Z",
"id": 57,
"creator": "katecjzheng",
"stage": 0
}
],
"code": 200
}
撤下某个灰度版本
+ POST
/api/private/strategy/delete/{策略ID}
curl -X "POST" "http://{HOST}/api/private/strategy/delete/{策略ID}?appid=vqq_com&schemaid=qq_icon"
- 注意,是传
策略ID
,而不是版本ID,比如拉取当前所有灰度中的版本中的返回数据,该值为57,而不是12!
响应:
{
code: 200,
data: true
}
附录:Rules对象协议
const RELATIONS = [
{
id: 'regex',
label: '正则匹配',
valueType: 'string',
defaultValue: '^\\d+$',
},
{
id: 'includes',
label: '含有',
valueType: 'string',
defaultValue: 'Hello',
},
{
id: 'not_includes',
label: '不含有',
valueType: 'string',
defaultValue: 'Hello',
},
{
id: 'eq',
label: '等于',
valueType: 'string',
defaultValue: '',
},
{
id: 'neq',
label: '不等于',
valueType: 'string',
defaultValue: '',
},
{
id: 'in_list',
label: '存在于集合中',
valueType: {
type: 'array',
item: { type: 'string', default: '' },
},
defaultValue: [
'some_item',
],
},
{
id: 'gt',
label: '大于',
valueType: 'number',
defaultValue: 5,
},
{
id: 'lt',
label: '小于',
valueType: 'number',
defaultValue: 5,
},
{
id: 'num.eq',
label: '数值等于',
valueType: 'number',
defaultValue: 5,
help: '精度:10^-6',
},
{
id: 'num.neq',
label: '数值不等于',
valueType: 'number',
defaultValue: 5,
help: '精度:10^-6',
},
];
const relationIds = RELATIONS.map(r => r.id);
Rules: Array<Rule>
Rule: NestedRule | LogicRule
NestedRule: {type: 'and' | 'or', rules: Array<Rule>}
LogicRule: {object: string, relation: typeof relationIds[number], value: any}