repository-module-architecture
npx skills add https://github.com/tencentblueking/bk-ci --skill repository-module-architecture
Agent 安装分布
Skill 文档
Repository 代ç åºç®¡çæ¨¡åæ¶ææå
模åå®ä½: Repository æ¯ BK-CI ç代ç åºç®¡ç模åï¼è´è´£å¯¹æ¥åç§ä»£ç æç®¡å¹³å°ï¼GitãSVNãGitHubãGitLabãTGitãP4ï¼ï¼ç®¡ç代ç åºç认è¯ãææãWebhook çåè½ã
ä¸ãæ¨¡åæ´ä½ç»æ
1.1 忍¡ååå
src/backend/ci/core/repository/
âââ api-repository/ # API æ¥å£å®ä¹å±
â âââ src/main/kotlin/com/tencent/devops/repository/
â âââ api/ # REST API æ¥å£ï¼30+ æä»¶ï¼
â â âââ github/ # GitHub ä¸ç¨æ¥å£
â â âââ scm/ # SCM éç¨æ¥å£
â âââ constant/ # 常éåæ¶æ¯ç
â âââ pojo/ # æ°æ®å¯¹è±¡ï¼40+ æä»¶ï¼
â âââ sdk/ # SDK å®ä¹
â âââ utils/ # å·¥å
·ç±»
â
âââ biz-repository/ # ä¸å¡é»è¾å±
â âââ src/main/kotlin/com/tencent/devops/repository/
â âââ dao/ # æ°æ®è®¿é®å±ï¼18 æä»¶ï¼
â âââ resources/ # API å®ç°
â â âââ github/ # GitHub å®ç°
â â âââ scm/ # SCM å®ç°
â â âââ tapd/ # TAPD å®ç°
â âââ service/ # ä¸å¡æå¡
â â âââ code/ # å代ç åºç±»åæå¡
â â âââ github/ # GitHub æå¡
â â âââ hub/ # SCM Hub æå¡
â â âââ loader/ # æå¡å è½½å¨
â â âââ oauth2/ # OAuth2 æå¡
â âââ sdk/ # SDK å®ç°
â âââ utils/ # å·¥å
·ç±»
â
âââ biz-base-scm/ # SCM åºç¡åºï¼Git/SVN æä½å°è£
ï¼
âââ model-repository/ # æ°æ®æ¨¡åå±ï¼JOOQ çæï¼
âââ boot-repository/ # Spring Boot å¯å¨æ¨¡å
âââ plugin-github/ # GitHub æä»¶æ©å±
âââ plugin-tapd/ # TAPD æä»¶æ©å±
1.2 æ¯æç代ç åºç±»å
| ç±»å | æä¸¾å¼ | 说æ | è®¤è¯æ¹å¼ |
|---|---|---|---|
| Gitï¼å·¥èï¼ | CODE_GIT |
è ¾è®¯å·¥è Git | OAuth / SSH / HTTP |
| TGit | CODE_TGIT |
è ¾è®¯ TGit | OAuth / SSH / HTTP |
| GitHub | GITHUB |
GitHub.com | OAuth / GitHub App |
| GitLab | CODE_GITLAB |
GitLab ç§æé¨ç½² | HTTP / SSH |
| SVN | CODE_SVN |
Subversion | HTTP / SSH |
| P4 | CODE_P4 |
Perforce | åè¯è®¤è¯ |
äºãæ ¸å¿æ¦å¿µ
2.1 代ç åºå®ä½æ¨¡å
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 代ç åºæ¨¡å â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â T_REPOSITORYï¼ä¸»è¡¨ï¼ â â
â â âââââââââââââââ âââââââââââââââ âââââââââââââââ â â
â â âREPOSITORY_IDâ â PROJECT_ID â â ALIAS_NAME â â â
â â â (代ç åºID) â â (项ç®ID) â â (å«å) â â â
â â âââââââââââââââ âââââââââââââââ âââââââââââââââ â â
â â âââââââââââââââ âââââââââââââââ âââââââââââââââ â â
â â â URL â â TYPE â â ENABLE_PAC â â â
â â â (代ç åºå°å) â â (代ç åºç±»å) â â (PACå¼å
³) â â â
â â âââââââââââââââ âââââââââââââââ âââââââââââââââ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â â
â âââââââââââââââââ¼ââââââââââââââââ¬ââââââââââââââââ â
â â¼ â¼ â¼ â¼ â
â âââââââââââââââââ âââââââââââââââââ âââââââââââââââââ âââââââââââââ â
â âT_REPOSITORY_ â âT_REPOSITORY_ â âT_REPOSITORY_ â âT_REPOSITORYâ â
â â CODE_GIT â â CODE_GITLAB â â CODE_SVN â â _GITHUB â â
â â (Gitæç»è¡¨) â â (GitLabæç») â â (SVNæç»è¡¨) â â(GitHubæç»)â â
â âââââââââââââââââ âââââââââââââââââ âââââââââââââââââ âââââââââââââ â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
2.2 æ ¸å¿å段说æ
â ï¸ éè¦: è¿éç
PROJECT_IDæ¯T_PROJECT.english_nameï¼ä¸æ¯T_PROJECT.PROJECT_ID
| åæ®µ | ç±»å | 说æ |
|---|---|---|
REPOSITORY_ID |
Long | 代ç åºä¸»é®ï¼èªå¢ï¼ |
PROJECT_ID |
String | é¡¹ç®æ è¯ï¼= T_PROJECT.english_nameï¼ |
ALIAS_NAME |
String | 代ç åºå«åï¼ç¨æ·èªå®ä¹ï¼ |
URL |
String | 代ç åº URL |
TYPE |
String | 代ç åºç±»åï¼CODE_GIT/GITHUB çï¼ |
REPOSITORY_HASH_ID |
String | 代ç åº HashIdï¼å¯¹å¤æ´é²ï¼ |
ENABLE_PAC |
Boolean | æ¯å¦å¼å¯ PACï¼Pipeline as Codeï¼ |
SCM_CODE |
String | SCM é ç½®æ è¯ |
2.3 认è¯ç±»å
enum class RepoAuthType(val value: String) {
HTTP("HTTP"), // HTTP ç¨æ·åå¯ç
HTTPS("HTTPS"), // HTTPS
SSH("SSH"), // SSH å¯é¥
OAUTH("OAUTH"), // OAuth ææ
TOKEN("TOKEN"), // 个人访é®ä»¤ç
GITHUB_APP("GITHUB_APP") // GitHub App
}
ä¸ãæ ¸å¿æ°æ®åºè¡¨
3.1 主表
| 表å | 说æ | æ ¸å¿å段 |
|---|---|---|
T_REPOSITORY |
代ç åºä¸»è¡¨ | REPOSITORY_ID, PROJECT_ID, ALIAS_NAME, URL, TYPE, ENABLE_PAC |
T_REPOSITORY_COMMIT |
ä»£ç æäº¤è®°å½ | BUILD_ID, PIPELINE_ID, REPO_ID, COMMIT, COMMITTER |
3.2 åç±»åæç»è¡¨
| 表å | 说æ | ç¹æåæ®µ |
|---|---|---|
T_REPOSITORY_CODE_GIT |
å·¥è Git æç» | PROJECT_NAME, CREDENTIAL_ID, AUTH_TYPE, GIT_PROJECT_ID |
T_REPOSITORY_CODE_GITLAB |
GitLab æç» | PROJECT_NAME, CREDENTIAL_ID, AUTH_TYPE |
T_REPOSITORY_CODE_SVN |
SVN æç» | REGION, PROJECT_NAME, SVN_TYPE, CREDENTIAL_ID |
T_REPOSITORY_GITHUB |
GitHub æç» | PROJECT_NAME, CREDENTIAL_ID, GIT_PROJECT_ID |
T_REPOSITORY_CODE_P4 |
P4 æç» | PROJECT_NAME, CREDENTIAL_ID |
3.3 Token 表
| 表å | 说æ |
|---|---|
T_REPOSITORY_GIT_TOKEN |
å·¥è OAuth Token |
T_REPOSITORY_TGIT_TOKEN |
TGit OAuth Token |
T_REPOSITORY_GITHUB_TOKEN |
GitHub OAuth Token |
3.4 å ¶ä»è¡¨
| 表å | 说æ |
|---|---|
T_REPOSITORY_GIT_CHECK |
Git Commit Check è®°å½ |
T_REPOSITORY_PIPELINE_REF |
代ç åºä¸æµæ°´çº¿å ³è |
T_REPOSITORY_SCM_CONFIG |
SCM é ç½® |
T_REPOSITORY_SCM_PROVIDER |
SCM æä¾åé ç½® |
T_REPOSITORY_WEBHOOK_REQUEST |
Webhook 请æ±è®°å½ |
åãå屿¶æ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 请æ±å
¥å£ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â API å± (api-repository) â
â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â
â âUserRepositoryâ âServiceRepo â âServiceScm â âServiceGithub â â
â âResource â âResource â âResource â âResource â â
â â(ç¨æ·ä»£ç åº) â â(æå¡é´è°ç¨) â â(SCMæä½) â â(GitHubæä½) â â
â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ä¸å¡å± (biz-repository) â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â æ ¸å¿ Service â â
â â RepositoryService (70KB) - 代ç åº CRUD æ ¸å¿æå¡ â â
â â RepositoryOauthService - OAuth æææå¡ â â
â â RepositoryPacService - PAC æå¡ â â
â â RepositoryScmConfigService - SCM é
ç½®æå¡ â â
â â CommitService - æäº¤è®°å½æå¡ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â 代ç åºç±»åæå¡ (service/code/) â â
â â CodeGitRepositoryService - å·¥è Git æå¡ â â
â â CodeTGitRepositoryService - TGit æå¡ â â
â â CodeGithubRepositoryService - GitHub æå¡ â â
â â CodeGitlabRepositoryService - GitLab æå¡ â â
â â CodeSvnRepositoryService - SVN æå¡ â â
â â CodeP4RepositoryService - P4 æå¡ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â SCM Hub æå¡ (service/hub/) â â
â â ScmApiComposer - SCM API ç»åå¨ â â
â â ScmRepositoryApiService - ä»åº API æå¡ â â
â â ScmFileApiService - æä»¶ API æå¡ â â
â â ScmWebhookApiService - Webhook API æå¡ â â
â â ScmProviderAuthFactory - 认è¯å·¥å â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â DAO å± (biz-repository/dao) â
â RepositoryDao (25KB) | RepositoryCodeGitDao | RepositoryGithubDao â
â CommitDao | GitTokenDao | RepositoryScmConfigDao | ... â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æ°æ®å± (model-repository + MySQL) â
â æ°æ®åºï¼devops_ci_repositoryï¼å
± 15+ å¼ è¡¨ï¼ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
äºãæ ¸å¿ç±»éæ¥
5.1 API æ¥å£å±
| ç±»å | è·¯å¾åç¼ | èè´£ |
|---|---|---|
UserRepositoryResource |
/user/repositories |
ç¨æ·ä»£ç åºç®¡çï¼å建/æ´æ°/å é¤ï¼ |
ServiceRepositoryResource |
/service/repositories |
æå¡é´ä»£ç åºæ¥è¯¢ |
ServiceScmResource |
/service/scm |
SCM éç¨æä½ |
ServiceGitResource |
/service/git |
Git æä½ï¼åæ¯/Tag/æä»¶ï¼ |
ServiceGithubResource |
/service/github |
GitHub æä½ |
ServiceOauthResource |
/service/oauth |
OAuth ææ |
ServiceRepositoryPacResource |
/service/pac |
PAC ç¸å ³ |
5.2 Service å±
| ç±»å | æä»¶å¤§å° | èè´£ |
|---|---|---|
RepositoryService |
70KB | 代ç åºæ ¸å¿æå¡ï¼æå¤§ï¼ |
OPRepositoryService |
32KB | è¿ç»´ä»£ç åºæå¡ |
RepositoryScmConfigService |
30KB | SCM é ç½®æå¡ |
CodeGitRepositoryService |
25KB | å·¥è Git æå¡ |
ScmRepositoryApiService |
23KB | SCM ä»åº API |
RepoFileService |
21KB | æä»¶æå¡ |
GithubService |
21KB | GitHub æå¡ |
5.3 DAO å±
| ç±»å | æä»¶å¤§å° | èè´£ |
|---|---|---|
RepositoryDao |
25KB | 代ç åºä¸»è¡¨è®¿é® |
RepositoryCodeGitDao |
13KB | Git æç»è¡¨è®¿é® |
RepoPipelineRefDao |
12KB | æµæ°´çº¿å ³èè®¿é® |
RepositoryGithubDao |
11KB | GitHub æç»è¡¨è®¿é® |
RepositoryScmConfigDao |
10KB | SCM é ç½®è®¿é® |
å ãæ ¸å¿æµç¨
6.1 代ç åºå建æµç¨
ç¨æ·è¯·æ±
â
â¼
UserRepositoryResource.create()
â
â¼
RepositoryService.userCreate()
â
ââ⺠æéæ ¡éª
â ââ⺠repositoryPermissionService.validatePermission()
â
âââº åæ°æ ¡éª
â âââº æ ¡éª URL æ ¼å¼
â âââº æ ¡éªå«åå¯ä¸æ§
â âââº æ ¡éªåè¯æææ§
â
âââº æ ¹æ®ç±»åå建
â ââ⺠CodeRepositoryServiceRegistrar.getService(type).create()
â ââ⺠CodeGitRepositoryService.create()
â ââ⺠CodeGithubRepositoryService.create()
â ââ⺠...
â
ââ⺠åå
¥æ°æ®åº
â ââ⺠repositoryDao.create() # 主表
â ââ⺠repositoryCodeXxxDao.create() # æç»è¡¨
â
ââ⺠注åå°æéä¸å¿
ââ⺠authPermissionApi.createResource()
6.2 OAuth æææµç¨
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â OAuth æææµç¨ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â 1. ç¨æ·åèµ·ææ â
â UserRepositoryOauthResource.getOauthUrl() â
â â â
â â¼ â
â 2. éå®åå°ä»£ç æç®¡å¹³å° â
â è¿å OAuth ææ URL â
â â â
â â¼ â
â 3. ç¨æ·å¨å¹³å°ææ â
â ç¨æ·ç»å½å¹¶ææ BK-CI è®¿é® â
â â â
â â¼ â
â 4. åè°å¤ç â
â ExternalGithubResource.callback() / ExternalRepoResource â
â â â
â â¼ â
â 5. è·åå¹¶åå¨ Token â
â RepositoryOauthService.saveToken() â
â åå
¥ T_REPOSITORY_XXX_TOKEN 表 â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
6.3 代ç åºç±»åæå¡å è½½æºå¶
// æå¡æ³¨å卿¨¡å¼
@Service
class CodeRepositoryServiceRegistrar {
private val serviceMap = mutableMapOf<ScmType, CodeRepositoryService>()
fun register(type: ScmType, service: CodeRepositoryService) {
serviceMap[type] = service
}
fun getService(type: ScmType): CodeRepositoryService {
return serviceMap[type] ?: throw NotFoundException("...")
}
}
// åç±»åæå¡èªå¨æ³¨å
@Service
class CodeGitRepositoryService : CodeRepositoryService {
@PostConstruct
fun init() {
registrar.register(ScmType.CODE_GIT, this)
}
}
ä¸ãä¸å ¶ä»æ¨¡åçå ³ç³»
7.1 ä¾èµå ³ç³»
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Repository 模åä¾èµå
³ç³» â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â â
â âââââââââââââââââ â
â â repository â â
â âââââââââ¬ââââââââ â
â â â
â ââââââââââââââââââ¼âââââââââââââââââ â
â â¼ â¼ â¼ â
â âââââââââââââ âââââââââââââ âââââââââââââ â
â â project â â ticket â â auth â â
â â (项ç®ä¿¡æ¯) â â (åè¯ç®¡ç) â â (æéæ ¡éª) â â
â âââââââââââââ âââââââââââââ âââââââââââââ â
â â
â 被ä¾èµï¼ â
â - processï¼æµæ°´çº¿æå代ç ï¼ â
â - storeï¼æä»¶ä»£ç åºï¼ â
â - openapiï¼å¼æ¾æ¥å£ï¼ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
7.2 æå¡é´è°ç¨ç¤ºä¾
// Process 模åè°ç¨ Repository è·å代ç åºä¿¡æ¯
// 注æï¼projectId æ¯ T_PROJECT.english_name
client.get(ServiceRepositoryResource::class).get(
projectId = projectId, // english_name
repositoryId = repositoryHashId,
repositoryType = RepositoryType.ID
)
// è·å代ç åºå表
client.get(ServiceRepositoryResource::class).list(
projectId = projectId,
repositoryType = ScmType.CODE_GIT.name
)
// è·åæä»¶å
容
client.get(ServiceScmResource::class).getFileContent(
projectName = repoProjectName,
ref = branch,
filePath = filePath,
token = token,
authType = RepoAuthType.OAUTH,
scmType = ScmType.CODE_GIT
)
å «ãPACï¼Pipeline as Codeï¼æ¯æ
8.1 PAC æ¦å¿µ
PAC å è®¸ç¨æ·å¨ä»£ç åºä¸éè¿ YAML æä»¶å®ä¹æµæ°´çº¿ï¼ä»£ç åºåæ´æ¶èªå¨åæ¥æµæ°´çº¿é ç½®ã
8.2 PAC ç¸å ³å段
// T_REPOSITORY 表
ENABLE_PAC: Boolean // æ¯å¦å¼å¯ PAC
YAML_SYNC_STATUS: String // PAC åæ¥ç¶æï¼SYNC/SYNCING/FAILEDï¼
8.3 PAC æå¡
@Service
class RepositoryPacService {
// å¼å¯ PAC
fun enablePac(projectId: String, repositoryHashId: String)
// å
³é PAC
fun disablePac(projectId: String, repositoryHashId: String)
// 忥 YAML æµæ°´çº¿
fun syncYamlPipeline(projectId: String, repositoryHashId: String)
}
ä¹ãå¼åè§è
9.1 æ°å¢ä»£ç åºç±»å
- å¨
ScmTypeæä¸¾ä¸æ·»å æ°ç±»å - å建æç»è¡¨
T_REPOSITORY_CODE_XXX - å建 DAO ç±»
RepositoryCodeXxxDao - å建æå¡ç±»
CodeXxxRepositoryServiceå®ç°CodeRepositoryService - å¨
CodeRepositoryServiceRegistrar䏿³¨å - æ·»å 对åºç POJO ç±»ï¼å¦
CodeXxxRepositoryï¼
9.2 代ç åºæ¥è¯¢ç¤ºä¾
// æ ¹æ® HashId æ¥è¯¢
val repository = repositoryDao.getByHashId(
dslContext = dslContext,
projectId = projectId, // english_name
repositoryHashId = hashId
)
// æ ¹æ® ID æ¥è¯¢
val repository = repositoryDao.get(
dslContext = dslContext,
projectId = projectId,
repositoryId = repositoryId
)
// å表æ¥è¯¢
val list = repositoryDao.listByProject(
dslContext = dslContext,
projectId = projectId,
repositoryType = ScmType.CODE_GIT.name,
offset = offset,
limit = limit
)
9.3 åè¯ä½¿ç¨
代ç åºçåè¯åå¨å¨ Ticket 模åï¼éè¿ CREDENTIAL_ID å
³èï¼
// è·ååè¯
val credential = client.get(ServiceCredentialResource::class).get(
projectId = projectId,
credentialId = credentialId
)
åã常è§é®é¢
Q: å¦ä½å¤æä»£ç åºç±»åï¼
A: æ¥ç T_REPOSITORY.TYPE åæ®µï¼å¼ä¸º CODE_GITãGITHUBãCODE_GITLAB çã
Q: repositoryId å repositoryHashId çåºå«ï¼
A: repositoryId æ¯æ°æ®åºèªå¢ IDï¼repositoryHashId æ¯å¯¹å¤æ´é²ç Hash ç¼ç IDã
Q: å¦ä½è·å代ç åºç认è¯ä¿¡æ¯ï¼
A: éè¿ CREDENTIAL_ID ä» Ticket 模åè·ååè¯ï¼æéè¿ OAuth Token 表è·åææä¿¡æ¯ã
Q: PAC å¼å¯å代ç åºè½å¦å é¤ï¼ A: ä¸è½ï¼éè¦å å ³é PAC æè½å é¤ä»£ç åºã
çæ¬: 1.0.0 | æ´æ°æ¥æ: 2025-12-11