本文主要介绍 Webhooks 事件,允许开发人员通过订阅应用事件(新建应用、环境部署完成、变更发布、研发流程运行成功等)来对接三方平台,如三方项目管理平台、自有CMDB平台、三方部署运维平台等。
1. Webhooks 配置
1.1 新建 Webhook
应用交付AppStack提供了全局 Webhooks 和应用内 Webhooks,全局 Webhooks 对企业下所有应用生效,应用内 Webhooks 仅对当前应用生效。
操作入口:全局 Webhooks,进入 AppStack 首页 -> 全局设置 -> Webhooks,单击新建Webhook;应用内 Webhooks,进入目标应用 -> 设置 -> Webhooks,点击新建 Webhook 。
填写 Webhook 参数:
URL:必填,Webhook触发地址,以传输协议 http 或 https 开头。
Secret Token:非必填,在请求的
X-AppStack-Token
HTTP头中发送,用于接收方验证请求合法性。描述:非必填,通常描述 Webhook 用途。
触发事件:单击勾选需要订阅的事件,详见 Webhooks 事件列表。
1.2 测试 Webhook
配置 Webhook 后可对 Webhook 的可用性进行验证,单击 测试Webhook 将自动以新建应用 Mock 示例进行调用触发目标事件,以测试 URL 连通性。
1.3 触发历史
进入 Webhooks 列表,支持查看 Webhook 触发历史,查看触发时间、耗时、以及触发具体的 Request 和 Response,用于触发历史追溯和问题排查。
2. Webhooks 事件列表
2.1 应用
2.1.1 新建应用
Headers
{
"X-AppStack-Event": "App",
"X-AppStack-Action": "Create",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "07ebabc883e14ec78612656bbef61925",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "60d54f3daccf2bbd6659f3ad",
"time": "2024-07-29T06:46:26.157+00:00",
"objectKind": "App",
"objectAttributes": {
"name": "myapp-demo",
"description": "这是一个测试应用",
"status": null,
"labelList": [],
"favoured": false,
"groupName": null,
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722235582307,
"type": "APP",
"id": "myapp-demo"
}
}
2.1.2 删除应用
Headers
{
"X-AppStack-Event": "App",
"X-AppStack-Action": "Delete",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "ecd0f8a7b6a6473bbbc3e5212ec33929",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "60d54f3daccf2bbd6659f3ad",
"time": "2024-07-29T06:50:25.480+00:00",
"objectKind": "App",
"objectAttributes": {
"name": "myapp-demo",
"description": "这是一个测试应用",
"status": null,
"labelList": [],
"favoured": false,
"groupName": null,
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722235582000,
"type": "APP",
"id": "myapp-demo"
}
}
2.2 环境
2.2.1 新建环境
Headers
{
"X-AppStack-Event": "Env",
"X-AppStack-Action": "Create",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "ecfc8a274ff3479e9bfa07e421a06b9c",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "60d54f3daccf2bbd6659f3ad",
"time": "2024-07-29T07:06:04.104+00:00",
"objectKind": "Env",
"objectAttributes": {
"name": "test-env",
"displayName": "测试环境",
"appName": "myapp-demo",
"status": "NEW",
"description": "这是测试环境,用于日常测试验证",
"creatorId": null,
"gmtCreate": null,
"lockBy": null,
"resourcePoolName": "default",
"deployGroupName": "demo-k8s-cluster",
"orchestrationName": null,
"profiles": [
{
"name": "test-vars",
"displayName": "测试环境变量组",
"type": "APP"
}
],
"spec": {
"migrateState": null,
"oamRebuildState": null,
"withoutOam": "ON",
"rolloutStrategy": null,
"replicasManagement": "SYSTEM"
},
"labelList": [
{
"namespace": "default",
"name": "envType",
"value": "test",
"displayName": "环境级别",
"displayValue": "测试环境",
"extraMap": {}
}
],
"id": "test-env"
}
}
2.2.2 环境设置
Headers
{
"X-AppStack-Event": "Env",
"X-AppStack-Action": "Update",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "64f6e280c9814f668ca56f713b6af19d",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "60d54f3daccf2bbd6659f3ad",
"time": "2024-07-29T07:07:42.536+00:00",
"objectKind": "Env",
"objectAttributes": {
"name": "test-env",
"displayName": "测试环境",
"appName": "myapp-demo",
"status": "NEW",
"description": "这是测试环境,用于日常测试验证",
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722236764000,
"lockBy": null,
"resourcePoolName": "default",
"deployGroupName": "demo-k8s-cluster",
"orchestrationName": null,
"profiles": [
{
"name": "test-vars",
"displayName": "测试环境变量组",
"type": "APP"
}
],
"spec": {
"migrateState": null,
"oamRebuildState": null,
"withoutOam": "ON",
"rolloutStrategy": [
{
"locator": "*",
"batches": null,
"batchSteps": null,
"timeOutMS": 1200000,
"targetReplicas": null,
"batchMode": "ConfirmFirstBatch",
"deployType": "Rolling"
}
],
"replicasManagement": "USER"
},
"labelList": [
{
"namespace": "default",
"name": "envType",
"value": "test",
"displayName": "环境级别",
"displayValue": "测试环境",
"extraMap": {}
}
],
"id": "test-env"
}
}
2.2.3 删除环境
Headers
{
"X-AppStack-Event": "Env",
"X-AppStack-Action": "Delete",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "f189080c26b94cdcbf069debdfeeff97",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "60d54f3daccf2bbd6659f3ad",
"time": "2024-07-29T07:09:04.612+00:00",
"objectKind": "Env",
"objectAttributes": {
"name": "test-env",
"displayName": "测试环境",
"appName": "myapp-demo",
"status": "NEW",
"description": "这是测试环境,用于日常测试验证",
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722236764000,
"lockBy": null,
"resourcePoolName": "default",
"deployGroupName": "demo-k8s-cluster",
"orchestrationName": null,
"profiles": [
{
"name": "test-vars",
"displayName": "测试环境变量组",
"type": "APP"
}
],
"spec": {
"migrateState": null,
"oamRebuildState": null,
"withoutOam": "ON",
"rolloutStrategy": [
{
"locator": "*",
"batches": null,
"batchSteps": null,
"timeOutMS": 1200000,
"targetReplicas": null,
"batchMode": "ConfirmFirstBatch",
"deployType": "Rolling"
}
],
"replicasManagement": "USER"
},
"labelList": [
{
"namespace": "default",
"name": "envType",
"value": "test",
"displayName": "环境级别",
"displayValue": "测试环境",
"extraMap": {}
}
],
"id": "test-env"
}
}
2.3 部署单
2.3.1 部署单状态更新
Headers
{
"X-AppStack-Event": "ChangeOrder",
"X-AppStack-Action": "StatusUpdate",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "ca59d8f8f6224eb3b518af9c2145aca5",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "620321f073741507cb7d0cfd",
"time": "2024-08-15T06:43:34.911+00:00",
"objectKind": "ChangeOrder",
"objectAttributes": {
"name": "20240815144312-部署",
"appName": "myapp-demo",
"type": "Deploy",
"startedAt": 1723704199000,
"endedAt": null,
"version": "20240815144312-310",
"tag": "myapp-demo::20240815144315::626e429",
"state": "FAILED",
"overrideFinishState": null,
"controlMode": "Auto",
"description": null,
"jobs": [
{
"sn": "1aa8d03f6b574681af203447812d1d61",
"name": "20240815144312-部署",
"envName": "test",
"envDisplayName": null,
"appName": "myapp-demo",
"changeableEnvSn": "8480d937c656460fada9ca27f37f63a3",
"engineType": "Ade2",
"resourceType": "KUBERNETES",
"changeOrderSn": "32468993abb14653ae9d86cf5d1cac98",
"nextSn": null,
"priority": 0,
"profiles": [
{
"name": "test",
"displayName": "测试环境变量组",
"type": "APP"
}
],
"startedAt": 1723704199000,
"endedAt": 1723704215000,
"state": "FAILED",
"overrideFinishState": null,
"controlMode": "Auto",
"stages": [
{
"sn": "9436683c270d447ab22045de5642b027",
"jobSn": "1aa8d03f6b574681af203447812d1d61",
"engineType": "Ade2",
"resourceType": "KUBERNETES",
"priority": 1,
"startedAt": 1723704199000,
"endedAt": 1723704206000,
"state": "SUCCESS",
"overrideFinishState": null,
"controlMode": "Auto",
"name": "顺序1",
"tasks": [
{
"sn": "b8c82092f1a04d829154fde67bc4e0af",
"name": "myapp-demo-test",
"engineType": "Ade2",
"resourceType": "KUBERNETES",
"jobSn": "1aa8d03f6b574681af203447812d1d61",
"locator": "myapp-demo-test/default/core/v1/Service",
"stageSn": "9436683c270d447ab22045de5642b027",
"priority": 0,
"startedAt": 1723704199000,
"endedAt": 1723704202000,
"state": "SUCCESS",
"overrideFinishState": null,
"strategyContent": "{\"behavior\":\"Upsert\"}",
"contextContent": "{\"appName\":\"myapp-demo\",\"envName\":\"test\",\"name\":\"myapp-demo-test\",\"changeOrderVersion\":\"20240815144312-310\",\"artifacts\":{},\"version\":\"v1\",\"jobType\":\"Deploy\",\"group\":\"core\",\"namespace\":\"default\",\"deployGroupName\":\"c8c18031145b74e20811ae8bb59cea7fb\",\"planningStatus\":null,\"kind\":\"Service\",\"currentPassIndex\":null,\"extendParams\":{},\"initialRevisions\":null,\"locator\":\"myapp-demo-test/default/core/v1/Service\",\"apiVersion\":\"core/v1\"}",
"deliveries": "---\napiVersion: \"v1\"\nkind: \"Service\"\nmetadata:\n name: \"myapp-demo-test\"\n namespace: \"default\"\nspec:\n selector:\n run: \"myapp-demo-test\"\n ports:\n - protocol: \"TCP\"\n port: 80\n targetPort: 8080\n",
"spec": "---\napiVersion: \"v1\"\nkind: \"Service\"\nmetadata:\n name: \"myapp-demo-test\"\n namespace: \"default\"\n labels:\n devops.aliyun.com/app-name: \"myapp-demo\"\n devops.aliyun.com/version: \"20240815144312-310\"\n devops.aliyun.com/org-id: \"620321f073741507cb7d0cfd\"\n devops.aliyun.com/env-name: \"test\"\nspec:\n selector:\n run: \"myapp-demo-test\"\n ports:\n - protocol: \"TCP\"\n port: 80\n targetPort: 8080\n",
"engineTaskKey": "77b1c704-70fd-445a-ae58-c2dc2bfc2147",
"engineTaskResultContent": "{\"typeKey\":\"Ade2@KUBERNETES\",\"deliverySn\":\"77b1c704-70fd-445a-ae58-c2dc2bfc2147\",\"state\":\"SUCCESSFUL\",\"userParam\":{\"X-Tenant-Id\":\"620321f073741507cb7d0cfd\",\"X-Operator-Id\":\"646dabc05ccc4ad1bc2a9e2f\",\"traceId\":\"1889cf906d064cb7861cefe989d5a5b5.794.17237041982184057\",\"typeKey\":\"Ade2@KUBERNETES\"},\"statistics\":null,\"podRevision\":null,\"serviceBrief\":{\"ports\":[\"TCP 80:8080\"],\"clusterIp\":\"172.16.192.188\"},\"purgeStatistics\":null,\"callbackParams\":{},\"taskErrorMessages\":{},\"snapshotType\":null,\"snapshotKey\":null,\"uid\":null,\"info\":null,\"resourceType\":\"KUBERNETES\",\"typeKey\":\"Ade2@KUBERNETES\",\"engineTaskKey\":\"77b1c704-70fd-445a-ae58-c2dc2bfc2147\",\"engineType\":\"Ade2\"}",
"orgId": "620321f073741507cb7d0cfd"
}
]
},
{
"sn": "d7cce8a19c3f4343b9a56102e970063a",
"jobSn": "1aa8d03f6b574681af203447812d1d61",
"engineType": "Ade2",
"resourceType": "KUBERNETES",
"priority": 2,
"startedAt": 1723704206000,
"endedAt": 1723704215000,
"state": "FAILED",
"overrideFinishState": null,
"controlMode": "Auto",
"name": "顺序2",
"tasks": [
{
"sn": "c86e2410edae4b948e1f11b683954810",
"name": "myapp-demo-test",
"engineType": "Ade2",
"resourceType": "KUBERNETES",
"jobSn": "1aa8d03f6b574681af203447812d1d61",
"locator": "myapp-demo-test/default/apps/v1/Deployment",
"stageSn": "d7cce8a19c3f4343b9a56102e970063a",
"priority": 0,
"startedAt": 1723704206000,
"endedAt": 1723704208000,
"state": "FAILED",
"overrideFinishState": null,
"strategyContent": "{\"version\":\"v2\",\"behavior\":\"Upsert\",\"batches\":2,\"batchSteps\":[{\"type\":\"WEIGHT\",\"value\":\"20\"},{\"type\":\"WEIGHT\",\"value\":\"80\"}],\"quickRollback\":null,\"targetReplicas\":null,\"fromReplicas\":null,\"timeOutMS\":600000,\"batchMode\":\"Manual\",\"deployType\":\"Batch\",\"deleteDeployGroup\":false,\"restraint\":null,\"totalReplicas\":null}",
"contextContent": "{\"appName\":\"myapp-demo\",\"envName\":\"test\",\"name\":\"myapp-demo-test\",\"changeOrderVersion\":\"20240815144312-310\",\"artifacts\":{\"image.backend\":\"yunxiao-registry.cn-beijing.cr.aliyuncs.com/test/demo1:emoji-2024-06-18-15-22-45\"},\"version\":\"v1\",\"jobType\":\"Deploy\",\"group\":\"apps\",\"namespace\":\"default\",\"deployGroupName\":\"c8c18031145b74e20811ae8bb59cea7fb\",\"planningStatus\":null,\"kind\":\"Deployment\",\"currentPassIndex\":0,\"extendParams\":{},\"initialRevisions\":[\"20240815144312-310\",\"20240702150459-614\"],\"locator\":\"myapp-demo-test/default/apps/v1/Deployment\",\"apiVersion\":\"apps/v1\"}",
"deliveries": "---\napiVersion: \"apps/v1\"\nkind: \"Deployment\"\nmetadata:\n name: \"myapp-demo-test\"\n namespace: \"default\"\n labels:\n run: \"myapp-demo-test\"\nspec:\n replicas: \"l\"\n selector:\n matchLabels:\n run: \"myapp-demo-test\"\n template:\n metadata:\n labels:\n run: \"myapp-demo-test\"\n spec:\n containers:\n - name: \"main\"\n image: \"yunxiao-registry.cn-beijing.cr.aliyuncs.com/test/demo1:emoji-2024-06-18-15-22-45\"\n ports:\n - containerPort: 8080\n resources:\n limits:\n cpu: 1\n memory: \"1024Mi\"\n requests:\n cpu: 0.01\n memory: \"32Mi\"\n",
"spec": "---\napiVersion: \"apps/v1\"\nkind: \"Deployment\"\nmetadata:\n name: \"myapp-demo-test\"\n namespace: \"default\"\n labels:\n run: \"myapp-demo-test\"\n devops.aliyun.com/app-name: \"myapp-demo\"\n devops.aliyun.com/env-name: \"test\"\n devops.aliyun.com/version: \"20240815144312-310\"\n devops.aliyun.com/org-id: \"620321f073741507cb7d0cfd\"\nspec:\n replicas: \"l\"\n selector:\n matchLabels:\n run: \"myapp-demo-test\"\n template:\n metadata:\n labels:\n run: \"myapp-demo-test\"\n devops.aliyun.com/app-name: \"myapp-demo\"\n devops.aliyun.com/env-name: \"test\"\n devops.aliyun.com/version: \"20240815144312-310\"\n devops.aliyun.com/org-id: \"620321f073741507cb7d0cfd\"\n spec:\n containers:\n - name: \"main\"\n image: \"yunxiao-registry.cn-beijing.cr.aliyuncs.com/test/demo1:emoji-2024-06-18-15-22-45\"\n ports:\n - containerPort: 8080\n resources:\n limits:\n cpu: 1\n memory: \"1024Mi\"\n requests:\n cpu: 0.01\n memory: \"32Mi\"\n",
"engineTaskKey": "59bb15fb-3454-4d0b-8a15-41e943786ed7",
"engineTaskResultContent": "{\"typeKey\":\"Ade2@KUBERNETES\",\"deliverySn\":\"59bb15fb-3454-4d0b-8a15-41e943786ed7\",\"state\":\"FAILED\",\"userParam\":{\"X-Tenant-Id\":\"620321f073741507cb7d0cfd\",\"X-Operator-Id\":\"646dabc05ccc4ad1bc2a9e2f\",\"traceId\":\"1889cf906d064cb7861cefe989d5a5b5.794.17237041982184057\",\"typeKey\":\"Ade2@KUBERNETES\"},\"statistics\":{\"externalOrderId\":null,\"rolloutId\":null,\"strategy\":\"Batch\",\"currentPassIndex\":0,\"totalPasses\":2,\"passStatus\":\"FAILED\",\"overallStatus\":\"FAILED\",\"passStatistics\":null,\"overallStatistics\":null,\"batchStatisticList\":[{\"updatedReplicas\":20,\"desiredReplicas\":20},{\"updatedReplicas\":0,\"desiredReplicas\":100}],\"purgeStatistics\":null,\"lastPass\":false},\"podRevision\":{\"newRevisions\":[{\"name\":\"notExists-0\",\"status\":\"NotExists\",\"age\":\"2024-08-15T06:43:27Z\",\"deployGroupName\":null,\"namespace\":null,\"refWorkload\":null,\"revision\":\"20240815144312-310\"}],\"oldRevisions\":[{\"name\":\"myapp-demo-test-6655b7f48d-pmwbs\",\"status\":\"Running\",\"age\":\"2024-07-02T07:05:27Z\",\"deployGroupName\":null,\"namespace\":\"default\",\"refWorkload\":null,\"revision\":\"20240702150459-614\"},{\"name\":\"myapp-demo-test-6655b7f48d-hqqqc\",\"status\":\"Running\",\"age\":\"2024-07-02T07:05:59Z\",\"deployGroupName\":null,\"namespace\":\"default\",\"refWorkload\":null,\"revision\":\"20240702150459-614\"},{\"name\":\"myapp-demo-test-6655b7f48d-zhbj9\",\"status\":\"Running\",\"age\":\"2024-07-02T07:06:00Z\",\"deployGroupName\":null,\"namespace\":\"default\",\"refWorkload\":null,\"revision\":\"20240702150459-614\"}]},\"serviceBrief\":null,\"purgeStatistics\":null,\"callbackParams\":{},\"taskErrorMessages\":{\"Delivery[59bb15fb-3454-4d0b-8a15-41e943786ed7]\":\"Error occurs when preparing delivery[59bb15fb-3454-4d0b-8a15-41e943786ed7]: Cannot deserialize value of type `int` from String \\\"l\\\": not a valid `int` value\\n at [Source: (StringReader); line: 16, column: 13] (through reference chain: io.fabric8.kubernetes.api.model.apps.Deployment[\\\"spec\\\"]->io.fabric8.kubernetes.api.model.apps.DeploymentSpec[\\\"replicas\\\"])\"},\"snapshotType\":\"OSS\",\"snapshotKey\":\"620321f073741507cb7d0cfdc86e2410edae4b948e1f11b683954810\",\"uid\":null,\"info\":null,\"resourceType\":\"KUBERNETES\",\"typeKey\":\"Ade2@KUBERNETES\",\"engineTaskKey\":\"59bb15fb-3454-4d0b-8a15-41e943786ed7\",\"engineType\":\"Ade2\"}",
"orgId": "620321f073741507cb7d0cfd"
}
]
}
],
"type": "Deploy",
"snapshot": {
"deployGroup": {
"name": "c8c18031145b74e20811ae8bb59cea7fb",
"displayName": "devops-pre-autotest-002",
"description": "",
"poolName": "default",
"appSelector": null,
"claimList": [
{
"sn": "1b516ad73f7947339d56d33656a6b95c",
"type": "ACK",
"instanceName": "c8c18031145b74e20811ae8bb59cea7fb",
"specMap": {},
"itemSnList": [],
"refType": null,
"refId": null
}
],
"creator": "646dabc05ccc4ad1bc2a9e2f"
}
}
}
],
"sn": "32468993abb14653ae9d86cf5d1cac98",
"creator": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1723704199000,
"sourceType": "CUSTOMIZE",
"sourceSn": "646dabc05ccc4ad1bc2a9e2f",
"id": "32468993abb14653ae9d86cf5d1cac98"
}
}
2.4 应用编排
2.4.1 新建编排
Headers
{
"X-AppStack-Event": "AppOrchestration",
"X-AppStack-Action": "Create",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "c534abbceaad422fbb56ed7c53298675",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "60d54f3daccf2bbd6659f3ad",
"time": "2024-07-29T07:10:27.934+00:00",
"objectKind": "AppOrchestration",
"objectAttributes": {
"storageType": "BUILTIN",
"app": {
"name": "myapp-demo",
"description": "这是一个测试应用",
"status": null,
"labelList": [],
"favoured": false,
"groupName": null,
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722236335000,
"type": "APP"
},
"format": "MANIFEST",
"suitableResourceTypes": [
"KUBERNETES"
],
"sn": "myapp-demo@KUBERNETES",
"revision": {
"sha": "73f3aa0a977946dbc79f948ba0933b1ab3962b2f",
"message": "Initialize choreography",
"author": "646dabc05ccc4ad1bc2a9e2f",
"commitTime": 1722237027908
},
"name": "myapp-demo",
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722237027894,
"modifierId": "646dabc05ccc4ad1bc2a9e2f",
"gmtModified": 1722237027894,
"description": null,
"type": "AppBuiltInOrchestration",
"labelPolicy": "NONE",
"labelList": [],
"syncSourceTemplate": null,
"placeholderList": [
{
"name": "image.backend",
"description": "后端服务镜像",
"type": "string",
"value": "NULL",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": true,
"rsType": "KUBERNETES"
},
{
"name": "envName",
"description": "环境名",
"type": "string",
"value": "APPSTACK_ENV_NAME",
"overridable": false,
"rule": null,
"valueSource": "VARIABLE",
"predefined": true,
"rsType": "KUBERNETES"
},
{
"name": "namespace",
"description": "命名空间",
"type": "string",
"value": "default",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "cpuLimit",
"description": "CPU限制",
"type": "string",
"value": "1",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "memoryLimit",
"description": "内存限制",
"type": "string",
"value": "1024Mi",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "cpuRequest",
"description": "CPU请求",
"type": "string",
"value": "0.01",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "memoryRequest",
"description": "内存请求",
"type": "string",
"value": "32Mi",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
}
],
"componentList": [
{
"name": "demo-service",
"kind": "Service",
"description": "服务访问策略",
"content": "---\napiVersion: v1\nkind: Service\nmetadata:\n name: myapp-demo-{{ .AppStack.envName }}\n # 命名空间配置:\n # 建议每个环境使用不同的Kubernetes集群命名空间,以便达到环境隔离效果\n # 部署时云效会将占位符{{ .Values.namespace }}替换成右侧设置的实际值\n namespace: {{ .Values.namespace }}\nspec:\n selector:\n run: myapp-demo-{{ .AppStack.envName }}\n ports:\n - protocol: TCP\n port: 80\n targetPort: 8080",
"priority": 1,
"type": "KUBERNETES"
},
{
"name": "demo-deployment",
"kind": "Deployment",
"description": "无状态应用",
"content": "---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: myapp-demo-{{ .AppStack.envName }}\n labels:\n run: myapp-demo-{{ .AppStack.envName }}\n # 命名空间配置:\n # 建议每个环境使用不同的Kubernetes集群命名空间,以便达到环境隔离效果\n # 部署时云效会将占位符{{ .Values.namespace }}替换成右侧设置的实际值\n namespace: {{ .Values.namespace }}\nspec:\n replicas: 1\n selector:\n matchLabels:\n run: myapp-demo-{{ .AppStack.envName }}\n template:\n metadata:\n labels:\n run: myapp-demo-{{ .AppStack.envName }}\n spec:\n containers:\n - name: main\n # 镜像配置:\n # 部署时云效会将预置占位符{{ .AppStack.image.backend }}替换成实际部署时的镜像\n # 支持在新建部署单时手动输入镜像地址,也支持接收流水线的上游构建产物\n # 另外,在右侧镜像占位符处添加多个镜像,可以支持SideCar或InitContainer等多容器场景\n image: {{ .AppStack.image.backend }}\n # 端口配置:\n ports:\n - containerPort: 8080\n # 资源规格配置:\n # 当不同环境有不同的CPU或内存资源规格要求时,可以定义占位符搭配变量组使用\n # 如,设置{{ .Values.cpuLimit }}占位符,部署时云效会将占位符{{ .Values.cpuLimit }}替换成右侧设置的实际值\n resources:\n limits:\n cpu: {{ .Values.cpuLimit }}\n memory: {{ .Values.memoryLimit }}\n requests:\n cpu: {{ .Values.cpuRequest }}\n memory: {{ .Values.memoryRequest }}\n # 生命周期配置:\n #lifecycle:\n # preStop:\n # exec:\n # command: [ \"/bin/bash\", \"-c\", \"sleep 10\" ]\n # 探活配置:\n #livenessProbe:\n # initialDelaySeconds: 10\n # failureThreshold: 3\n # periodSeconds: 5\n # successThreshold: 1\n # timeoutSeconds: 2\n # httpGet:\n # scheme: HTTP\n # path: /health\n # port: 7002\n # 就绪探测配置:\n #readinessProbe:\n # initialDelaySeconds: 60\n # failureThreshold: 4\n # periodSeconds: 10\n # successThreshold: 1\n # timeoutSeconds: 3\n # httpGet:\n # scheme: HTTP\n # port: 7002\n # path: /health",
"priority": 2,
"type": "KUBERNETES"
}
],
"groupNameMap": {},
"id": "myapp-demo@KUBERNETES"
}
}
2.4.2 编排更新
Headers
{
"X-AppStack-Event": "AppOrchestration",
"X-AppStack-Action": "Update",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "4bcd40b2c1044260b2bd946b2195981d",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "60d54f3daccf2bbd6659f3ad",
"time": "2024-07-29T07:14:47.991+00:00",
"objectKind": "AppOrchestration",
"objectAttributes": {
"storageType": "BUILTIN",
"app": {
"name": "myapp-demo",
"description": "这是一个测试应用",
"status": null,
"labelList": [],
"favoured": false,
"groupName": null,
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722236335000,
"type": "APP"
},
"format": "MANIFEST",
"suitableResourceTypes": [
"KUBERNETES"
],
"sn": "myapp-demo@KUBERNETES",
"revision": {
"sha": "7277190c92046cb56d4ba5941cbce4b78c11337c",
"message": "修改端口号为8081",
"author": "646dabc05ccc4ad1bc2a9e2f",
"commitTime": 1722237287949
},
"name": "myapp-demo",
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722237028000,
"modifierId": null,
"gmtModified": null,
"description": null,
"type": "AppBuiltInOrchestration",
"labelPolicy": "FROM_LABEL_BINDING",
"labelList": [
{
"namespace": "default",
"name": "envType",
"value": "dev",
"displayName": "环境级别",
"displayValue": "开发环境",
"extraMap": {}
},
{
"namespace": "default",
"name": "envType",
"value": "test",
"displayName": "环境级别",
"displayValue": "测试环境",
"extraMap": {}
},
{
"namespace": "default",
"name": "envType",
"value": "prepub",
"displayName": "环境级别",
"displayValue": "预发环境",
"extraMap": {}
},
{
"namespace": "default",
"name": "envType",
"value": "production",
"displayName": "环境级别",
"displayValue": "生产环境",
"extraMap": {}
}
],
"syncSourceTemplate": null,
"placeholderList": [
{
"name": "image.backend",
"description": "后端服务镜像",
"type": "string",
"value": "NULL",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": true,
"rsType": "KUBERNETES"
},
{
"name": "envName",
"description": "环境名",
"type": "string",
"value": "APPSTACK_ENV_NAME",
"overridable": false,
"rule": null,
"valueSource": "VARIABLE",
"predefined": true,
"rsType": "KUBERNETES"
},
{
"name": "namespace",
"description": "命名空间",
"type": "string",
"value": "default",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "cpuLimit",
"description": "CPU限制",
"type": "string",
"value": "1",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "memoryLimit",
"description": "内存限制",
"type": "string",
"value": "1024Mi",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "cpuRequest",
"description": "CPU请求",
"type": "string",
"value": "0.01",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "memoryRequest",
"description": "内存请求",
"type": "string",
"value": "32Mi",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
}
],
"componentList": [
{
"name": "demo-service",
"kind": "Service",
"description": "服务访问策略",
"content": "---\napiVersion: v1\nkind: Service\nmetadata:\n name: myapp-demo-{{ .AppStack.envName }}\n # 命名空间配置:\n # 建议每个环境使用不同的Kubernetes集群命名空间,以便达到环境隔离效果\n # 部署时云效会将占位符{{ .Values.namespace }}替换成右侧设置的实际值\n namespace: {{ .Values.namespace }}\nspec:\n selector:\n run: myapp-demo-{{ .AppStack.envName }}\n ports:\n - protocol: TCP\n port: 80\n targetPort: 8081",
"priority": 1,
"type": "KUBERNETES"
},
{
"name": "demo-deployment",
"kind": "Deployment",
"description": "无状态应用",
"content": "---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: myapp-demo-{{ .AppStack.envName }}\n labels:\n run: myapp-demo-{{ .AppStack.envName }}\n # 命名空间配置:\n # 建议每个环境使用不同的Kubernetes集群命名空间,以便达到环境隔离效果\n # 部署时云效会将占位符{{ .Values.namespace }}替换成右侧设置的实际值\n namespace: {{ .Values.namespace }}\nspec:\n replicas: 1\n selector:\n matchLabels:\n run: myapp-demo-{{ .AppStack.envName }}\n template:\n metadata:\n labels:\n run: myapp-demo-{{ .AppStack.envName }}\n spec:\n containers:\n - name: main\n # 镜像配置:\n # 部署时云效会将预置占位符{{ .AppStack.image.backend }}替换成实际部署时的镜像\n # 支持在新建部署单时手动输入镜像地址,也支持接收流水线的上游构建产物\n # 另外,在右侧镜像占位符处添加多个镜像,可以支持SideCar或InitContainer等多容器场景\n image: {{ .AppStack.image.backend }}\n # 端口配置:\n ports:\n - containerPort: 8080\n # 资源规格配置:\n # 当不同环境有不同的CPU或内存资源规格要求时,可以定义占位符搭配变量组使用\n # 如,设置{{ .Values.cpuLimit }}占位符,部署时云效会将占位符{{ .Values.cpuLimit }}替换成右侧设置的实际值\n resources:\n limits:\n cpu: {{ .Values.cpuLimit }}\n memory: {{ .Values.memoryLimit }}\n requests:\n cpu: {{ .Values.cpuRequest }}\n memory: {{ .Values.memoryRequest }}\n # 生命周期配置:\n #lifecycle:\n # preStop:\n # exec:\n # command: [ \"/bin/bash\", \"-c\", \"sleep 10\" ]\n # 探活配置:\n #livenessProbe:\n # initialDelaySeconds: 10\n # failureThreshold: 3\n # periodSeconds: 5\n # successThreshold: 1\n # timeoutSeconds: 2\n # httpGet:\n # scheme: HTTP\n # path: /health\n # port: 7002\n # 就绪探测配置:\n #readinessProbe:\n # initialDelaySeconds: 60\n # failureThreshold: 4\n # periodSeconds: 10\n # successThreshold: 1\n # timeoutSeconds: 3\n # httpGet:\n # scheme: HTTP\n # port: 7002\n # path: /health",
"priority": 2,
"type": "KUBERNETES"
}
],
"groupNameMap": {},
"id": "myapp-demo@KUBERNETES"
}
}
2.4.3 删除编排
Headers
{
"X-AppStack-Event": "AppOrchestration",
"X-AppStack-Action": "Delete",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "0001408e7e4743748a891beb6d3d87ae",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "60d54f3daccf2bbd6659f3ad",
"time": "2024-07-29T07:17:31.418+00:00",
"objectKind": "AppOrchestration",
"objectAttributes": {
"storageType": "BUILTIN",
"app": {
"name": "myapp-demo",
"description": "这是建立于2024年07月29日的应用",
"status": null,
"labelList": [],
"favoured": false,
"groupName": null,
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722236335000,
"type": "APP"
},
"format": "MANIFEST",
"suitableResourceTypes": [
"KUBERNETES"
],
"sn": "myapp-demo@KUBERNETES",
"revision": {
"sha": "7277190c92046cb56d4ba5941cbce4b78c11337c",
"message": "修改端口号为8081",
"author": "646dabc05ccc4ad1bc2a9e2f",
"commitTime": 1722237287949
},
"name": "myapp-demo",
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722237288000,
"modifierId": "646dabc05ccc4ad1bc2a9e2f",
"gmtModified": 1722237288000,
"description": null,
"type": "AppBuiltInOrchestration",
"labelPolicy": "FROM_LABEL_BINDING",
"labelList": [
{
"namespace": "default",
"name": "envType",
"value": "dev",
"displayName": "环境级别",
"displayValue": "开发环境",
"extraMap": {}
},
{
"namespace": "default",
"name": "envType",
"value": "test",
"displayName": "环境级别",
"displayValue": "测试环境",
"extraMap": {}
},
{
"namespace": "default",
"name": "envType",
"value": "production",
"displayName": "环境级别",
"displayValue": "生产环境",
"extraMap": {}
},
{
"namespace": "default",
"name": "envType",
"value": "prepub",
"displayName": "环境级别",
"displayValue": "预发环境",
"extraMap": {}
}
],
"syncSourceTemplate": null,
"placeholderList": [
{
"name": "image.backend",
"description": "后端服务镜像",
"type": "string",
"value": "NULL",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": true,
"rsType": "KUBERNETES"
},
{
"name": "envName",
"description": "环境名",
"type": "string",
"value": "APPSTACK_ENV_NAME",
"overridable": false,
"rule": null,
"valueSource": "VARIABLE",
"predefined": true,
"rsType": "KUBERNETES"
},
{
"name": "namespace",
"description": "命名空间",
"type": "string",
"value": "default",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "cpuLimit",
"description": "CPU限制",
"type": "string",
"value": "1",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "memoryLimit",
"description": "内存限制",
"type": "string",
"value": "1024Mi",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "cpuRequest",
"description": "CPU请求",
"type": "string",
"value": "0.01",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
},
{
"name": "memoryRequest",
"description": "内存请求",
"type": "string",
"value": "32Mi",
"overridable": true,
"rule": null,
"valueSource": "CONSTANT",
"predefined": false,
"rsType": "KUBERNETES"
}
],
"componentList": [
{
"name": "demo-service",
"kind": "Service",
"description": "服务访问策略",
"content": "---\napiVersion: v1\nkind: Service\nmetadata:\n name: myapp-demo-{{ .AppStack.envName }}\n # 命名空间配置:\n # 建议每个环境使用不同的Kubernetes集群命名空间,以便达到环境隔离效果\n # 部署时云效会将占位符{{ .Values.namespace }}替换成右侧设置的实际值\n namespace: {{ .Values.namespace }}\nspec:\n selector:\n run: myapp-demo-{{ .AppStack.envName }}\n ports:\n - protocol: TCP\n port: 80\n targetPort: 8081",
"priority": 1,
"type": "KUBERNETES"
},
{
"name": "demo-deployment",
"kind": "Deployment",
"description": "无状态应用",
"content": "---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: myapp-demo-{{ .AppStack.envName }}\n labels:\n run: myapp-demo-{{ .AppStack.envName }}\n # 命名空间配置:\n # 建议每个环境使用不同的Kubernetes集群命名空间,以便达到环境隔离效果\n # 部署时云效会将占位符{{ .Values.namespace }}替换成右侧设置的实际值\n namespace: {{ .Values.namespace }}\nspec:\n replicas: 1\n selector:\n matchLabels:\n run: myapp-demo-{{ .AppStack.envName }}\n template:\n metadata:\n labels:\n run: myapp-demo-{{ .AppStack.envName }}\n spec:\n containers:\n - name: main\n # 镜像配置:\n # 部署时云效会将预置占位符{{ .AppStack.image.backend }}替换成实际部署时的镜像\n # 支持在新建部署单时手动输入镜像地址,也支持接收流水线的上游构建产物\n # 另外,在右侧镜像占位符处添加多个镜像,可以支持SideCar或InitContainer等多容器场景\n image: {{ .AppStack.image.backend }}\n # 端口配置:\n ports:\n - containerPort: 8080\n # 资源规格配置:\n # 当不同环境有不同的CPU或内存资源规格要求时,可以定义占位符搭配变量组使用\n # 如,设置{{ .Values.cpuLimit }}占位符,部署时云效会将占位符{{ .Values.cpuLimit }}替换成右侧设置的实际值\n resources:\n limits:\n cpu: {{ .Values.cpuLimit }}\n memory: {{ .Values.memoryLimit }}\n requests:\n cpu: {{ .Values.cpuRequest }}\n memory: {{ .Values.memoryRequest }}\n # 生命周期配置:\n #lifecycle:\n # preStop:\n # exec:\n # command: [ \"/bin/bash\", \"-c\", \"sleep 10\" ]\n # 探活配置:\n #livenessProbe:\n # initialDelaySeconds: 10\n # failureThreshold: 3\n # periodSeconds: 5\n # successThreshold: 1\n # timeoutSeconds: 2\n # httpGet:\n # scheme: HTTP\n # path: /health\n # port: 7002\n # 就绪探测配置:\n #readinessProbe:\n # initialDelaySeconds: 60\n # failureThreshold: 4\n # periodSeconds: 10\n # successThreshold: 1\n # timeoutSeconds: 3\n # httpGet:\n # scheme: HTTP\n # port: 7002\n # path: /health",
"priority": 2,
"type": "KUBERNETES"
}
],
"groupNameMap": {},
"id": "myapp-demo@KUBERNETES"
}
}
2.5 变量组
2.5.1 新建变量组
Headers
{
"X-AppStack-Event": "VariableGroup",
"X-AppStack-Action": "Create",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "2704eec852c6496293fbbd57a3756769",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "60d54f3daccf2bbd6659f3ad",
"time": "2024-07-29T07:00:28.327+00:00",
"objectKind": "VariableGroup",
"objectAttributes": {
"name": "test-vars",
"displayName": "测试环境变量组",
"vars": [],
"id": "test-vars"
}
}
2.5.2 变量组更新
Headers
{
"X-AppStack-Event": "VariableGroup",
"X-AppStack-Action": "Update",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "a8488254b29d4b8e97c2f8b45b84f14b",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "60d54f3daccf2bbd6659f3ad",
"time": "2024-07-29T07:02:23.656+00:00",
"objectKind": "VariableGroup",
"objectAttributes": {
"name": "test-vars",
"displayName": "测试环境变量组",
"vars": [
{
"key": "key1",
"value": "value1",
"description": "这是变量1"
},
{
"key": "key2",
"value": "value2",
"description": "这是变量2"
}
],
"id": "test-vars"
}
}
2.5.3 删除变量组
Headers
{
"X-AppStack-Event": "VariableGroup",
"X-AppStack-Action": "Delete",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "34483737e03746d6a0e60f5b767a9f24",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "60d54f3daccf2bbd6659f3ad",
"time": "2024-07-29T07:03:40.665+00:00",
"objectKind": "VariableGroup",
"objectAttributes": {
"name": "test-vars",
"displayName": "测试环境变量组",
"vars": [
{
"key": "key1",
"value": "value1",
"description": "这是变量1"
},
{
"key": "key2",
"value": "value2",
"description": "这是变量2"
}
],
"id": "test-vars"
}
}
2.6 变更
2.6.1 新建变更
Headers
{
"X-AppStack-Event": "ChangeRequest",
"X-AppStack-Action": "Create",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "8379c68b025c4dd0bf04dc8279bdad3e",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "630de053ca912501d6c92e10",
"time": "2024-07-29T11:58:33.961+00:00",
"objectKind": "ChangeRequest",
"objectAttributes": {
"sn": "c7ae55830f9043cd971f872282bdbc2e",
"appName": "myapp-demo",
"state": "DEVELOPING",
"name": "日常变更001",
"type": "APP",
"appCodeRepoSn": "0f90e45370474414bd63bf2a9908042d",
"appCodeRepo": {
"sn": "0f90e45370474414bd63bf2a9908042d",
"appName": "myapp-demo",
"name": "myapp-demo",
"repoUrl": "https://codeup.aliyun.com/630de053ca912501d6c92e10/myapp-demo.git",
"identifier": "myapp_demo",
"repoContext": {
"repoUrl": "https://codeup.aliyun.com/630de053ca912501d6c92e10/myapp-demo.git",
"projectId": "4536398",
"defaultBranch": "master",
"repoType": "CODEUP"
},
"connectionConfig": {
"connectionId": "641004",
"connectionType": "FLOW"
}
},
"branch": "feature/20240729_001",
"ownerId": "646dabc05ccc4ad1bc2a9e2f",
"originBranch": "master",
"originBranchRevision": "2d26ea0ada1317ce95ef0c5307c4bc234621e94e",
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722254314000,
"gmtModified": 1722254314000,
"extInfo": {
"repoUrl": "https://codeup.aliyun.com/630de053ca912501d6c92e10/myapp-demo.git",
"repoType": "CODEUP",
"appCodeRepo": {
"sn": "0f90e45370474414bd63bf2a9908042d",
"appName": "myapp-demo",
"name": "myapp-demo",
"repoUrl": "https://codeup.aliyun.com/630de053ca912501d6c92e10/myapp-demo.git",
"identifier": "myapp_demo",
"repoContext": {
"repoUrl": "https://codeup.aliyun.com/630de053ca912501d6c92e10/myapp-demo.git",
"projectId": "4536398",
"defaultBranch": "master",
"repoType": "CODEUP"
},
"connectionConfig": {
"connectionId": "641004",
"connectionType": "FLOW"
}
},
"autoDeleteBranchWhenEnd": false
},
"id": "c7ae55830f9043cd971f872282bdbc2e"
}
}
2.6.2 变更状态更新
Headers
{
"X-AppStack-Event": "ChangeRequest",
"X-AppStack-Action": "StatusUpdate",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "db926f9a92d64884b50401f7a19f8aa4",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "630de053ca912501d6c92e10",
"time": "2024-07-29T12:00:53.660+00:00",
"objectKind": "ChangeRequest",
"objectAttributes": {
"sn": "c7ae55830f9043cd971f872282bdbc2e",
"appName": "myapp-demo",
"state": "INTEGRATING",
"name": "日常变更001",
"type": "APP",
"appCodeRepoSn": "0f90e45370474414bd63bf2a9908042d",
"appCodeRepo": {
"sn": "0f90e45370474414bd63bf2a9908042d",
"appName": "myapp-demo",
"name": "myapp-demo",
"repoUrl": "https://codeup.aliyun.com/630de053ca912501d6c92e10/myapp-demo.git",
"identifier": "myapp_demo",
"repoContext": {
"repoUrl": "https://codeup.aliyun.com/630de053ca912501d6c92e10/myapp-demo.git",
"projectId": "4536398",
"defaultBranch": "master",
"repoType": "CODEUP"
},
"connectionConfig": {
"connectionId": "641004",
"connectionType": "FLOW"
}
},
"branch": "feature/20240729_001",
"ownerId": "646dabc05ccc4ad1bc2a9e2f",
"originBranch": "master",
"originBranchRevision": "2d26ea0ada1317ce95ef0c5307c4bc234621e94e",
"creatorId": "646dabc05ccc4ad1bc2a9e2f",
"gmtCreate": 1722254314000,
"gmtModified": 1722254454000,
"extInfo": {
"repoUrl": "https://codeup.aliyun.com/630de053ca912501d6c92e10/myapp-demo.git",
"repoType": "CODEUP",
"appCodeRepo": {
"sn": "0f90e45370474414bd63bf2a9908042d",
"appName": "myapp-demo",
"name": "myapp-demo",
"repoUrl": "https://codeup.aliyun.com/630de053ca912501d6c92e10/myapp-demo.git",
"identifier": "myapp_demo",
"repoContext": {
"repoUrl": "https://codeup.aliyun.com/630de053ca912501d6c92e10/myapp-demo.git",
"projectId": "4536398",
"defaultBranch": "master",
"repoType": "CODEUP"
},
"connectionConfig": {
"connectionId": "641004",
"connectionType": "FLOW"
}
},
"autoDeleteBranchWhenEnd": false
},
"id": "c7ae55830f9043cd971f872282bdbc2e"
}
}
2.7 研发阶段
2.7.1 研发流程阶段运行状态更新
Headers
{
"X-AppStack-Event": "ReleaseStageExecution",
"X-AppStack-Action": "StatusUpdate",
"X-AppStack-Token": "your-secret-token",
"X-AppStack-App": "myapp-demo"
}
Body
{
"id": "3c532fe73219406ca883a503a20e290d",
"user": {
"id": "646dabc05ccc4ad1bc2a9e2f",
"name": null,
"email": null,
"userName": null,
"staffId": null
},
"orgId": "630de053ca912501d6c92e10",
"time": "2024-07-29T12:13:36.704+00:00",
"objectKind": "ReleaseStageExecution",
"objectAttributes": {
"sn": "a2bcdeda7d3e4075bf42bca731e02998",
"releaseStageSn": "b1af381ea4f24a8e88b6963dbc6c2799",
"engineType": "FlowV1",
"engineInstanceId": "3367719:2",
"state": "RUNNING",
"context": {
"version": "v1",
"releaseStageLabels": [
{
"namespace": "default",
"name": "envType",
"value": "test",
"displayName": "环境级别",
"displayValue": "测试环境",
"extraMap": {}
}
],
"triggerMode": "MANUAL",
"startTime": null,
"endTime": null
},
"id": "a2bcdeda7d3e4075bf42bca731e02998"
}
}