dispatch-module-architecture
26
总安装量
25
周安装量
#14199
全站排名
安装命令
npx skills add https://github.com/tencentblueking/bk-ci --skill dispatch-module-architecture
Agent 安装分布
gemini-cli
16
opencode
16
claude-code
16
codex
14
cursor
14
antigravity
13
Skill 文档
Dispatch æå»ºè°åº¦æ¨¡åæ¶ææå
模åå®ä½: Dispatch æ¯ BK-CI çæå»ºè°åº¦æ¨¡åï¼è´è´£æ¥æ¶æµæ°´çº¿çæå»ºä»»å¡ï¼å°ä»»å¡ååå°åéçæå»ºæºï¼ç¬¬ä¸æ¹æå»ºæºãDocker 容å¨ãKubernetes Podï¼ä¸æ§è¡ã
ä¸ãæ¨¡åæ´ä½ç»æ
1.1 忍¡ååå
src/backend/ci/core/dispatch/
âââ api-dispatch/ # API æ¥å£å®ä¹å±
â âââ src/main/kotlin/com/tencent/devops/dispatch/
â âââ api/ # REST API æ¥å£
â âââ constants/ # 常éå®ä¹
â âââ pojo/ # æ°æ®å¯¹è±¡
â âââ enums/ # æä¸¾
â âââ redis/ # Redis æ°æ®ç»æ
â âââ thirdpartyagent/ # ç¬¬ä¸æ¹æå»ºæºç¸å
³
â
âââ api-dispatch-docker/ # Docker è°åº¦ API
âââ api-dispatch-kubernetes/ # Kubernetes è°åº¦ API
â
âââ biz-dispatch/ # ä¸å¡é»è¾å±
â âââ src/main/kotlin/com/tencent/devops/dispatch/
â âââ configuration/ # é
置类
â âââ controller/ # API å®ç°
â âââ cron/ # 宿¶ä»»å¡
â âââ dao/ # æ°æ®è®¿é®å±
â âââ exception/ # å¼å¸¸å®ä¹
â âââ listener/ # æ¶æ¯çå¬
â âââ service/ # ä¸å¡æå¡
â â âââ jobquota/ # ä½ä¸é
颿å¡
â â âââ tpaqueue/ # ç¬¬ä¸æ¹æå»ºæºéå
â âââ utils/ # å·¥å
·ç±»
â
âââ biz-dispatch-docker/ # Docker è°åº¦ä¸å¡
âââ biz-dispatch-kubernetes/ # Kubernetes è°åº¦ä¸å¡
âââ common-dispatch-kubernetes/ # Kubernetes éç¨ç»ä»¶
âââ model-dispatch/ # æ°æ®æ¨¡åå±
âââ boot-dispatch/ # Spring Boot å¯å¨æ¨¡å
1.2 è°åº¦ç±»å
| ç±»å | 说æ | å®ç°æ¨¡å |
|---|---|---|
| ç¬¬ä¸æ¹æå»ºæº | ç¨æ·èªææå»ºæº | biz-dispatch |
| Docker æå»ºæº | å ¬å ± Docker å®¹å¨ | biz-dispatch-docker |
| Kubernetes | K8s Pod æå»º | biz-dispatch-kubernetes |
äºãæ ¸å¿æ¦å¿µ
2.1 æå»ºä»»å¡ç¶æ
enum class PipelineTaskStatus(val status: Int) {
QUEUE(0), // æéä¸
RUNNING(1), // è¿è¡ä¸
DONE(2), // 已宿
FAILURE(3), // 失败
CANCEL(4), // åæ¶
}
2.2 æå»ºæºç±»å
enum class JobQuotaVmType(val type: String) {
DOCKER("DOCKER"), // Docker æå»ºæº
THIRD_PARTY_AGENT("THIRD_PARTY"), // ç¬¬ä¸æ¹æå»ºæº
KUBERNETES("KUBERNETES"), // K8s æå»ºæº
AGENTLESS("AGENTLESS"), // æ ç¼è¯ç¯å¢
}
2.3 ç¬¬ä¸æ¹æå»ºæºä»»å¡ç±»å
enum class BuildJobType(val type: String) {
ALL("ALL"), // ææç±»å
DOCKER("DOCKER"), // Docker æå»º
BINARY("BINARY"), // äºè¿å¶æå»º
}
ä¸ãæ ¸å¿æ°æ®åºè¡¨
3.1 è°åº¦è®°å½è¡¨
| 表å | 说æ | æ ¸å¿å段 |
|---|---|---|
T_DISPATCH_PIPELINE_BUILD |
æµæ°´çº¿æå»ºè°åº¦è®°å½ | PROJECT_ID, PIPELINE_ID, BUILD_ID, VM_SEQ_ID, STATUS |
T_DISPATCH_THIRDPARTY_AGENT_BUILD |
ç¬¬ä¸æ¹æå»ºæºä»»å¡ | PROJECT_ID, AGENT_ID, BUILD_ID, STATUS, WORKSPACE |
T_DISPATCH_PIPELINE_DOCKER_BUILD |
Docker æå»ºä»»å¡ | BUILD_ID, VM_SEQ_ID, STATUS, DOCKER_IP, CONTAINER_ID |
T_DISPATCH_PIPELINE_DOCKER_TASK |
Docker ä»»å¡è¯¦æ | PROJECT_ID, AGENT_ID, IMAGE_NAME, STATUS |
3.2 é é¢ç®¡ç表
| 表å | 说æ | æ ¸å¿å段 |
|---|---|---|
T_DISPATCH_QUOTA_PROJECT |
项ç®é é¢ | PROJECT_ID, VM_TYPE, RUNNING_JOBS_MAX, RUNNING_TIME_PROJECT_MAX |
T_DISPATCH_QUOTA_SYSTEM |
ç³»ç»é é¢ | VM_TYPE, RUNNING_JOBS_MAX_SYSTEM, RUNNING_TIME_JOB_MAX |
T_DISPATCH_RUNNING_JOBS |
è¿è¡ä¸çä»»å¡ | PROJECT_ID, VM_TYPE, BUILD_ID, AGENT_START_TIME |
3.3 éå管ç表
| 表å | 说æ |
|---|---|
T_DISPATCH_THIRDPARTY_AGENT_QUEUE |
ç¬¬ä¸æ¹æå»ºæºä»»å¡éå |
T_DISPATCH_PIPELINE_DOCKER_DEBUG |
Docker è°è¯ä¼è¯ |
3.4 åæ®µè¯´æ
â ï¸ éè¦:
PROJECT_IDæ¯T_PROJECT.english_name
åãå屿¶æ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Process 模å â
â (æµæ°´çº¿å¼æåèµ·è°åº¦è¯·æ±) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼ (MQ æ¶æ¯)
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Dispatch 模å â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â æ¶æ¯çå¬å± (listener/) â â
â â ThirdPartyBuildListener - ç¬¬ä¸æ¹æå»ºæºä»»å¡çå¬ â â
â â TPAQueueListener - ç¬¬ä¸æ¹æå»ºæºéåçå¬ â â
â â TPAMonitorListener - ç¬¬ä¸æ¹æå»ºæºçæ§çå¬ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â æ ¸å¿æå¡å± (service/) â â
â â ThirdPartyDispatchService (45KB) - ç¬¬ä¸æ¹æå»ºæºè°åº¦æ ¸å¿ â â
â â ThirdPartyAgentService (38KB) - ç¬¬ä¸æ¹æå»ºæºç®¡ç â â
â â TPAQueueService - ä»»å¡éåæå¡ â â
â â TPAEnvQueueService - ç¯å¢éåæå¡ â â
â â JobQuotaManagerService - é
é¢ç®¡çæå¡ â â
â â AuthBuildService - æå»ºè®¤è¯æå¡ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â DAO å± (dao/) â â
â â ThirdPartyAgentBuildDao (17KB) - ç¬¬ä¸æ¹æå»ºä»»å¡è®¿é® â â
â â RunningJobsDao - è¿è¡ä»»å¡è®¿é® â â
â â JobQuotaProjectDao - 项ç®é
é¢è®¿é® â â
â â TPAQueueDao - éåè®¿é® â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æå»ºæº (Agent) â
â (ç¬¬ä¸æ¹æå»ºæº / Docker / K8s) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
äºãæ ¸å¿ç±»éæ¥
5.1 API æ¥å£å±
| ç±»å | è·¯å¾åç¼ | èè´£ |
|---|---|---|
BuildAgentBuildResource |
/build/agent |
æå»ºæºä¸è°åº¦æå¡äº¤äº |
ServiceAgentResource |
/service/agent |
æå¡é´æå»ºæºæä½ |
ServiceDispatchJobResource |
/service/dispatch/job |
æå¡é´ä»»å¡è°åº¦ |
OpJobQuotaProjectResource |
/op/quota/project |
è¿ç»´é¡¹ç®é é¢ç®¡ç |
OpJobQuotaSystemResource |
/op/quota/system |
è¿ç»´ç³»ç»é é¢ç®¡ç |
ExternalAuthBuildResource |
/external/auth |
å¤é¨æå»ºè®¤è¯ |
5.2 Service å±
| ç±»å | æä»¶å¤§å° | èè´£ |
|---|---|---|
ThirdPartyDispatchService |
45KB | ç¬¬ä¸æ¹æå»ºæºè°åº¦æ ¸å¿ï¼æå¤§ï¼ |
ThirdPartyAgentService |
38KB | ç¬¬ä¸æ¹æå»ºæºç®¡ç |
TPAEnvQueueService |
23KB | ç¯å¢éåæå¡ |
JobQuotaBusinessService |
14KB | é é¢ä¸å¡æå¡ |
TPAQueueService |
13KB | ä»»å¡éåæå¡ |
TPASingleQueueService |
13KB | åéåæå¡ |
ThirdPartyAgentMonitorService |
13KB | æå»ºæºçæ§ |
ThirdPartyAgentDockerService |
13KB | Docker æå»ºæå¡ |
5.3 DAO å±
| ç±»å | æä»¶å¤§å° | èè´£ |
|---|---|---|
ThirdPartyAgentBuildDao |
17KB | ç¬¬ä¸æ¹æå»ºä»»å¡è®¿é® |
RunningJobsDao |
8KB | è¿è¡ä»»å¡è®¿é® |
TPAQueueDao |
6KB | éåè®¿é® |
DispatchPipelineBuildDao |
5KB | æµæ°´çº¿æå»ºè®¿é® |
JobQuotaSystemDao |
5KB | ç³»ç»é é¢è®¿é® |
JobQuotaProjectDao |
5KB | 项ç®é é¢è®¿é® |
å ãæ ¸å¿æµç¨
6.1 ç¬¬ä¸æ¹æå»ºæºè°åº¦æµç¨
Process 模ååéè°åº¦æ¶æ¯
â
â¼
ThirdPartyBuildListener.onBuildStart()
â
â¼
ThirdPartyDispatchService.dispatch()
â
âââº æ£æ¥é
é¢
â ââ⺠JobQuotaManagerService.checkJobQuota()
â
âââº éæ©æå»ºæº
â âââº æ ¹æ®ç¯å¢ ID çé
â âââº æ ¹æ® Agent ç¶æçé
â ââ⺠è´è½½åè¡¡éæ©
â
ââ⺠å建è°åº¦è®°å½
â ââ⺠ThirdPartyAgentBuildDao.create()
â
ââ⺠éç¥ Agent
ââ⺠Redis åå¸ä»»å¡æ¶æ¯
6.2 Agent é¢å任塿µç¨
Agent 轮询请æ±ä»»å¡
â
â¼
BuildAgentBuildResource.claimTask()
â
â¼
ThirdPartyAgentService.claimTask()
â
ââ⺠éªè¯ Agent 身份
â âââº æ£æ¥ Agent ID å Secret Key
â
ââ⺠æ¥è¯¢å¾
æ§è¡ä»»å¡
â ââ⺠ThirdPartyAgentBuildDao.getQueueTask()
â
âââº æ´æ°ä»»å¡ç¶æ
â ââ⺠status = RUNNING
â
ââ⺠è¿åä»»å¡ä¿¡æ¯
ââ⺠ThirdPartyBuildInfo
6.3 æå»ºå®ææµç¨
Agent æ¥åæå»ºå®æ
â
â¼
BuildAgentBuildResource.finishTask()
â
â¼
ThirdPartyAgentService.finishTask()
â
âââº æ´æ°ä»»å¡ç¶æ
â ââ⺠status = DONE / FAILURE
â
âââº éæ¾é
é¢
â ââ⺠JobQuotaManagerService.releaseQuota()
â
ââ⺠éç¥ Process 模å
ââ⺠åéæå»ºå®æäºä»¶
ä¸ãé é¢ç®¡ç
7.1 é é¢ç»´åº¦
| 维度 | 说æ |
|---|---|
| ç³»ç»çº§ | å ¨å±æå¤§å¹¶åæ°ãå任塿大æ¶é¿ |
| 项ç®çº§ | é¡¹ç®æå¤§å¹¶åæ°ãé¡¹ç®æå¤§è¿è¡æ¶é¿ |
| æå»ºæºç±»å | æ Docker/ç¬¬ä¸æ¹/K8s åå«éå¶ |
7.2 é 颿£æ¥
// æ£æ¥é
颿¯å¦è¶³å¤
fun checkJobQuota(
projectId: String,
vmType: JobQuotaVmType,
buildId: String
): Boolean {
// 1. æ£æ¥ç³»ç»çº§é
é¢
val systemQuota = jobQuotaSystemDao.get(vmType)
val systemRunning = runningJobsDao.countByVmType(vmType)
if (systemRunning >= systemQuota.runningJobsMax) {
return false
}
// 2. æ£æ¥é¡¹ç®çº§é
é¢
val projectQuota = jobQuotaProjectDao.get(projectId, vmType)
val projectRunning = runningJobsDao.countByProject(projectId, vmType)
if (projectRunning >= projectQuota.runningJobsMax) {
return false
}
return true
}
å «ãä¸å ¶ä»æ¨¡åçå ³ç³»
8.1 ä¾èµå ³ç³»
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Dispatch 模åä¾èµå
³ç³» â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â â
â âââââââââââââ â
â â process â ââââââ⺠åéè°åº¦æ¶æ¯ â
â âââââââââââââ â
â â â
â â¼ â
â âââââââââââââ â
â â dispatch â â
â âââââââ¬ââââââ â
â â â
â âââââââ⺠project (项ç®ä¿¡æ¯) â
â âââââââ⺠environment (æå»ºæºä¿¡æ¯) â
â âââââââ⺠auth (æéæ ¡éª) â
â â
â 被ä¾èµï¼ â
â - agentï¼æå»ºæºé¢åä»»å¡ï¼ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
8.2 æå¡é´è°ç¨ç¤ºä¾
// Process æ¨¡åæ¥è¯¢è°åº¦ç¶æ
client.get(ServiceDispatchJobResource::class).getDispatchJob(
projectId = projectId, // english_name
pipelineId = pipelineId,
buildId = buildId,
vmSeqId = vmSeqId
)
// Environment 模åè·å Agent ä¿¡æ¯
client.get(ServiceThirdPartyAgentResource::class).getAgentById(
projectId = projectId,
agentId = agentId
)
ä¹ãå¼åè§è
9.1 æ°å¢è°åº¦ç±»å
- å¨
JobQuotaVmTypeæ·»å æ°ç±»å - å建对åºçè°åº¦æå¡å®ç°
- å¨é é¢è¡¨ä¸æ·»å æ°ç±»åçé ç½®
- å®ç°ä»»å¡åååç¶æç®¡çé»è¾
9.2 è°åº¦è®°å½æ¥è¯¢ç¤ºä¾
// æ¥è¯¢æå»ºä»»å¡
val task = thirdPartyAgentBuildDao.get(
dslContext = dslContext,
buildId = buildId,
vmSeqId = vmSeqId
)
// æ¥è¯¢ Agent çè¿è¡ä»»å¡
val runningTasks = thirdPartyAgentBuildDao.listByAgentId(
dslContext = dslContext,
agentId = agentId,
status = PipelineTaskStatus.RUNNING.status
)
åã常è§é®é¢
Q: å¦ä½éæ©æå»ºæºï¼ A: æ ¹æ®ç¯å¢ IDãAgent ç¶æãè´è½½æ åµç»¼åéæ©ï¼ä¼å éæ©ç©ºé²ç Agentã
Q: é é¢ä¸è¶³æ¶ä»»å¡ä¼ææ ·ï¼ A: ä»»å¡ä¼è¿å ¥éåçå¾ ï¼ç´å°æé é¢éæ¾ã
Q: Agent 离线åä»»å¡ä¼ææ ·ï¼ A: ä»»å¡ä¼è¢«æ è®°ä¸ºå¤±è´¥ï¼æè éæ°è°åº¦å°å ¶ä» Agentã
Q: å¦ä½è°æ´é¡¹ç®é
é¢ï¼
A: éè¿è¿ç»´æ¥å£ OpJobQuotaProjectResource è°æ´ã
çæ¬: 1.0.0 | æ´æ°æ¥æ: 2025-12-11