Skip to main content

版本管理接口(表级)

引言

版本管理相关的接口,在管理台外部调用的时候需要配合鉴权密钥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
}

创建一个灰度版本,逐步发布到全量

灰度版本,从创建到全量发布,步骤如下:

  1. 使用创建版本接口 POST /api/version 生成一个版本号。比如生成的版本号data.id为16,我们用变量versionId代表这个版本号。

创建版本接口的详细调用见上文。

  1. 使用创建灰度版本接口 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
}

这样理论上已经发布了一个灰度版本。

  1. (可选)如果有多个灰度步骤,可逐步发布。

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`即可
  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}