Store ç åååºæ¨¡åæ¶ææå
模åå®ä½: Store æ¯ BK-CI çç åååºæ¨¡åï¼è´è´£ç®¡çæµæ°´çº¿æä»¶ï¼Atomï¼ãæµæ°´çº¿æ¨¡æ¿ï¼Templateï¼ã容å¨éåï¼Imageï¼çå¯å¤ç¨ç»ä»¶çåå¸ãå®¡æ ¸ãå®è£
ãç»è®¡çå
¨çå½å¨æç®¡çã
ä¸ãæ¨¡åæ´ä½ç»æ
1.1 忍¡ååå
src/backend/ci/core/store/
âââ api-store/ # API æ¥å£å®ä¹å±
â âââ src/main/kotlin/com/tencent/devops/store/
â âââ api/
â â âââ atom/ # æä»¶ç¸å
³æ¥å£ï¼25+ æä»¶ï¼
â â âââ common/ # éç¨æ¥å£ï¼40+ æä»¶ï¼
â â âââ container/ # 容å¨ç¸å
³æ¥å£
â â âââ image/ # éåç¸å
³æ¥å£
â â âââ template/ # 模æ¿ç¸å
³æ¥å£
â âââ constant/ # 常éåæ¶æ¯ç
â âââ pojo/ # æ°æ®å¯¹è±¡ï¼100+ æä»¶ï¼
â âââ app/ # åºç¨ç¸å
³
â âââ atom/ # æä»¶ç¸å
³
â âââ common/ # éç¨å¯¹è±¡
â âââ image/ # éåç¸å
³
â âââ template/ # 模æ¿ç¸å
³
â
âââ biz-store/ # ä¸å¡é»è¾å±
â âââ src/main/kotlin/com/tencent/devops/store/
â âââ atom/ # æä»¶ä¸å¡
â â âââ dao/ # æä»¶æ°æ®è®¿é®
â â âââ factory/ # å·¥åç±»
â â âââ resources/ # API å®ç°
â â âââ service/ # æä»¶æå¡
â âââ common/ # éç¨ä¸å¡
â â âââ dao/ # éç¨æ°æ®è®¿é®ï¼60+ æä»¶ï¼
â â âââ handler/ # å¤çå¨é¾
â â âââ resources/ # API å®ç°
â â âââ service/ # éç¨æå¡
â âââ image/ # éåä¸å¡
â âââ template/ # 模æ¿ä¸å¡
â
âââ model-store/ # æ°æ®æ¨¡åå±ï¼JOOQ çæï¼
âââ boot-store/ # Spring Boot å¯å¨æ¨¡å
1.2 Store ç»ä»¶ç±»å
| ç±»å |
æä¸¾å¼ |
说æ |
æ ¸å¿è¡¨ |
| æä»¶ï¼Atomï¼ |
ATOM |
æµæ°´çº¿å¯æ§è¡æä»¶ |
T_ATOM |
| 模æ¿ï¼Templateï¼ |
TEMPLATE |
æµæ°´çº¿æ¨¡æ¿ |
T_TEMPLATE |
| éåï¼Imageï¼ |
IMAGE |
å®¹å¨æå»ºéå |
T_IMAGE |
äºãæ ¸å¿æ¦å¿µ
2.1 æä»¶ï¼Atomï¼æ¨¡å
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æä»¶æ¨¡å â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â T_ATOMï¼æä»¶ä¸»è¡¨ï¼ â â
â â âââââââââââââââ âââââââââââââââ âââââââââââââââ â â
â â â ATOM_CODE â â NAME â â VERSION â â â
â â â (æä»¶æ è¯) â â (æä»¶åç§°) â â (çæ¬å·) â â â
â â âââââââââââââââ âââââââââââââââ âââââââââââââââ â â
â â âââââââââââââââ âââââââââââââââ âââââââââââââââ â â
â â â ATOM_STATUS â â CLASS_TYPE â â LATEST_FLAG â â â
â â â (æä»¶ç¶æ) â â (æä»¶å¤§ç±») â â (ææ°çæ¬) â â â
â â âââââââââââââââ âââââââââââââââ âââââââââââââââ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â â
â ââââââââââââââââââââââ¼âââââââââââââââââââââ â
â â¼ â¼ â¼ â
â âââââââââââââââââ âââââââââââââââââ âââââââââââââââââ â
â â T_ATOM_ENV_ â â T_ATOM_ â â T_ATOM_ â â
â â INFO â â FEATURE â â VERSION_LOG â â
â â (æ§è¡ç¯å¢ä¿¡æ¯) â â (ç¹æ§é
ç½®) â â (çæ¬æ¥å¿) â â
â âââââââââââââââââ âââââââââââââââââ âââââââââââââââââ â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
2.2 æä»¶æ ¸å¿å段
| åæ®µ |
ç±»å |
说æ |
ID |
String |
æä»¶çæ¬ IDï¼UUIDï¼ |
ATOM_CODE |
String |
æä»¶å¯ä¸æ è¯ï¼ä¸åï¼ |
NAME |
String |
æä»¶åç§° |
VERSION |
String |
çæ¬å·ï¼å¦ 1.0.0ï¼ |
ATOM_STATUS |
Int |
æä»¶ç¶æ |
CLASS_TYPE |
String |
æä»¶å¤§ç±»ï¼marketBuild çï¼ |
JOB_TYPE |
String |
éç¨ Job ç±»åï¼AGENT/AGENT_LESSï¼ |
OS |
String |
æ¯æçæä½ç³»ç» |
CLASSIFY_ID |
String |
åç±» ID |
LATEST_FLAG |
Boolean |
æ¯å¦ææ°çæ¬ |
DEFAULT_FLAG |
Boolean |
æ¯å¦é»è®¤æä»¶ |
PUBLISHER |
String |
åå¸è
|
REPOSITORY_HASH_ID |
String |
代ç åº HashId |
2.3 æä»¶ç¶ææµè½¬
enum class AtomStatusEnum(val status: Int) {
INIT(0),
COMMITTING(1),
BUILDING(2),
BUILD_FAIL(3),
TESTING(4),
AUDITING(5),
AUDIT_REJECT(6),
RELEASED(7),
GROUNDING_SUSPENSION(8),
UNDERCARRIAGING(9),
UNDERCARRIAGED(10),
}
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æä»¶ç¶ææµè½¬å¾ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â â
â INIT ââ⺠COMMITTING ââ⺠BUILDING ââ⺠TESTING ââ⺠AUDITING â
â â â â
â â¼ â¼ â
â BUILD_FAIL AUDIT_REJECT â
â â â
â â¼ â
â RELEASED â
â â â
â â¼ â
â UNDERCARRIAGING â
â â â
â â¼ â
â UNDERCARRIAGED â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
2.4 æä»¶åç±»
enum class AtomTypeEnum(val type: Int) {
SELF_DEVELOPED(0),
THIRD_PARTY(1),
}
enum class JobTypeEnum(val type: String) {
AGENT("AGENT"),
AGENT_LESS("AGENT_LESS"),
}
ä¸ãæ ¸å¿æ°æ®åºè¡¨
3.1 æä»¶ç¸å
³è¡¨
| 表å |
说æ |
æ ¸å¿å段 |
T_ATOM |
æä»¶ä¸»è¡¨ |
ATOM_CODE, NAME, VERSION, ATOM_STATUS, LATEST_FLAG |
T_ATOM_ENV_INFO |
æä»¶æ§è¡ç¯å¢ |
ATOM_ID, PKG_PATH, LANGUAGE, TARGET |
T_ATOM_FEATURE |
æä»¶ç¹æ§ |
ATOM_CODE, VISIBILITY_LEVEL, YAML_FLAG, QUALITY_FLAG |
T_ATOM_BUILD_INFO |
æä»¶æå»ºä¿¡æ¯ |
LANGUAGE, SCRIPT, SAMPLE_PROJECT_PATH |
T_ATOM_VERSION_LOG |
çæ¬æ¥å¿ |
ATOM_ID, RELEASE_TYPE, CONTENT |
T_ATOM_LABEL_REL |
æä»¶æ ç¾å
³è |
ATOM_ID, LABEL_ID |
T_ATOM_OFFLINE |
æä»¶ä¸æ¶è®°å½ |
ATOM_CODE, EXPIRE_TIME, STATUS |
3.2 模æ¿ç¸å
³è¡¨
| 表å |
说æ |
æ ¸å¿å段 |
T_TEMPLATE |
模æ¿ä¸»è¡¨ |
TEMPLATE_CODE, TEMPLATE_NAME, VERSION, TEMPLATE_STATUS |
T_TEMPLATE_CATEGORY_REL |
模æ¿åç±»å
³è |
TEMPLATE_ID, CATEGORY_ID |
T_TEMPLATE_LABEL_REL |
æ¨¡æ¿æ ç¾å
³è |
TEMPLATE_ID, LABEL_ID |
3.3 éåç¸å
³è¡¨
| 表å |
说æ |
æ ¸å¿å段 |
T_IMAGE |
éå主表 |
IMAGE_CODE, IMAGE_NAME, VERSION, IMAGE_STATUS |
T_IMAGE_CATEGORY_REL |
éååç±»å
³è |
IMAGE_ID, CATEGORY_ID |
T_IMAGE_LABEL_REL |
éåæ ç¾å
³è |
IMAGE_ID, LABEL_ID |
3.4 éç¨è¡¨
| 表å |
说æ |
T_CLASSIFY |
å类表 |
T_CATEGORY |
èç´è¡¨ |
T_LABEL |
æ ç¾è¡¨ |
T_STORE_MEMBER |
ç»ä»¶æå表 |
T_STORE_PROJECT_REL |
ç»ä»¶é¡¹ç®å
³è表 |
T_STORE_COMMENT |
è¯è®ºè¡¨ |
T_STORE_COMMENT_REPLY |
è¯è®ºåå¤è¡¨ |
T_STORE_COMMENT_PRAISE |
è¯è®ºç¹èµè¡¨ |
T_STORE_STATISTICS |
ç»è®¡è¡¨ |
T_STORE_APPROVE |
审æ¹è¡¨ |
T_STORE_SENSITIVE_API |
ææ API 表 |
T_STORE_SENSITIVE_CONF |
ææé
置表 |
3.5 容å¨ç¼è¯ç¯å¢è¡¨
| 表å |
说æ |
T_APPS |
ç¼è¯ç¯å¢ä¿¡æ¯è¡¨ |
T_APP_ENV |
ç¼è¯ç¯å¢åé表 |
T_APP_VERSION |
ç¼è¯ç¯å¢çæ¬è¡¨ |
T_CONTAINER |
容å¨ä¿¡æ¯è¡¨ |
T_BUILD_RESOURCE |
æå»ºèµæºè¡¨ |
åãå屿¶æ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 请æ±å
¥å£ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â API å± (api-store) â
â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â
â âUserMarket â âServiceAtom â âUserTemplate â âUserImage â â
â âAtomResource â âResource â âResource â âResource â â
â â(ç¨æ·æä»¶ç®¡ç) â â(æå¡é´è°ç¨) â â(模æ¿ç®¡ç) â â(éå管ç) â â
â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â
â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â
â âUserAtom â âOpAtom â âUserStore â â
â âReleaseRes â âResource â âMemberRes â â
â â(æä»¶åå¸) â â(è¿ç»´ç®¡ç) â â(æå管ç) â â
â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ä¸å¡å± (biz-store) â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â æä»¶æå¡ (atom/service/) â â
â â MarketAtomService - æä»¶å¸åºæå¡ â â
â â AtomReleaseService - æä»¶åå¸æå¡ â â
â â AtomService - æä»¶åºç¡æå¡ â â
â â MarketAtomEnvService - æä»¶ç¯å¢æå¡ â â
â â MarketAtomArchiveService - æä»¶å½æ¡£æå¡ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â éç¨æå¡ (common/service/) â â
â â StoreCommentService - è¯è®ºæå¡ â â
â â StoreMemberService - æå管çæå¡ â â
â â StoreProjectService - 项ç®å
³èæå¡ â â
â â StoreStatisticService - ç»è®¡æå¡ â â
â â StoreApproveService - å®¡æ¹æå¡ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â å¤çå¨é¾ (common/handler/) â â
â â StoreCreateHandlerChain - å建å¤çå¨é¾ â â
â â StoreUpdateHandlerChain - æ´æ°å¤çå¨é¾ â â
â â StoreDeleteHandlerChain - å é¤å¤çå¨é¾ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â DAO å± (biz-store/dao) â
â AtomDao (59KB) | MarketAtomDao (31KB) | StoreProjectRelDao (25KB) â
â StoreBaseQueryDao (20KB) | MarketAtomEnvInfoDao | ... â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æ°æ®å± (model-store + MySQL) â
â æ°æ®åºï¼devops_ci_storeï¼å
± 50+ å¼ è¡¨ï¼ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
äºãæ ¸å¿ç±»éæ¥
5.1 API æ¥å£å±
| ç±»å |
è·¯å¾åç¼ |
èè´£ |
UserMarketAtomResource |
/user/market/atom |
ç¨æ·æä»¶å¸åºæä½ |
UserAtomReleaseResource |
/user/market/atom/release |
æä»¶åå¸ |
ServiceAtomResource |
/service/atoms |
æå¡é´æä»¶æ¥è¯¢ |
ServiceMarketAtomResource |
/service/market/atom |
æå¡é´å¸åºæä»¶ |
OpAtomResource |
/op/market/atom |
è¿ç»´æä»¶ç®¡ç |
UserTemplateResource |
/user/market/template |
模æ¿ç®¡ç |
UserMarketImageResource |
/user/market/image |
éå管ç |
UserStoreMemberResource |
/user/store/member |
æå管ç |
5.2 Service å±
| ç±»å |
èè´£ |
MarketAtomService |
æä»¶å¸åºæ ¸å¿æå¡ |
AtomReleaseService |
æä»¶å叿µç¨ |
AtomService |
æä»¶åºç¡æä½ |
MarketAtomEnvService |
æä»¶æ§è¡ç¯å¢ |
MarketAtomArchiveService |
æä»¶å½æ¡£ |
AtomCooperationService |
æä»¶åä½ |
AtomNotifyService |
æä»¶éç¥ |
5.3 DAO å±
| ç±»å |
æä»¶å¤§å° |
èè´£ |
AtomDao |
59KB |
æä»¶ä¸»è¡¨è®¿é®ï¼æå¤§ï¼ |
MarketAtomDao |
31KB |
å¸åºæä»¶è®¿é® |
StoreProjectRelDao |
25KB |
项ç®å
³èè®¿é® |
StoreBaseQueryDao |
20KB |
åºç¡æ¥è¯¢ |
MarketAtomEnvInfoDao |
13KB |
æä»¶ç¯å¢è®¿é® |
å
ãæ ¸å¿æµç¨
6.1 æä»¶å叿µç¨
å¼åè
æäº¤åå¸è¯·æ±
â
â¼
UserAtomReleaseResource.createAtom()
â
â¼
AtomReleaseService.handleAtomRelease()
â
âââº åæ°æ ¡éª
â âââº æ ¡éªæä»¶ä»£ç å¯ä¸æ§
â âââº æ ¡éªçæ¬å·æ ¼å¼
â âââº æ ¡éªä»£ç åºæé
â
ââ⺠å建æä»¶è®°å½
â ââ⺠atomDao.create()
â âââº ç¶æè®¾ä¸º INIT
â
ââ⺠触åæå»ºæµæ°´çº¿
â ââ⺠è°ç¨ Process 模åæå»ºæä»¶å
â
ââ⺠æå»ºå®æåè°
â âââº æ´æ°ç¶æä¸º TESTING
â ââ⺠ä¸ä¼ æä»¶å
å°å¶ååº
â
ââ⺠æäº¤å®¡æ ¸
â âââº ç¶æè®¾ä¸º AUDITING
â
âââº å®¡æ ¸éè¿
âââº ç¶æè®¾ä¸º RELEASED
âââº æ´æ° LATEST_FLAG
6.2 æä»¶å®è£
æµç¨
ç¨æ·å®è£
æä»¶å°é¡¹ç®
â
â¼
UserMarketAtomResource.installAtom()
â
â¼
MarketAtomService.installAtom()
â
ââ⺠æéæ ¡éª
â âââº æ£æ¥ç¨æ·æ¯å¦æé¡¹ç®æé
â
âââº æ£æ¥æä»¶å¯è§æ§
â âââº æ£æ¥é¡¹ç®æ¯å¦å¨å¯è§èå´å
â
ââ⺠å建å
³èè®°å½
â ââ⺠storeProjectRelDao.create()
â
âââº æ´æ°ç»è®¡æ°æ®
ââ⺠å¢å å®è£
é
6.3 å¤çå¨é¾æ¨¡å¼
Store 模å使ç¨è´£ä»»é¾æ¨¡å¼å¤çç»ä»¶çåå»ºãæ´æ°ãå é¤ï¼
class StoreCreateHandlerChain {
private val handlers = listOf(
StoreCreateParamCheckHandler,
StoreCreatePreBusHandler,
StoreCreateDataPersistHandler,
StoreCreatePostBusHandler
)
fun handle(context: StoreContext) {
handlers.forEach { it.handle(context) }
}
}
ä¸ãä¸å
¶ä»æ¨¡åçå
³ç³»
7.1 ä¾èµå
³ç³»
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Store 模åä¾èµå
³ç³» â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â â
â âââââââââââââââââ â
â â store â â
â âââââââââ¬ââââââââ â
â â â
â ââââââââââââââââââââ¼âââââââââââââââââââ â
â â¼ â¼ â¼ â
â âââââââââââââ âââââââââââââ âââââââââââââ â
â â project â ârepository â âartifactoryâ â
â â (项ç®ä¿¡æ¯) â â (代ç åº) â â (å¶ååº) â â
â âââââââââââââ âââââââââââââ âââââââââââââ â
â â
â 被ä¾èµï¼ â
â - processï¼æµæ°´çº¿ä½¿ç¨æä»¶ï¼ â
â - workerï¼æå»ºæºæ§è¡æä»¶ï¼ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
7.2 æå¡é´è°ç¨ç¤ºä¾
client.get(ServiceAtomResource::class).getAtomByCode(
atomCode = atomCode,
username = userId
)
client.get(ServiceMarketAtomEnvResource::class).getAtomEnv(
projectCode = projectId,
atomCode = atomCode,
atomVersion = version
)
client.get(ServiceMarketAtomResource::class).getProjectElements(
projectCode = projectId
)
å
«ãæä»¶å¼åè§è
8.1 æä»¶ç®å½ç»æ
my-atom/
âââ task.json # æä»¶é
ç½®æä»¶
âââ README.md # æä»¶è¯´æ
âââ src/ # æºä»£ç
â âââ main.py # å
¥å£æä»¶
âââ requirements.txt # Python ä¾èµ
âââ logo.png # æä»¶å¾æ
8.2 task.json é
ç½®
{
"atomCode": "myAtom",
"execution": {
"language": "python",
"packagePath": "src/",
"target": "main.py"
},
"input": {
"param1": {
"label": "åæ°1",
"type": "vuex-input",
"required": true
}
},
"output": {
"output1": {
"type": "string",
"description": "è¾åºåæ°"
}
}
}
8.3 æä»¶å¼åè¯è¨æ¯æ
| è¯è¨ |
说æ |
| Python |
æ¨èï¼æå®åç SDK |
| NodeJS |
æ¯æ |
| Java |
æ¯æ |
| Golang |
æ¯æ |
ä¹ãå¼åè§è
9.1 æ°å¢ç»ä»¶ç±»å
- å¨
StoreTypeEnum æ·»å æ°ç±»å
- å建对åºç主表åå
³è表
- å建 DAOãServiceãResource å±ä»£ç
- å¨å¤çå¨é¾ä¸æ³¨åæ°ç±»åçå¤çå¨
9.2 æä»¶æ¥è¯¢ç¤ºä¾
val atom = atomDao.getLatestAtomByCode(
dslContext = dslContext,
atomCode = atomCode
)
val atoms = atomDao.getProjectAtoms(
dslContext = dslContext,
projectCode = projectId,
classifyCode = classifyCode
)
val envInfo = marketAtomEnvInfoDao.getMarketAtomEnvInfo(
dslContext = dslContext,
atomId = atomId
)
åã常è§é®é¢
Q: atomCode å atomId çåºå«ï¼
A: atomCode æ¯æä»¶å¯ä¸æ è¯ï¼ä¸åï¼ï¼atomId æ¯å
·ä½çæ¬ç IDï¼æ¯ä¸ªçæ¬ä¸åï¼ã
Q: å¦ä½å¤ææä»¶æ¯å¦å¯ç¨ï¼
A: æ£æ¥ ATOM_STATUS = 7ï¼RELEASEDï¼ä¸ LATEST_FLAG = trueã
Q: æä»¶å¦ä½å
³èå°é¡¹ç®ï¼
A: éè¿ T_STORE_PROJECT_REL 表å
³èï¼STORE_CODE åå¨ atomCodeã
Q: å¦ä½è·åæä»¶çæ§è¡ç¯å¢ï¼
A: æ¥è¯¢ T_ATOM_ENV_INFO è¡¨ï¼æ ¹æ® ATOM_ID è·å PKG_PATHãTARGET çä¿¡æ¯ã
çæ¬: 1.0.0 | æ´æ°æ¥æ: 2025-12-11