diff --git a/src/backend/ci/core/common/common-pipeline/src/main/kotlin/com/tencent/devops/common/pipeline/utils/BuildStatusSwitcher.kt b/src/backend/ci/core/common/common-pipeline/src/main/kotlin/com/tencent/devops/common/pipeline/utils/BuildStatusSwitcher.kt index 13e0f95c024..999e608b338 100644 --- a/src/backend/ci/core/common/common-pipeline/src/main/kotlin/com/tencent/devops/common/pipeline/utils/BuildStatusSwitcher.kt +++ b/src/backend/ci/core/common/common-pipeline/src/main/kotlin/com/tencent/devops/common/pipeline/utils/BuildStatusSwitcher.kt @@ -171,10 +171,10 @@ object BuildStatusSwitcher { BuildStatus.RUNNING, BuildStatus.CALL_WAITING, BuildStatus.REVIEWING, - BuildStatus.PAUSE, - BuildStatus.CANCELED, BuildStatus.REVIEW_ABORT, BuildStatus.REVIEW_PROCESSED, + BuildStatus.PAUSE, + BuildStatus.CANCELED, BuildStatus.SUCCEED, BuildStatus.FAILED, BuildStatus.TERMINATE, @@ -196,6 +196,7 @@ object BuildStatusSwitcher { BuildStatus.CANCELED, BuildStatus.SUCCEED, BuildStatus.FAILED, + BuildStatus.TERMINATE, BuildStatus.QUEUE_TIMEOUT, BuildStatus.STAGE_SUCCESS ) @@ -214,6 +215,7 @@ object BuildStatusSwitcher { BuildStatus.CANCELED, BuildStatus.SUCCEED, BuildStatus.FAILED, + BuildStatus.TERMINATE, BuildStatus.SKIP, BuildStatus.UNEXEC, BuildStatus.QUEUE_TIMEOUT, @@ -236,9 +238,9 @@ object BuildStatusSwitcher { BuildStatus.SUCCEED, BuildStatus.FAILED, BuildStatus.TERMINATE, - BuildStatus.QUEUE_TIMEOUT, BuildStatus.SKIP, BuildStatus.UNEXEC, + BuildStatus.QUEUE_TIMEOUT, BuildStatus.HEARTBEAT_TIMEOUT ) diff --git a/src/backend/ci/core/common/common-pipeline/src/test/kotlin/com/tencent/devops/common/pipeline/utils/BuildStatusSwitcherTest.kt b/src/backend/ci/core/common/common-pipeline/src/test/kotlin/com/tencent/devops/common/pipeline/utils/BuildStatusSwitcherTest.kt index 623b2fd4498..a887845d0c7 100644 --- a/src/backend/ci/core/common/common-pipeline/src/test/kotlin/com/tencent/devops/common/pipeline/utils/BuildStatusSwitcherTest.kt +++ b/src/backend/ci/core/common/common-pipeline/src/test/kotlin/com/tencent/devops/common/pipeline/utils/BuildStatusSwitcherTest.kt @@ -50,6 +50,12 @@ class BuildStatusSwitcherTest { BuildStatusSwitcher.pipelineStatusMaker.finish(status) ) } + status == BuildStatus.TERMINATE -> { + Assert.assertEquals( + BuildStatus.TERMINATE, + BuildStatusSwitcher.pipelineStatusMaker.finish(status) + ) + } status.isReadyToRun() -> { Assert.assertEquals(BuildStatus.CANCELED, BuildStatusSwitcher.pipelineStatusMaker.finish(status)) } @@ -123,8 +129,17 @@ class BuildStatusSwitcherTest { BuildStatusSwitcher.pipelineStatusMaker.forceFinish(status) ) } + status == BuildStatus.TERMINATE -> { + Assert.assertEquals( + BuildStatus.TERMINATE, + BuildStatusSwitcher.pipelineStatusMaker.forceFinish(status) + ) + } status.isFailure() -> { - Assert.assertEquals(BuildStatus.FAILED, BuildStatusSwitcher.pipelineStatusMaker.forceFinish(status)) + Assert.assertEquals( + BuildStatus.FAILED, + BuildStatusSwitcher.pipelineStatusMaker.forceFinish(status) + ) } status.isFinish() -> { Assert.assertTrue( diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/control/VmOperateTaskGenerator.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/control/VmOperateTaskGenerator.kt index b10de89a84b..e9c5d3195db 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/control/VmOperateTaskGenerator.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/control/VmOperateTaskGenerator.kt @@ -47,10 +47,20 @@ import javax.xml.bind.Element @Component class VmOperateTaskGenerator { - val startVmTaskAtom = "dispatchVMStartupTaskAtom" - val shutdownVmTaskAtom = "dispatchVMShutdownTaskAtom" - val startNormalTaskAtom = "dispatchBuildLessDockerStartupTaskAtom" - val shutdownNormalTaskAtom = "dispatchBuildLessDockerShutdownTaskAtom" + companion object { + const val START_VM_TASK_ATOM = "dispatchVMStartupTaskAtom" + const val SHUTDOWN_VM_TASK_ATOM = "dispatchVMShutdownTaskAtom" + const val START_NORMAL_TASK_ATOM = "dispatchBuildLessDockerStartupTaskAtom" + const val SHUTDOWN_NORMAL_TASK_ATOM = "dispatchBuildLessDockerShutdownTaskAtom" + + fun isVmAtom(task: PipelineBuildTask) = isStartVM(task) || isStopVM(task) + + fun isStartVM(task: PipelineBuildTask) = + task.taskAtom == START_VM_TASK_ATOM || task.taskAtom == START_NORMAL_TASK_ATOM + + fun isStopVM(task: PipelineBuildTask) = + task.taskAtom == SHUTDOWN_VM_TASK_ATOM || task.taskAtom == SHUTDOWN_NORMAL_TASK_ATOM + } /** * 生成编译环境的开机插件任务 @@ -75,15 +85,15 @@ class VmOperateTaskGenerator { if (container is VMBuildContainer) { val buildType = container.dispatchType?.buildType()?.name ?: BuildType.DOCKER.name val baseOS = container.baseOS.name - atomCode = "$startVmTaskAtom-$buildType-$baseOS" + atomCode = "$START_VM_TASK_ATOM-$buildType-$baseOS" taskType = EnvControlTaskType.VM.name taskName = "Prepare_Job#${container.id!!}" - taskAtom = startVmTaskAtom + taskAtom = START_VM_TASK_ATOM } else { - atomCode = startNormalTaskAtom + atomCode = START_NORMAL_TASK_ATOM taskType = EnvControlTaskType.NORMAL.name taskName = "Prepare_Job#${container.id!!}(N)" - taskAtom = startNormalTaskAtom + taskAtom = START_NORMAL_TASK_ATOM } return PipelineBuildTask( @@ -131,10 +141,10 @@ class VmOperateTaskGenerator { val taskAtom: String if (container is VMBuildContainer) { taskType = EnvControlTaskType.VM.name - taskAtom = shutdownVmTaskAtom + taskAtom = SHUTDOWN_VM_TASK_ATOM } else { taskType = EnvControlTaskType.NORMAL.name - taskAtom = shutdownNormalTaskAtom + taskAtom = SHUTDOWN_NORMAL_TASK_ATOM } val containerId = container.id!! @@ -166,7 +176,7 @@ class VmOperateTaskGenerator { approver = null, subBuildId = null, additionalOptions = additionalOptions, - atomCode = "$shutdownVmTaskAtom-END" + atomCode = "$SHUTDOWN_VM_TASK_ATOM-END" ) ) @@ -198,7 +208,7 @@ class VmOperateTaskGenerator { approver = null, subBuildId = null, additionalOptions = additionalOptions, - atomCode = "$shutdownVmTaskAtom-FINISH" + atomCode = "$SHUTDOWN_VM_TASK_ATOM-FINISH" ) ) diff --git a/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/atom/TaskAtomService.kt b/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/atom/TaskAtomService.kt index 16e50c76374..6ec4e0c7485 100644 --- a/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/atom/TaskAtomService.kt +++ b/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/atom/TaskAtomService.kt @@ -37,6 +37,7 @@ import com.tencent.devops.common.log.utils.BuildLogPrinter import com.tencent.devops.common.pipeline.enums.BuildStatus import com.tencent.devops.common.service.utils.CommonUtils import com.tencent.devops.common.service.utils.SpringContextUtil +import com.tencent.devops.process.engine.control.VmOperateTaskGenerator import com.tencent.devops.process.engine.exception.BuildTaskException import com.tencent.devops.process.engine.pojo.PipelineBuildTask import com.tencent.devops.process.engine.service.PipelineBuildDetailService @@ -70,6 +71,9 @@ class TaskAtomService @Autowired(required = false) constructor( jmxElements.execute(task.taskType) var atomResponse = AtomResponse(BuildStatus.FAILED) try { + if (!VmOperateTaskGenerator.isVmAtom(task)) { + dispatchBroadCastEvent(task, ActionType.START) + } // 更新状态 pipelineRuntimeService.updateTaskStatus( task = task, @@ -110,6 +114,20 @@ class TaskAtomService @Autowired(required = false) constructor( return atomResponse } + private fun dispatchBroadCastEvent(task: PipelineBuildTask, actionType: ActionType) { + pipelineEventDispatcher.dispatch( + PipelineBuildStatusBroadCastEvent( + source = "task-${task.taskId}", + projectId = task.projectId, + pipelineId = task.pipelineId, + userId = task.starter, + taskId = task.taskId, + buildId = task.buildId, + actionType = actionType + ) + ) + } + /** * 插件启动之后的处理,根据插件返回的结果[atomResponse]判断是否要结束任务[task] */ @@ -169,17 +187,11 @@ class TaskAtomService @Autowired(required = false) constructor( } catch (ignored: Throwable) { logger.warn("Fail to post the task($task): ${ignored.message}") } - pipelineEventDispatcher.dispatch( - PipelineBuildStatusBroadCastEvent( - source = "task-end-${task.taskId}", - projectId = task.projectId, - pipelineId = task.pipelineId, - userId = task.starter, - taskId = task.taskId, - buildId = task.buildId, - actionType = ActionType.END - ) - ) + + if (!VmOperateTaskGenerator.isVmAtom(task)) { + dispatchBroadCastEvent(task, ActionType.END) + } + buildLogPrinter.stopLog( buildId = task.buildId, tag = task.taskId, diff --git a/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/control/TaskControl.kt b/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/control/TaskControl.kt index 124771c9ea5..960aec85d10 100644 --- a/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/control/TaskControl.kt +++ b/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/control/TaskControl.kt @@ -109,7 +109,11 @@ class TaskControl @Autowired constructor( // 构建机上运行中任务目前无法直接后台干预,便在此处设置状态,使流程继续 if (actionType.isEnd()) { LOG.info("ENGINE|$buildId|$source|ATOM_$actionType|$stageId|j($containerId)|t($taskId)|code=$errorCode") - val buildStatus = BuildStatus.CANCELED + val buildStatus = if (actionType.isTerminate()) { // 区分系统终止还是用户手动终止 + BuildStatus.TERMINATE + } else { + BuildStatus.CANCELED + } val atomResponse = AtomResponse( buildStatus = buildStatus, errorCode = errorCode, diff --git a/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/listener/run/PipelineTaskPauseListener.kt b/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/listener/run/PipelineTaskPauseListener.kt index 5cd3bb36185..4f0bb5939d5 100644 --- a/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/listener/run/PipelineTaskPauseListener.kt +++ b/src/backend/ci/core/process/biz-engine/src/main/kotlin/com/tencent/devops/process/engine/listener/run/PipelineTaskPauseListener.kt @@ -74,7 +74,7 @@ class PipelineTaskPauseListener @Autowired constructor( redisLock.lock() if (event.actionType == ActionType.REFRESH) { taskContinue(task = taskRecord!!, userId = event.userId) - } else if (event.actionType == ActionType.TERMINATE) { + } else if (event.actionType == ActionType.END) { taskCancel(task = taskRecord!!, userId = event.userId) } // #3400 减少重复DETAIL事件转发, Cancel与Continue之后插件任务执行都会刷新DETAIL diff --git a/src/backend/ci/core/process/biz-engine/src/test/kotlin/com/tencent/devops/process/engine/control/DependOnControlTest.kt b/src/backend/ci/core/process/biz-engine/src/test/kotlin/com/tencent/devops/process/engine/control/DependOnControlTest.kt index 6e1cce00ef7..23f4fc1bc44 100644 --- a/src/backend/ci/core/process/biz-engine/src/test/kotlin/com/tencent/devops/process/engine/control/DependOnControlTest.kt +++ b/src/backend/ci/core/process/biz-engine/src/test/kotlin/com/tencent/devops/process/engine/control/DependOnControlTest.kt @@ -61,12 +61,12 @@ class DependOnControlTest { fun `when dependOnContainerId2JobIds is null return success`() { val dependContainerId = 2 val status2 = BuildStatus.RUNNING - val mockJob = TestTool.genVmBuildContainer(id = 1, + val mockJob = TestTool.genVmBuildContainer(vmSeqId = 1, jobControlOption = JobControlOption(dependOnContainerId2JobIds = null) ) val mockContainers = listOf( - TestTool.genVmBuildContainer(id = dependContainerId).copy(status = status2) + TestTool.genVmBuildContainer(vmSeqId = dependContainerId).copy(status = status2) ) whenever(pipelineRuntimeService.listContainers(TestTool.buildId, TestTool.stageId)).thenReturn(mockContainers) Assert.assertEquals(BuildStatus.SUCCEED, dependOnControl.dependOnJobStatus(container = mockJob)) @@ -76,14 +76,14 @@ class DependOnControlTest { fun `when depend on job is running then return running`() { val dependContainerId = 2 val status2 = BuildStatus.RUNNING - val mockJob = TestTool.genVmBuildContainer(id = 1, + val mockJob = TestTool.genVmBuildContainer(vmSeqId = 1, jobControlOption = JobControlOption( dependOnContainerId2JobIds = mapOf(dependContainerId.toString() to "jobId2") ) ) val mockContainers = listOf( - TestTool.genVmBuildContainer(id = dependContainerId).copy(status = status2) + TestTool.genVmBuildContainer(vmSeqId = dependContainerId).copy(status = status2) ) whenever(pipelineRuntimeService.listContainers(TestTool.buildId, TestTool.stageId)).thenReturn(mockContainers) Assert.assertEquals(status2, dependOnControl.dependOnJobStatus(container = mockJob)) @@ -93,14 +93,14 @@ class DependOnControlTest { fun `when depend on job is failed then return failed`() { val dependContainerId = 2 val status2 = BuildStatus.FAILED - val mockJob = TestTool.genVmBuildContainer(id = 1, + val mockJob = TestTool.genVmBuildContainer(vmSeqId = 1, jobControlOption = JobControlOption( dependOnContainerId2JobIds = mapOf(dependContainerId.toString() to "jobId2") ) ) val mockContainers = listOf( - TestTool.genVmBuildContainer(id = dependContainerId).copy(status = status2) + TestTool.genVmBuildContainer(vmSeqId = dependContainerId).copy(status = status2) ) whenever(pipelineRuntimeService.listContainers(TestTool.buildId, TestTool.stageId)).thenReturn(mockContainers) val dependOnJobStatus = dependOnControl.dependOnJobStatus(container = mockJob) @@ -111,7 +111,7 @@ class DependOnControlTest { fun `when depend on job is running or success then return running`() { val dependContainerId = 2 val dependContainerId3 = 3 - val mockJob = TestTool.genVmBuildContainer(id = 1, + val mockJob = TestTool.genVmBuildContainer(vmSeqId = 1, jobControlOption = JobControlOption( dependOnContainerId2JobIds = mapOf("2" to "jobId2").plus("3" to "jobId3") ), status = BuildStatus.RUNNING @@ -119,16 +119,16 @@ class DependOnControlTest { whenever(pipelineRuntimeService.listContainers(TestTool.buildId, TestTool.stageId)).thenReturn( listOf( - TestTool.genVmBuildContainer(id = dependContainerId).copy(status = BuildStatus.RUNNING), - TestTool.genVmBuildContainer(id = dependContainerId3).copy(status = BuildStatus.SUCCEED) + TestTool.genVmBuildContainer(vmSeqId = dependContainerId).copy(status = BuildStatus.RUNNING), + TestTool.genVmBuildContainer(vmSeqId = dependContainerId3).copy(status = BuildStatus.SUCCEED) ) ) Assert.assertEquals(BuildStatus.RUNNING, dependOnControl.dependOnJobStatus(container = mockJob)) whenever(pipelineRuntimeService.listContainers(TestTool.buildId, TestTool.stageId)).thenReturn( listOf( - TestTool.genVmBuildContainer(id = dependContainerId).copy(status = BuildStatus.SUCCEED), - TestTool.genVmBuildContainer(id = dependContainerId3).copy(status = BuildStatus.SUCCEED) + TestTool.genVmBuildContainer(vmSeqId = dependContainerId).copy(status = BuildStatus.SUCCEED), + TestTool.genVmBuildContainer(vmSeqId = dependContainerId3).copy(status = BuildStatus.SUCCEED) ) ) Assert.assertEquals(BuildStatus.SUCCEED, dependOnControl.dependOnJobStatus(container = mockJob)) @@ -136,8 +136,8 @@ class DependOnControlTest { // when fail whenever(pipelineRuntimeService.listContainers(TestTool.buildId, TestTool.stageId)).thenReturn( listOf( - TestTool.genVmBuildContainer(id = dependContainerId).copy(status = BuildStatus.RUNNING), - TestTool.genVmBuildContainer(id = dependContainerId3).copy(status = BuildStatus.FAILED) + TestTool.genVmBuildContainer(vmSeqId = dependContainerId).copy(status = BuildStatus.RUNNING), + TestTool.genVmBuildContainer(vmSeqId = dependContainerId3).copy(status = BuildStatus.FAILED) ) ) Assert.assertEquals(BuildStatus.FAILED, dependOnControl.dependOnJobStatus(container = mockJob)) diff --git a/src/backend/ci/core/process/biz-engine/src/test/kotlin/com/tencent/devops/process/engine/control/VmOperateTaskGeneratorTest.kt b/src/backend/ci/core/process/biz-engine/src/test/kotlin/com/tencent/devops/process/engine/control/VmOperateTaskGeneratorTest.kt new file mode 100644 index 00000000000..b98f38dd664 --- /dev/null +++ b/src/backend/ci/core/process/biz-engine/src/test/kotlin/com/tencent/devops/process/engine/control/VmOperateTaskGeneratorTest.kt @@ -0,0 +1,85 @@ +/* + * Tencent is pleased to support the open source community by making BK-CI 蓝鲸持续集成平台 available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * BK-CI 蓝鲸持续集成平台 is licensed under the MIT license. + * + * A copy of the MIT License is included in this file. + * + * + * Terms of the MIT License: + * --------------------------------------------------- + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT + * LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package com.tencent.devops.process.engine.control + +import com.tencent.devops.process.engine.utils.TestTool +import org.junit.Assert +import org.junit.Test + +class VmOperateTaskGeneratorTest { + + @Test + fun checkVMAtom() { + val ops = TestTool.elementAdditionalOptions() + val container = TestTool.genVmBuildContainer() + var genTask = TestTool.genTask( + taskId = "", + taskAtom = "mock", + vmContainer = container, + elementAdditionalOptions = ops + ) + Assert.assertFalse(VmOperateTaskGenerator.isStartVM(genTask)) + Assert.assertFalse(VmOperateTaskGenerator.isStopVM(genTask)) + + genTask = TestTool.genTask( + taskId = "", + taskAtom = VmOperateTaskGenerator.START_VM_TASK_ATOM, + vmContainer = container, + elementAdditionalOptions = ops + ) + Assert.assertTrue(VmOperateTaskGenerator.isStartVM(genTask)) + Assert.assertTrue(VmOperateTaskGenerator.isVmAtom(genTask)) + + genTask = TestTool.genTask( + taskId = "", + taskAtom = VmOperateTaskGenerator.START_NORMAL_TASK_ATOM, + vmContainer = container, + elementAdditionalOptions = ops + ) + Assert.assertTrue(VmOperateTaskGenerator.isStartVM(genTask)) + Assert.assertTrue(VmOperateTaskGenerator.isVmAtom(genTask)) + + genTask = TestTool.genTask( + taskId = "", + taskAtom = VmOperateTaskGenerator.SHUTDOWN_NORMAL_TASK_ATOM, + vmContainer = container, + elementAdditionalOptions = ops + ) + Assert.assertTrue(VmOperateTaskGenerator.isStopVM(genTask)) + Assert.assertTrue(VmOperateTaskGenerator.isVmAtom(genTask)) + + genTask = TestTool.genTask( + taskId = "", + taskAtom = VmOperateTaskGenerator.SHUTDOWN_VM_TASK_ATOM, + vmContainer = container, + elementAdditionalOptions = ops + ) + Assert.assertTrue(VmOperateTaskGenerator.isStopVM(genTask)) + Assert.assertTrue(VmOperateTaskGenerator.isVmAtom(genTask)) + } +} diff --git a/src/backend/ci/core/process/biz-engine/src/test/kotlin/com/tencent/devops/process/engine/utils/TestTool.kt b/src/backend/ci/core/process/biz-engine/src/test/kotlin/com/tencent/devops/process/engine/utils/TestTool.kt index 3d6b43381b6..df9df73e492 100644 --- a/src/backend/ci/core/process/biz-engine/src/test/kotlin/com/tencent/devops/process/engine/utils/TestTool.kt +++ b/src/backend/ci/core/process/biz-engine/src/test/kotlin/com/tencent/devops/process/engine/utils/TestTool.kt @@ -45,12 +45,11 @@ object TestTool { const val buildId = "b-12345678901234567890123456789012" const val pipelineId = "p-12345678901234567890123456789012" const val stageId = "stage-1" - const val firstContainerId = "1" private const val firstContainerIdInt = 1 fun genVmBuildContainer( jobControlOption: JobControlOption? = null, - id: Int? = firstContainerIdInt, + vmSeqId: Int = firstContainerIdInt, status: BuildStatus = BuildStatus.RUNNING ): PipelineBuildContainer { val vmContainerType = "vmBuild" @@ -61,8 +60,8 @@ object TestTool { pipelineId = pipelineId, buildId = buildId, stageId = stageId, - containerId = id?.toString() ?: firstContainerId, - seq = id ?: firstContainerIdInt, + containerId = vmSeqId.toString(), + seq = vmSeqId, containerType = vmContainerType, status = status, startTime = startTime, @@ -80,16 +79,29 @@ object TestTool { fun genTask( taskId: String, vmContainer: PipelineBuildContainer, - elementAdditionalOptions: ElementAdditionalOptions? = null + elementAdditionalOptions: ElementAdditionalOptions? = null, + taskAtom: String = "" ): PipelineBuildTask { with(vmContainer) { return PipelineBuildTask( - projectId = projectId, pipelineId = pipelineId, buildId = buildId, - containerType = vmContainer.containerType, containerId = containerId, - startTime = startTime?.plusSeconds(vmContainer.cost.toLong()), status = status, stageId = stageId, - taskId = taskId, taskAtom = "", taskName = "Demo", taskParams = mutableMapOf(), taskSeq = 1, - taskType = vmContainer.containerType, starter = "user1", - containerHashId = containerId, approver = null, subBuildId = null, + projectId = projectId, + pipelineId = pipelineId, + buildId = buildId, + containerType = vmContainer.containerType, + containerId = containerId, + startTime = startTime?.plusSeconds(vmContainer.cost.toLong()), + status = status, + stageId = stageId, + taskId = taskId, + taskAtom = taskAtom, + taskName = "Demo", + taskParams = mutableMapOf(), + taskSeq = 1, + taskType = vmContainer.containerType, + starter = "user1", + containerHashId = containerId, + approver = null, + subBuildId = null, additionalOptions = elementAdditionalOptions ?: elementAdditionalOptions() ) } diff --git a/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/builds/PipelinePauseBuildFacadeService.kt b/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/builds/PipelinePauseBuildFacadeService.kt index 85327aeb087..d073cce25e4 100644 --- a/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/builds/PipelinePauseBuildFacadeService.kt +++ b/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/builds/PipelinePauseBuildFacadeService.kt @@ -125,7 +125,7 @@ class PipelinePauseBuildFacadeService( var actionType = ActionType.REFRESH if (!isContinue) { - actionType = ActionType.TERMINATE + actionType = ActionType.END // END才会对应成取消状态 } val isDiff = findDiffValue( diff --git a/src/backend/ci/core/worker/worker-agent/src/main/kotlin/com/tencent/devops/agent/AgentVersion.kt b/src/backend/ci/core/worker/worker-agent/src/main/kotlin/com/tencent/devops/agent/AgentVersion.kt index aeff802e2f3..691cf1139bd 100644 --- a/src/backend/ci/core/worker/worker-agent/src/main/kotlin/com/tencent/devops/agent/AgentVersion.kt +++ b/src/backend/ci/core/worker/worker-agent/src/main/kotlin/com/tencent/devops/agent/AgentVersion.kt @@ -27,7 +27,7 @@ package com.tencent.devops.agent -const val AGENT_VERSION = 12.31 // 此处不能以0结束 +const val AGENT_VERSION = 12.35 // 此处不能以0结束 fun main() { println(AGENT_VERSION) diff --git a/src/backend/ci/core/worker/worker-common/src/main/kotlin/com/tencent/devops/worker/common/Runner.kt b/src/backend/ci/core/worker/worker-common/src/main/kotlin/com/tencent/devops/worker/common/Runner.kt index b5fb8639894..b435d4c671a 100644 --- a/src/backend/ci/core/worker/worker-common/src/main/kotlin/com/tencent/devops/worker/common/Runner.kt +++ b/src/backend/ci/core/worker/worker-common/src/main/kotlin/com/tencent/devops/worker/common/Runner.kt @@ -58,6 +58,9 @@ import kotlin.system.exitProcess object Runner { + private const val maxSleepStep = 50L + private const val windows = 5L + private const val millsStep = 100L private val logger = LoggerFactory.getLogger(Runner::class.java) fun run(workspaceInterface: WorkspaceInterface, systemExit: Boolean = true) { @@ -131,6 +134,7 @@ object Runner { LoggerService.addNormalLine("Start the runner at workspace(${workspacePathFile.absolutePath})") logger.info("Start the runner at workspace(${workspacePathFile.absolutePath})") + var waitCount = 0 loop@ while (true) { logger.info("Start to claim the task") val buildTask = EngineService.claimTask() @@ -156,15 +160,24 @@ object Runner { val buildTaskRst = taskDaemon.getBuildResult() EngineService.completeTask(buildTaskRst) logger.info("Finish completing the task ($buildTask)") - } catch (exception: Throwable) { + } catch (ignore: Throwable) { failed = true - dealException(exception, buildTask, taskDaemon) + dealException(ignore, buildTask, taskDaemon) } finally { LoggerService.finishTask() LoggerService.elementId = "" + waitCount = 0 } } - BuildTaskStatus.WAIT -> Thread.sleep(5000) + BuildTaskStatus.WAIT -> { + var sleepStep = waitCount++ / windows + if (sleepStep <= 0) { + sleepStep = 1 + } + val sleepMills = sleepStep.coerceAtMost(maxSleepStep) * millsStep + logger.info("WAIT $sleepMills ms") + Thread.sleep(sleepMills) + } BuildTaskStatus.END -> break@loop } } @@ -191,8 +204,8 @@ object Runner { if (!file.deleteRecursively()) { logger.warn("Fail to clean up the workspace") } - } catch (e: Exception) { - logger.error("Fail to clean up the workspace.", e) + } catch (ignore: Exception) { + logger.error("Fail to clean up the workspace.", ignore) } } }