worker-module-architecture
npx skills add https://github.com/tencentblueking/bk-ci --skill worker-module-architecture
Agent 安装分布
Skill 文档
Worker æå»ºæ§è¡å¨æ¨¡åæ¶ææå
æ¨¡åæ¦è¿°
Worker æ¨¡åæ¯ BK-CI æå»ºæ§è¡å¨çæ ¸å¿ç»ä»¶ï¼è¿è¡å¨æå»ºæºï¼Agentï¼ä¸ï¼è´è´£æ¥æ¶å¹¶æ§è¡æµæ°´çº¿ä»»å¡ã宿¯è¿æ¥ CI æå¡ç«¯ä¸æå»ºç¯å¢çæ¡¥æ¢ï¼å®ç°äºä»»å¡è°åº¦ãæä»¶æ§è¡ãæ¥å¿ä¸æ¥ãå¿è·³ç»´æ¤çå ³é®åè½ã
æ ¸å¿èè´£
- 任塿§è¡ï¼æ¥æ¶å¹¶æ§è¡æµæ°´çº¿ä¸çå类任å¡ï¼èæ¬ãæä»¶çï¼
- æ¥å¿æå¡ï¼æ¶éæå»ºæ¥å¿å¹¶ä¸æ¥å° Log æå¡
- å¿è·³ç»´æ¤ï¼å®æåæå¡ç«¯åéå¿è·³ï¼ç»´ææå»ºç¶æ
- åé管çï¼ç®¡çæå»ºè¿ç¨ä¸çç¯å¢åéåä¸ä¸æ
- å¶å彿¡£ï¼å°æå»ºäº§ç©ä¸ä¼ å°å¶ååº
- æä»¶è¿è¡ï¼ä¸è½½å¹¶æ§è¡ç åååºä¸çæä»¶
è¿è¡æ¨¡å¼
Worker æ¯æä¸ç§æå»ºç±»åï¼
| ç±»å | 说æ | åºæ¯ |
|---|---|---|
DOCKER |
Docker å®¹å¨æå»º | å ¬å ±æå»ºèµæºæ± |
AGENT |
ç¬¬ä¸æ¹æå»ºæº | ç¨æ·èªææå»ºæº |
WORKER |
æ ç¼è¯ç¯å¢ | è½»éçº§ä»»å¡æ§è¡ |
ç®å½ç»æ
src/backend/ci/core/worker/
âââ build.gradle.kts # 模åæå»ºé
ç½®
âââ worker-agent/ # Agent å¯å¨å
¥å£
â âââ src/main/kotlin/
â â âââ com/tencent/devops/agent/
â â âââ Application.kt # 主å
¥å£ï¼æ ¹æ®æå»ºç±»åå¯å¨
â â âââ AgentVersion.kt # çæ¬ä¿¡æ¯
â â âââ service/
â â âââ BuildLessStarter.kt # æ ç¼è¯æå»ºå¯å¨å¨
â âââ src/test/kotlin/ # æµè¯ä»£ç
âââ worker-common/ # å
Œ
±ç»ä»¶åº
â âââ src/main/kotlin/
â â âââ com/tencent/devops/worker/common/
â â âââ Runner.kt # æ ¸å¿è¿è¡å¨
â â âââ WorkRunner.kt # ç¬¬ä¸æ¹æå»ºæºè¿è¡å¨
â â âââ api/ # API 客æ·ç«¯
â â âââ env/ # ç¯å¢åé管ç
â â âââ heartbeat/ # å¿è·³æå¡
â â âââ logger/ # æ¥å¿æå¡
â â âââ service/ # ä¸å¡æå¡
â â âââ task/ # 任塿§è¡æ¡æ¶
â â âââ utils/ # å·¥å
·ç±»
â â âââ constants/ # 常éå®ä¹
â âââ src/main/kotlin/
â âââ com/tencent/devops/plugin/worker/task/
â âââ archive/ # 彿¡£ä»»å¡
â âââ scm/ # ä»£ç æåä»»å¡
â âââ image/ # éåä»»å¡
âââ worker-api-sdk/ # API SDK å®ç°
âââ src/main/kotlin/
âââ com/tencent/devops/worker/common/api/
âââ archive/ # å¶ååº API
âââ atom/ # æä»¶ API
âââ log/ # æ¥å¿ API
âââ process/ # æµæ°´çº¿ API
âââ ... # å
¶ä» API
æ ¸å¿ç»ä»¶
1. Runner – æ ¸å¿è¿è¡å¨
Runner.kt æ¯ Worker çæ ¸å¿å
¥å£ï¼è´è´£æ´ä¸ªæå»ºçå½å¨æç®¡çï¼
object Runner {
fun run(workspaceInterface: WorkspaceInterface, systemExit: Boolean = true) {
// 1. è·åæå»ºåé
val buildVariables = getBuildVariables()
// 2. åå¤å·¥ä½ç©ºé´ãå¯å¨æ¥å¿æå¡ãå¯å¨å¿è·³
val workspacePathFile = prepareWorker(buildVariables, workspaceInterface)
// 3. 循ç¯è·åå¹¶æ§è¡ä»»å¡
loopPickup(workspacePathFile, buildVariables)
// 4. æ¸
çå¹¶ç»ææå»º
finishWorker(buildVariables)
}
}
æ ¸å¿æµç¨ï¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Worker å¯å¨æµç¨ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â 1. EngineService.setStarted() â 䏿¥å¯å¨ç¶æï¼è·åæå»ºåé â
â 2. LoggerService.start() â å¯å¨æ¥å¿æå¡ â
â 3. Heartbeat.start() â å¯å¨å¿è·³çæ§ â
â 4. loopPickup() â 循ç¯é¢åä»»å¡ â
â âââ claimTask() â è·åå¾
æ§è¡ä»»å¡ â
â âââ TaskFactory.create() â åå»ºä»»å¡æ§è¡å¨ â
â âââ taskDaemon.run() â æ§è¡ä»»å¡ â
â âââ completeTask() â 䏿¥ä»»å¡ç»æ â
â 5. finishWorker() â ç»ææå»º â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
2. TaskFactory – ä»»å¡å·¥å
ä»»å¡å·¥åè´è´£æ ¹æ®ä»»å¡ç±»åå建对åºçæ§è¡å¨ï¼
object TaskFactory {
private val taskMap = ConcurrentHashMap<String, KClass<out ITask>>()
fun init() {
// 注åå
置任å¡ç±»å
register(LinuxScriptElement.classType, LinuxScriptTask::class)
register(WindowsScriptElement.classType, WindowsScriptTask::class)
register(MarketBuildAtomElement.classType, MarketAtomTask::class)
// éè¿åå°æ«ææ³¨åæä»¶ä»»å¡
val reflections = Reflections("com.tencent.devops.plugin.worker.task")
// ...
}
fun create(type: String): ITask {
val clazz = taskMap[type] ?: return EmptyTask(type)
return clazz.primaryConstructor?.call() ?: EmptyTask(type)
}
}
3. ITask – 任塿¥å£
ææä»»å¡æ§è¡å¨çåºç±»ï¼
abstract class ITask {
private val environment = HashMap<String, String>()
// 任塿§è¡å
¥å£
fun run(buildTask: BuildTask, buildVariables: BuildVariables, workspace: File) {
execute(buildTask, buildVariables, workspace)
}
// åç±»å®ç°å
·ä½æ§è¡é»è¾
protected abstract fun execute(
buildTask: BuildTask,
buildVariables: BuildVariables,
workspace: File
)
// æ·»å ç¯å¢åéï¼è¾åºåéï¼
protected fun addEnv(env: Map<String, String>) {
// æ ¡éªåªè¯»åéãåéååæ³æ§
environment.putAll(env)
}
fun getAllEnv(): Map<String, String> = environment
}
4. LoggerService – æ¥å¿æå¡
è´è´£æå»ºæ¥å¿çæ¶éãç¼å²å䏿¥ï¼
object LoggerService {
private val uploadQueue = LinkedBlockingQueue<LogMessage>(2000)
fun addNormalLine(message: String) {
// 1. å¤çæ¥å¿åç¼ï¼DEBUG/ERROR/WARNï¼
// 2. ææä¿¡æ¯è¿æ»¤
// 3. æ¬å°è½çï¼å¦éè¦ï¼
// 4. æ¾å
¥ä¸æ¥éå
uploadQueue.put(logMessage)
}
fun addErrorLine(message: String) {
addNormalLine("$LOG_ERROR_FLAG$message")
}
fun addWarnLine(message: String) {
addNormalLine("$LOG_WARN_FLAG$message")
}
// æ¥å¿æå
fun addFoldStartLine(foldName: String) {
addLog(LogMessage(message = "##[group]$foldName", ...))
}
fun addFoldEndLine(foldName: String) {
addLog(LogMessage(message = "##[endgroup]$foldName", ...))
}
}
5. Heartbeat – å¿è·³æå¡
ç»´æä¸æå¡ç«¯çè¿æ¥ï¼çæ§ä»»å¡è¶ æ¶ï¼
object Heartbeat {
fun start(jobTimeoutMills: Long, executeCount: Int) {
// 宿¶å¿è·³ï¼æ¯2ç§ï¼
executor.scheduleWithFixedDelay({
val heartBeatInfo = EngineService.heartbeat(...)
// å¤çåæ¶ä»»å¡
if (!heartBeatInfo.cancelTaskIds.isNullOrEmpty()) {
KillBuildProcessTree.killProcessTree(...)
}
}, 10, 2, TimeUnit.SECONDS)
// Job è¶
æ¶çæ§
executor.scheduleWithFixedDelay({
LoggerService.addErrorLine("Job timeout")
EngineService.timeout()
exitProcess(99)
}, jobTimeoutMills, jobTimeoutMills, TimeUnit.MILLISECONDS)
}
}
6. EngineService – 弿æå¡
ä¸ Process æå¡éä¿¡ç客æ·ç«¯ï¼
object EngineService {
// 䏿¥å¯å¨ç¶æ
fun setStarted(): BuildVariables
// é¢åä»»å¡
fun claimTask(): BuildTask
// 宿任å¡
fun completeTask(taskResult: BuildTaskResult)
// ç»ææå»º
fun endBuild(variables: Map<String, String>, result: BuildJobResult)
// å¿è·³
fun heartbeat(executeCount: Int, jobHeartbeatRequest: JobHeartbeatRequest): HeartBeatInfo
// è¶
æ¶ä¸æ¥
fun timeout()
// éè¯¯ä¸æ¥
fun submitError(errorInfo: ErrorInfo)
}
ä»»å¡ç±»å
å 置任å¡
| ä»»å¡ç±»å | ç±»å | 说æ |
|---|---|---|
linuxScript |
LinuxScriptTask |
Linux Shell èæ¬ |
windowsScript |
WindowsScriptTask |
Windows Bat èæ¬ |
marketBuild |
MarketAtomTask |
ç åååºæä»¶ |
marketBuildLess |
MarketAtomTask |
æ ç¼è¯ç¯å¢æä»¶ |
æä»¶ä»»å¡ï¼plugin å ï¼
| ä»»å¡ç±»å | ç±»å | 说æ |
|---|---|---|
reportArchive |
ReportArchiveTask |
æ¥å彿¡£ |
singleFileArchive |
SingleFileArchiveTask |
åæä»¶å½æ¡£ |
buildArchiveGet |
BuildArchiveGetTask |
è·åæå»ºäº§ç© |
customizeArchiveGet |
CustomizeArchiveGetTask |
è·åèªå®ä¹äº§ç© |
codeGitPull |
CodeGitPullTask |
Git ä»£ç æå |
codeGitlabPull |
CodeGitlabPullTask |
GitLab ä»£ç æå |
codeSvnPull |
CodeSvnPullTask |
SVN ä»£ç æå |
githubPull |
GithubPullTask |
GitHub ä»£ç æå |
MarketAtomTask – æä»¶æ§è¡
ç åååºæä»¶çæ§è¡æµç¨ï¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æä»¶æ§è¡æµç¨ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â 1. è·åæä»¶ä¿¡æ¯ â
â atomApi.getAtomEnv(projectCode, atomCode, atomVersion) â
â â
â 2. å夿§è¡ç¯å¢ â
â âââ å建临æ¶å·¥ä½ç®å½ â
â âââ ä¸è½½/ç¼åæä»¶å
â
â âââ æ ¡éª SHA 宿´æ§ â
â â
â 3. åå¤è¾å
¥åæ° â
â âââ è§£æ input.json â
â âââ æ¿æ¢åéååæ® â
â âââ åå
¥ .sdk.jsonï¼SDK ç¯å¢ä¿¡æ¯ï¼ â
â â
â 4. æ§è¡æä»¶ â
â âââ Linux: ShellUtil.execute() â
â âââ Windows: BatScriptUtil.execute() â
â â
â 5. å¤çè¾åº â
â âââ 读å output.json â
â âââ å¤çè¾åºåé â
â âââ 彿¡£å¶åï¼artifact ç±»åï¼ â
â âââ 彿¡£æ¥åï¼report ç±»åï¼ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
æä»¶ SDK ç¯å¢
Worker 为æä»¶æä¾ç SDK ç¯å¢ä¿¡æ¯ï¼.sdk.jsonï¼ï¼
data class SdkEnv(
val buildType: BuildType, // æå»ºç±»å
val projectId: String, // 项ç®IDï¼english_nameï¼
val agentId: String, // æå»ºæºID
val secretKey: String, // å¯é¥
val gateway: String, // ç½å
³å°å
val buildId: String, // æå»ºID
val vmSeqId: String, // èææºåºå·
val fileGateway: String, // æä»¶ç½å
³
val taskId: String, // ä»»å¡ID
val executeCount: Int // æ§è¡æ¬¡æ°
)
æä»¶è¾åºå¤ç
// output.json æ ¼å¼
{
"status": "success", // success/failure
"data": {
"outVar1": {
"type": "string",
"value": "xxx"
},
"outVar2": {
"type": "artifact",
"value": ["file1.zip", "file2.tar.gz"]
},
"outVar3": {
"type": "report",
"label": "æµè¯æ¥å",
"path": "reports/",
"target": "index.html"
}
},
"qualityData": { ... } // è´¨éçº¢çº¿æ°æ®
}
API 客æ·ç«¯
AbstractBuildResourceApi
ææ API 客æ·ç«¯çåºç±»ï¼æä¾ HTTP 请æ±è½åï¼
abstract class AbstractBuildResourceApi : WorkerRestApiSDK {
// 请æ±éè¯æºå¶
protected fun requestForResponse(
request: Request,
retryCount: Int = DEFAULT_RETRY_TIME
): Response {
// æ¯æ 502/503/504 èªå¨éè¯
// æ¯æ DNS é误ãè¿æ¥è¶
æ¶éè¯
}
// æå»ºè¯·æ±å¤´ï¼å
å«è®¤è¯ä¿¡æ¯ï¼
private fun getAllHeaders(headers: Map<String, String>): Map<String, String> {
return buildArgs.plus(headers).plus(
AUTH_HEADER_DEVOPS_BUILD_ID to buildInfo.buildId,
AUTH_HEADER_DEVOPS_VM_SEQ_ID to buildInfo.vmSeqId
)
}
}
ä¸»è¦ API 客æ·ç«¯
| ç±»å | èè´£ |
|---|---|
BuildResourceApi |
æå»ºä»»å¡ç¸å ³ API |
LogResourceApi |
æ¥å¿ä¸æ¥ API |
ArchiveResourceApi |
å¶å彿¡£ API |
AtomArchiveResourceApi |
æä»¶ä¸è½½ API |
CredentialResourceApi |
åæ®è·å API |
QualityGatewayResourceApi |
è´¨é红线 API |
å·¥å ·ç±»
ShellUtil – Shell èæ¬æ§è¡
object ShellUtil {
fun execute(
buildId: String,
script: String,
dir: File,
workspace: File,
buildEnvs: List<BuildEnv>,
runtimeVariables: Map<String, String>,
errorMessage: String = "Fail to run the script"
): String {
// 1. å建临æ¶èæ¬æä»¶
// 2. 设置ç¯å¢åé
// 3. æ§è¡èæ¬
// 4. å¤çè¾åºåé误
}
}
BatScriptUtil – Bat èæ¬æ§è¡
object BatScriptUtil {
fun execute(
buildId: String,
script: String,
runtimeVariables: Map<String, String>,
dir: File,
workspace: File,
errorMessage: String
): String {
// Windows æ¹å¤çèæ¬æ§è¡
}
}
CredentialUtils – åæ®å·¥å ·
object CredentialUtils {
// è§£æåæ®å ä½ç¬¦
fun String.parseCredentialValue(
context: Map<String, String>?,
acrossProjectId: String?
): String {
// è§£æ ${{credentials.xxx}} æ ¼å¼
}
}
WorkspaceUtils – å·¥ä½ç©ºé´å·¥å ·
object WorkspaceUtils {
// è·åæµæ°´çº¿å·¥ä½ç©ºé´
fun getPipelineWorkspace(pipelineId: String, workspace: String): File
// è·åæ¥å¿ç®å½
fun getPipelineLogDir(pipelineId: String): File
// è·åæå»ºæ¥å¿å±æ§
fun getBuildLogProperty(...): TaskBuildLogProperty
}
ç¯å¢åé
AgentEnv – æå»ºæºç¯å¢
object AgentEnv {
fun getProjectId(): String // 项ç®ID
fun getAgentId(): String // æå»ºæºID
fun getAgentSecretKey(): String // å¯é¥
fun getGateway(): String // ç½å
³å°å
fun getOS(): OSType // æä½ç³»ç»ç±»å
fun getLocaleLanguage(): String // è¯è¨è®¾ç½®
fun getRuntimeJdkPath(): String // JDK è·¯å¾
}
BuildEnv – æå»ºç¯å¢
object BuildEnv {
fun getBuildType(): BuildType // è·åæå»ºç±»å
fun isThirdParty(): Boolean // æ¯å¦ç¬¬ä¸æ¹æå»ºæº
}
æ°æ®æ¨¡å
BuildTask – æå»ºä»»å¡
data class BuildTask(
val buildId: String,
val vmSeqId: String,
val status: BuildTaskStatus, // DO/WAIT/END
val taskId: String?,
val elementId: String?,
val elementName: String?,
val type: String?, // ä»»å¡ç±»å
val params: Map<String, String>?,
val buildVariable: Map<String, String>?,
val containerType: String?,
val executeCount: Int?,
val stepId: String?,
val signToken: String?
)
BuildVariables – æå»ºåé
data class BuildVariables(
val buildId: String,
val vmSeqId: String,
val vmName: String,
val projectId: String, // 项ç®IDï¼english_nameï¼
val pipelineId: String,
val variables: Map<String, String>,
val variablesWithType: List<BuildParameters>,
val buildEnvs: List<BuildEnv>,
val containerId: String,
val containerHashId: String?,
val jobId: String?,
val timeoutMills: Long
)
BuildTaskResult – ä»»å¡ç»æ
data class BuildTaskResult(
val buildId: String,
val vmSeqId: String,
val taskId: String,
val elementId: String,
val success: Boolean,
val buildVariable: Map<String, String>?,
val errorType: String?,
val errorCode: Int?,
val message: String?,
val type: String?,
val monitorData: Map<String, Any>?,
val platformCode: String?,
val platformErrorCode: Int?
)
æå»ºæµç¨æ¶åºå¾
ââââââââ ââââââââââ âââââââââââ ââââââââââ
âWorkerâ âProcess â â Log â â Store â
ââââ¬ââââ âââââ¬âââââ ââââââ¬âââââ âââââ¬âââââ
â â â â
â setStarted â â â
âââââââââââââ>â â â
â BuildVariables â â
â<âââââââââââââ â â
â â â â
â claimTask â â â
âââââââââââââ>â â â
â BuildTask â â â
â<âââââââââââââ â â
â â â â
â â addLogLine â â
â âââââââââââââââ>â â
â â â â
â â â getAtomEnv â
â â ââââââââââââââ>â
â â â AtomEnv â
â â â<ââââââââââââââ
â â â â
â heartbeat â â â
âââââââââââââ>â â â
â HeartBeatInfo â â
â<âââââââââââââ â â
â â â â
â completeTaskâ â â
âââââââââââââ>â â â
â â â â
â endBuild â â â
âââââââââââââ>â â â
âââââââââââââââ´ââââââââââââââââ´âââââââââââââââ
ä¸å ¶ä»æ¨¡åçå ³ç³»
âââââââââââââââ
â Process â
â (æµæ°´çº¿å¼æ) â
ââââââââ¬âââââââ
â
ââââââââââââââ¼âââââââââââââ
â â â
â¼ â¼ â¼
âââââââââââ âââââââââââ âââââââââââ
âDispatch â â Log â â Store â
â(è°åº¦æå¡)â â(æ¥å¿æå¡)â â(ç åååº)â
ââââââ¬âââââ ââââââ¬âââââ ââââââ¬âââââ
â â â
ââââââââââââââ¼âââââââââââââ
â
âââââââ¼ââââââ
â Worker â
â (æå»ºæ§è¡å¨)â
âââââââ¬ââââââ
â
ââââââââââââââââââ¼âââââââââââââââââ
â â â
â¼ â¼ â¼
ââââââââââââ ââââââââââââ ââââââââââââ
âArtifactoryâ â Ticket â âRepositoryâ
â (å¶ååº) â â (åæ®) â â (代ç åº) â
ââââââââââââ ââââââââââââ ââââââââââââ
ä¾èµå ³ç³»è¯´æ
| ä¾èµæ¨¡å | äº¤äºæ¹å¼ | ç¨é |
|---|---|---|
| Process | HTTP API | ä»»å¡é¢åãç¶æä¸æ¥ãå¿è·³ |
| Log | HTTP API | æ¥å¿ä¸æ¥ |
| Store | HTTP API | æä»¶ä¿¡æ¯è·åãæä»¶ä¸è½½ |
| Artifactory | HTTP API | å¶åä¸ä¼ ä¸è½½ |
| Ticket | HTTP API | åæ®è·å |
| Repository | HTTP API | 代ç åºä¿¡æ¯ |
å¼åè§è
æ°å¢ä»»å¡ç±»å
- å建任å¡ç±»ç»§æ¿
ITaskï¼
@TaskClassType(classTypes = ["myTaskType"], priority = 1)
class MyTask : ITask() {
override fun execute(
buildTask: BuildTask,
buildVariables: BuildVariables,
workspace: File
) {
// å®ç°ä»»å¡é»è¾
LoggerService.addNormalLine("æ§è¡ä»»å¡...")
// è¾åºåé
addEnv(mapOf("OUTPUT_VAR" to "value"))
}
}
- æ¾ç½®å¨
com.tencent.devops.plugin.worker.taskå ä¸ï¼èªå¨æ³¨å
æ¥å¿è¾åºè§è
// æ®éæ¥å¿
LoggerService.addNormalLine("æ£å¸¸ä¿¡æ¯")
// è¦åæ¥å¿ï¼é»è²ï¼
LoggerService.addWarnLine("è¦åä¿¡æ¯")
// é误æ¥å¿ï¼çº¢è²ï¼
LoggerService.addErrorLine("é误信æ¯")
// è°è¯æ¥å¿ï¼ç°è²ï¼
LoggerService.addDebugLine("è°è¯ä¿¡æ¯")
// æå æ¥å¿
LoggerService.addFoldStartLine("[å®è£
ä¾èµ]")
// ... è¯¦ç»æ¥å¿
LoggerService.addFoldEndLine("-----")
é误å¤ç
throw TaskExecuteException(
errorMsg = "任塿§è¡å¤±è´¥",
errorType = ErrorType.USER, // USER/SYSTEM/THIRD_PARTY/PLUGIN
errorCode = ErrorCode.USER_TASK_OPERATE_FAIL
)
ææä¿¡æ¯å¤ç
// èªå¨è¿æ»¤ææä¿¡æ¯
SensitiveValueService.addSensitiveValue("password123")
// æ¥å¿ä¸ä¼èªå¨æ¿æ¢ä¸º ******
LoggerService.addNormalLine("å¯ç æ¯: password123")
// è¾åº: å¯ç æ¯: ******
常è§é®é¢
Q1: Worker å¦ä½ä¸æå¡ç«¯éä¿¡ï¼
Worker éè¿ HTTP API 䏿å¡ç«¯éä¿¡ï¼ææè¯·æ±é½å¸¦æè®¤è¯å¤´ï¼
X-DEVOPS-BUILD-TYPE: æå»ºç±»åX-DEVOPS-PROJECT-ID: 项ç®IDX-DEVOPS-AGENT-ID: æå»ºæºIDX-DEVOPS-AGENT-SECRET-KEY: å¯é¥X-DEVOPS-BUILD-ID: æå»ºIDX-DEVOPS-VM-SEQ-ID: èææºåºå·
Q2: æä»¶æ§è¡å¤±è´¥å¦ä½ææ¥ï¼
- æ£æ¥
output.jsonè¾åº - æ¥ç Worker æ¥å¿ï¼æå»ºæºä¸ç
logs/ç®å½ï¼ - æ£æ¥æä»¶ SHA æ ¡éªæ¯å¦éè¿
- 确认æä»¶è¿è¡ç¯å¢ï¼Python/Node.js çæ¬çï¼
Q3: å¿è·³å¤±è´¥ä¼ææ ·ï¼
è¿ç» 12 次å¿è·³å¤±è´¥åï¼Worker ä¼èªå¨éåºï¼exitProcess(-1)ï¼ãæå¡ç«¯ä¼å°æå»ºæ 记为å¼å¸¸ç»æ¢ã
Q4: å¦ä½è°è¯ Workerï¼
- 设置ç¯å¢åé
DEVOPS_AGENT_LOG_DEBUG=trueå¼å¯è°è¯æ¥å¿ - 使ç¨
LoggerService.addDebugLine()è¾åºè°è¯ä¿¡æ¯ - æ£æ¥æå»ºæºä¸çæ¥å¿æä»¶
Q5: æä»¶å ç¼åæºå¶ï¼
- ç¬¬ä¸æ¹æå»ºæºï¼ç¼åå¨
{user.dir}/store/cache/plugins/ - å
Œ
±æå»ºæºï¼ç¼åå¨
{workspace}/../cache/store/cache/plugins/ - ç¼å Keyï¼
{atomCode}-{version}-{fileName} - æµè¯çæ¬æä»¶ä¸ç¼å
å½é å
Worker 模åçå½é åæä»¶ä½äºï¼
support-files/i18n/worker/message_zh_CN.propertiessupport-files/i18n/worker/message_en_US.properties
常éå®ä¹å¨ WorkerMessageCode.ktï¼
object WorkerMessageCode {
const val BK_PREPARE_TO_BUILD = "bkPrepareToRunBuild"
const val PARAMETER_ERROR = "parameterError"
const val UNKNOWN_ERROR = "unknownError"
const val AGENT_DNS_ERROR = "agentDnsError"
const val AGENT_NETWORK_TIMEOUT = "agentNetworkTimeout"
// ...
}