artifactory-module-architecture
npx skills add https://github.com/tencentblueking/bk-ci --skill artifactory-module-architecture
Agent 安装分布
Skill 文档
Artifactory å¶ååºæ¨¡åæ¶ææå
模åå®ä½: Artifactory æ¯ BK-CI çå¶ååºæ¨¡åï¼è´è´£æå»ºäº§ç©çåå¨ãä¸è½½ã管çï¼æ¯æå¯¹æ¥æ¬å°ç£çå卿 BkRepoï¼è鲸å¶ååºï¼çå端åå¨ç³»ç»ã
ä¸ãæ¨¡åæ´ä½ç»æ
1.1 忍¡ååå
src/backend/ci/core/artifactory/
âââ api-artifactory/ # API æ¥å£å®ä¹å±
â âââ src/main/kotlin/com/tencent/devops/artifactory/
â âââ api/
â â âââ builds/ # æå»ºæ¶æ¥å£
â â âââ service/ # æå¡é´æ¥å£
â â âââ user/ # ç¨æ·æ¥å£
â âââ constant/ # 常éåæ¶æ¯ç
â âââ pojo/ # æ°æ®å¯¹è±¡
â âââ enums/ # æä¸¾å®ä¹
â
âââ biz-artifactory/ # ä¸å¡é»è¾å±
â âââ src/main/kotlin/com/tencent/devops/artifactory/
â âââ config/ # é
置类
â âââ dao/ # æ°æ®è®¿é®å±
â âââ mq/ # æ¶æ¯éåçå¬
â âââ resources/ # API å®ç°
â âââ service/ # ä¸å¡æå¡
â â âââ impl/ # æå¡å®ç°
â âââ store/ # ç åååºç¸å
³
â â âââ resources/ # ååº API å®ç°
â â âââ service/ # ååºå½æ¡£æå¡
â âââ util/ # å·¥å
·ç±»
â
âââ model-artifactory/ # æ°æ®æ¨¡åå±ï¼JOOQ çæï¼
âââ boot-artifactory/ # Spring Boot å¯å¨æ¨¡å
1.2 åå¨å端类å
| ç±»å | 说æ | å®ç°ç±» |
|---|---|---|
| BkRepo | è鲸å¶ååºï¼æ¨èï¼ | BkRepoArchiveFileServiceImpl |
| Disk | æ¬å°ç£çåå¨ | DiskArchiveFileServiceImpl |
äºãæ ¸å¿æ¦å¿µ
2.1 å¶åç±»å
enum class ArtifactoryType(val type: String) {
PIPELINE("PIPELINE"), // æµæ°´çº¿äº§ç©
CUSTOM_DIR("CUSTOM_DIR"), // èªå®ä¹ç®å½
REPORT("REPORT"), // æ¥åæä»¶
}
2.2 æä»¶ç±»å
enum class FileTypeEnum(val type: String) {
BK_ARCHIVE("BK_ARCHIVE"), // æå»ºå½æ¡£
BK_CUSTOM("BK_CUSTOM"), // èªå®ä¹æä»¶
BK_REPORT("BK_REPORT"), // æ¥åæä»¶
BK_LOG("BK_LOG"), // æ¥å¿æä»¶
BK_PLUGIN_FE("BK_PLUGIN_FE"), // æä»¶å端
BK_STATIC("BK_STATIC"), // éæèµæº
}
2.3 æä»¶è·¯å¾è§è
# æµæ°´çº¿äº§ç©è·¯å¾
/{projectId}/{pipelineId}/{buildId}/{fileName}
# èªå®ä¹ç®å½è·¯å¾
/{projectId}/custom/{customPath}/{fileName}
# æ¥åæä»¶è·¯å¾
/{projectId}/report/{pipelineId}/{buildId}/{taskId}/{fileName}
ä¸ãæ ¸å¿æ°æ®åºè¡¨
3.1 æä»¶ä¿¡æ¯è¡¨
| 表å | 说æ | æ ¸å¿å段 |
|---|---|---|
T_FILE_INFO |
æä»¶ä¿¡æ¯ä¸»è¡¨ | ID, PROJECT_CODE, FILE_TYPE, FILE_PATH, FILE_NAME, FILE_SIZE |
T_FILE_PROPS_INFO |
æä»¶å æ°æ®è¡¨ | FILE_ID, PROPS_KEY, PROPS_VALUE |
T_TOKEN |
ä¸è½½ä»¤ç表 | USER_ID, PROJECT_ID, PATH, TOKEN, EXPIRE_TIME |
T_FILE_TASK |
æä»¶ä»»å¡è¡¨ | TASK_ID, FILE_TYPE, FILE_PATH, STATUS, BUILD_ID |
3.2 åæ®µè¯´æ
â ï¸ éè¦:
PROJECT_CODE/PROJECT_ID齿¯T_PROJECT.english_name
| åæ®µ | 说æ |
|---|---|
PROJECT_CODE |
é¡¹ç®æ è¯ï¼= T_PROJECT.english_nameï¼ |
FILE_TYPE |
æä»¶ç±»åï¼BK_ARCHIVE/BK_CUSTOM çï¼ |
FILE_PATH |
æä»¶åå¨è·¯å¾ |
ARTIFACTORY_TYPE |
å¶ååºç±»åï¼PIPELINE/CUSTOM_DIRï¼ |
åãå屿¶æ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 请æ±å
¥å£ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â API å± (api-artifactory) â
â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â
â âBuildFile â âServiceArti â âUserFile â âUserArtifact â â
â âResource â âfactoryRes â âResource â âoryResource â â
â â(æå»ºæ¶ä¸ä¼ ) â â(æå¡é´è°ç¨) â â(ç¨æ·æä»¶) â â(ç¨æ·å¶å) â â
â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â
â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â
â âBuildArtifact â âServiceBkRepo â âUserReport â â
â âoryResource â âResource â âStorageRes â â
â â(æå»ºå¶å) â â(BkRepoæä½) â â(æ¥ååå¨) â â
â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ä¸å¡å± (biz-artifactory) â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â æ ¸å¿ Service â â
â â ArchiveFileService - æä»¶å½æ¡£æå¡ï¼æ¥å£ï¼ â â
â â BkRepoArchiveFileServiceImpl - BkRepo å®ç° (29KB) â â
â â DiskArchiveFileServiceImpl - ç£çåå¨å®ç° (28KB) â â
â â FileTaskService - æä»¶ä»»å¡æå¡ â â
â â PipelineBuildArtifactoryService - æµæ°´çº¿æå»ºå¶åæå¡ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â ååºå½æ¡£æå¡ (store/service/) â â
â â ArchiveAtomService - æä»¶å½æ¡£æå¡ â â
â â ArchiveStorePkgService - ååºå
彿¡£æå¡ â â
â â ArchiveAtomToBkRepoServiceImpl - æä»¶å½æ¡£å° BkRepo â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â æ¶æ¯çå¬ (mq/) â â
â â PipelineBuildArtifactoryListener - æå»ºå®æåå¤çå¶å â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â DAO å± (biz-artifactory/dao) â
â FileDao (7.5KB) | FileTaskDao (4.8KB) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æ°æ®å± (model-artifactory + MySQL) â
â æ°æ®åºï¼devops_ci_artifactoryï¼å
± 4 å¼ è¡¨ï¼ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â åå¨å端 (BkRepo / æ¬å°ç£ç) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
äºãæ ¸å¿ç±»éæ¥
5.1 API æ¥å£å±
| ç±»å | è·¯å¾åç¼ | èè´£ |
|---|---|---|
BuildFileResource |
/build/files |
æå»ºæ¶æä»¶ä¸ä¼ ä¸è½½ |
BuildArtifactoryResource |
/build/artifactories |
æå»ºæ¶å¶åæä½ |
ServiceArtifactoryResource |
/service/artifactories |
æå¡é´å¶åæä½ |
ServiceFileResource |
/service/files |
æå¡é´æä»¶æä½ |
UserFileResource |
/user/files |
ç¨æ·æä»¶æä½ |
UserArtifactoryResource |
/user/artifactories |
ç¨æ·å¶åæä½ |
ServiceArchiveAtomResource |
/service/archive/atom |
æä»¶å½æ¡£ |
5.2 Service å±
| ç±»å | æä»¶å¤§å° | èè´£ |
|---|---|---|
BkRepoArchiveFileServiceImpl |
29KB | BkRepo æä»¶å½æ¡£å®ç° |
DiskArchiveFileServiceImpl |
28KB | ç£çæä»¶å½æ¡£å®ç° |
ArchiveAtomServiceImpl |
16KB | æä»¶å½æ¡£æå¡ |
ArchiveStorePkgServiceImpl |
16KB | ååºå 彿¡£æå¡ |
FileTaskServiceImpl |
10KB | æä»¶ä»»å¡æå¡ |
ArchiveFileService |
8KB | æä»¶å½æ¡£æ¥å£ |
5.3 DAO å±
| ç±»å | èè´£ |
|---|---|
FileDao |
æä»¶ä¿¡æ¯è®¿é® |
FileTaskDao |
æä»¶ä»»å¡è®¿é® |
å ãæ ¸å¿æµç¨
6.1 æå»ºäº§ç©ä¸ä¼ æµç¨
æå»ºæä»¶ä¸ä¼ æä»¶
â
â¼
BuildFileResource.uploadFile()
â
â¼
ArchiveFileService.uploadFile()
â
ââ⺠BkRepoArchiveFileServiceImpl.uploadFile()
â ââ⺠è°ç¨ BkRepo API ä¸ä¼ æä»¶
â
ââ⺠DiskArchiveFileServiceImpl.uploadFile()
ââ⺠åå
¥æ¬å°ç£ç
â
â¼
FileDao.create()
â
âââº è®°å½æä»¶ä¿¡æ¯å°æ°æ®åº
6.2 æå»ºäº§ç©ä¸è½½æµç¨
ç¨æ·/æä»¶è¯·æ±ä¸è½½
â
â¼
UserFileResource.downloadFile() / BuildFileResource.downloadFile()
â
â¼
ArchiveFileService.downloadFile()
â
ââ⺠éªè¯æé
â âââº æ£æ¥ç¨æ·æ¯å¦æé¡¹ç®æé
â
ââ⺠è·åæä»¶
â ââ⺠BkRepo: è°ç¨ BkRepo API è·å
â ââ⺠Disk: 仿¬å°ç£ç读å
â
ââ⺠è¿åæä»¶æµ
6.3 æä»¶å 彿¡£æµç¨
æä»¶å叿¶å½æ¡£
â
â¼
ServiceArchiveAtomResource.archiveAtom()
â
â¼
ArchiveAtomService.archiveAtom()
â
ââ⺠ä¸è½½æä»¶å
â ââ⺠ä»ä»£ç åºä¸è½½æå»ºäº§ç©
â
ââ⺠ä¸ä¼ å°å¶ååº
â ââ⺠ArchiveAtomToBkRepoServiceImpl.archiveAtom()
â
âââº æ´æ°æä»¶ç¯å¢ä¿¡æ¯
âââº è®°å½ PKG_PATH
ä¸ãä¸å ¶ä»æ¨¡åçå ³ç³»
7.1 ä¾èµå ³ç³»
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Artifactory 模åä¾èµå
³ç³» â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â â
â âââââââââââââââââ â
â â artifactory â â
â âââââââââ¬ââââââââ â
â â â
â ââââââââââââââââââ¼âââââââââââââââââ â
â â¼ â¼ â¼ â
â âââââââââââââ âââââââââââââ âââââââââââââ â
â â project â â auth â â BkRepo â â
â â (项ç®ä¿¡æ¯) â â (æéæ ¡éª) â â (åå¨å端) â â
â âââââââââââââ âââââââââââââ âââââââââââââ â
â â
â 被ä¾èµï¼ â
â - processï¼æµæ°´çº¿å½æ¡£äº§ç©ï¼ â
â - storeï¼æä»¶å
彿¡£ï¼ â
â - workerï¼æå»ºæºä¸ä¼ ä¸è½½ï¼ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
7.2 æå¡é´è°ç¨ç¤ºä¾
// Process 模åè·åæå»ºäº§ç©å表
// 注æï¼projectId æ¯ T_PROJECT.english_name
client.get(ServiceArtifactoryResource::class).search(
projectId = projectId, // english_name
pipelineId = pipelineId,
buildId = buildId
)
// è·åæä»¶ä¸è½½ URL
client.get(ServiceArtifactoryResource::class).getFileDownloadUrls(
projectId = projectId,
artifactoryType = ArtifactoryType.PIPELINE,
filePath = filePath
)
// Worker ä¸ä¼ æä»¶
client.get(BuildFileResource::class).uploadFile(
projectId = projectId,
pipelineId = pipelineId,
buildId = buildId,
file = file
)
å «ãBkRepo éæ
8.1 BkRepo é ç½®
# application-artifactory.yml
bkrepo:
# BkRepo æå¡å°å
gatewayUrl: http://bkrepo.example.com
# æ¯å¦å¯ç¨ BkRepo
enabled: true
# ä»åºåç§°
repoName: pipeline
8.2 BkRepo å·¥å ·ç±»
// BkRepoUtils.kt
object BkRepoUtils {
// æå»º BkRepo è·¯å¾
fun buildPath(projectId: String, pipelineId: String, buildId: String, fileName: String): String
// ä¸ä¼ æä»¶å° BkRepo
fun uploadFile(path: String, file: File): Boolean
// ä» BkRepo ä¸è½½æä»¶
fun downloadFile(path: String): InputStream
}
ä¹ãå¼åè§è
9.1 æ°å¢åå¨å端
- å®ç°
ArchiveFileServiceæ¥å£ - å建对åºç
*ArchiveFileServiceImplç±» - å¨é ç½®ä¸æ·»å åå¨åç«¯éæ©é»è¾
- å®ç°æä»¶ä¸ä¼ ãä¸è½½ãå é¤çæ¹æ³
9.2 æä»¶æä½ç¤ºä¾
// ä¸ä¼ æä»¶
archiveFileService.uploadFile(
userId = userId,
projectId = projectId, // english_name
pipelineId = pipelineId,
buildId = buildId,
file = file,
fileType = FileTypeEnum.BK_ARCHIVE
)
// ä¸è½½æä»¶
val inputStream = archiveFileService.downloadFile(
userId = userId,
projectId = projectId,
filePath = filePath
)
// æ¥è¯¢æä»¶å表
val files = fileDao.listByPath(
dslContext = dslContext,
projectCode = projectId,
filePath = path
)
åã常è§é®é¢
Q: å¦ä½åæ¢åå¨å端ï¼
A: éè¿é
ç½® bkrepo.enabled æ§å¶ï¼true ä½¿ç¨ BkRepoï¼false ä½¿ç¨æ¬å°ç£çã
Q: æå»ºäº§ç©ä¿çå¤ä¹ ï¼ A: æ ¹æ®é¡¹ç®é ç½®çä¿ççç¥ï¼é»è®¤è·éæå»ºè®°å½ä¿çæ¶é´ã
Q: å¦ä½è·åæä»¶ä¸è½½é¾æ¥ï¼
A: è°ç¨ getFileDownloadUrls æ¥å£è·å带 Token ç临æ¶ä¸è½½é¾æ¥ã
Q: 大æä»¶ä¸ä¼ æéå¶åï¼ A: æï¼é»è®¤éå¶å¨é ç½®æä»¶ä¸è®¾ç½®ï¼å¯æ ¹æ®éè¦è°æ´ã
çæ¬: 1.0.0 | æ´æ°æ¥æ: 2025-12-11