diff --git a/src/backend/ci/core/process/api-process/src/main/kotlin/com/tencent/devops/process/pojo/pipeline/PipelineResourceVersion.kt b/src/backend/ci/core/process/api-process/src/main/kotlin/com/tencent/devops/process/pojo/pipeline/PipelineResourceVersion.kt index 6913dcf87595..e59ad303eb70 100644 --- a/src/backend/ci/core/process/api-process/src/main/kotlin/com/tencent/devops/process/pojo/pipeline/PipelineResourceVersion.kt +++ b/src/backend/ci/core/process/api-process/src/main/kotlin/com/tencent/devops/process/pojo/pipeline/PipelineResourceVersion.kt @@ -46,7 +46,7 @@ data class PipelineResourceVersion( @get:Schema(title = "记录版本号", required = true) val version: Int, @get:Schema(title = "JSON编排内容(POJO)", required = true) - val model: Model, + var model: Model, @get:Schema(title = "YAML编排内容", required = false) var yaml: String?, @get:Schema(title = "YAML编排版本", required = false) diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/PipelineRepositoryService.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/PipelineRepositoryService.kt index d2c8de761ea0..ed4a126cd716 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/PipelineRepositoryService.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/engine/service/PipelineRepositoryService.kt @@ -85,6 +85,7 @@ import com.tencent.devops.process.engine.cfg.PipelineIdGenerator import com.tencent.devops.process.engine.cfg.VersionConfigure import com.tencent.devops.process.engine.common.VMUtils import com.tencent.devops.process.engine.control.lock.PipelineModelLock +import com.tencent.devops.process.engine.control.lock.PipelineReleaseLock import com.tencent.devops.process.engine.dao.PipelineBuildSummaryDao import com.tencent.devops.process.engine.dao.PipelineInfoDao import com.tencent.devops.process.engine.dao.PipelineModelTaskDao @@ -1346,6 +1347,65 @@ class PipelineRepositoryService constructor( ).map { it.key to str2model(it.value, it.key) }.toMap() } + /** + * 获取所有本次构建触发需要的信息 + * 并在获取过程中增加并发锁,防止流水线发布版本期间触发读取脏数据 + */ + fun getBuildTriggerInfo( + projectId: String, + pipelineId: String, + version: Int? + ): Triple { + PipelineReleaseLock(redisOperation, pipelineId).use { + val pipelineInfo = getPipelineInfo( + projectId = projectId, + pipelineId = pipelineId + ) ?: throw ErrorCodeException( + statusCode = Response.Status.NOT_FOUND.statusCode, + errorCode = ProcessMessageCode.ERROR_PIPELINE_NOT_EXISTS, + params = arrayOf(pipelineId) + ) + if (version == null) { + val defaultVersion = getPipelineResourceVersion( + projectId = projectId, + pipelineId = pipelineId + ) ?: throw ErrorCodeException( + statusCode = Response.Status.NOT_FOUND.statusCode, + errorCode = ProcessMessageCode.ERROR_NO_PIPELINE_EXISTS_BY_ID, + params = arrayOf(pipelineId) + ) + // 正式执行时,当前最新版本可能是草稿,则作为调试执行 + return Triple( + pipelineInfo, + defaultVersion, + defaultVersion.status == VersionStatus.COMMITTING + ) + } else { + val targetResource = getPipelineResourceVersion( + projectId = projectId, + pipelineId = pipelineId, + version = version + ) ?: throw ErrorCodeException( + statusCode = Response.Status.NOT_FOUND.statusCode, + errorCode = ProcessMessageCode.ERROR_NO_PIPELINE_VERSION_EXISTS_BY_ID, + params = arrayOf(version.toString()) + ) + return if (targetResource.status == VersionStatus.COMMITTING) { + Triple(pipelineInfo, targetResource, true) + } else { + val releaseVersion = getPipelineResourceVersion( + projectId = projectId, + pipelineId = pipelineId + ) ?: throw ErrorCodeException( + statusCode = Response.Status.NOT_FOUND.statusCode, + errorCode = ProcessMessageCode.ERROR_PIPELINE_MODEL_NOT_EXISTS + ) + Triple(pipelineInfo, releaseVersion, false) + } + } + } + } + /** * 获取编排版本的通用方法 * 1 如果指定了[version]则一定按照version号查询版本 @@ -1356,25 +1416,26 @@ class PipelineRepositoryService constructor( projectId: String, pipelineId: String, version: Int? = null, - includeDraft: Boolean? = false + includeDraft: Boolean? = false, + queryDslContext: DSLContext? = null ): PipelineResourceVersion? { // TODO 取不到则直接从旧版本表读,待下架 val resource = if (version == null) { if (includeDraft == true) pipelineResourceVersionDao.getDraftVersionResource( - dslContext = dslContext, + dslContext = queryDslContext ?: dslContext, projectId = projectId, pipelineId = pipelineId ) else null } else { pipelineResourceVersionDao.getVersionResource( - dslContext = dslContext, + dslContext = queryDslContext ?: dslContext, projectId = projectId, pipelineId = pipelineId, version = version, includeDraft = includeDraft ) } ?: pipelineResourceDao.getReleaseVersionResource( - dslContext = dslContext, + dslContext = queryDslContext ?: dslContext, projectId = projectId, pipelineId = pipelineId ) @@ -1405,7 +1466,7 @@ class PipelineRepositoryService constructor( } } pipelineCallbackDao.list( - dslContext = dslContext, + dslContext = queryDslContext ?: dslContext, projectId = projectId, pipelineId = pipelineId, event = null diff --git a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/service/pipeline/PipelineBuildService.kt b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/service/pipeline/PipelineBuildService.kt index 589a7dedc577..6c487ca2caea 100644 --- a/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/service/pipeline/PipelineBuildService.kt +++ b/src/backend/ci/core/process/biz-base/src/main/kotlin/com/tencent/devops/process/service/pipeline/PipelineBuildService.kt @@ -35,7 +35,6 @@ import com.tencent.devops.common.api.util.JsonUtil import com.tencent.devops.common.audit.ActionAuditContent import com.tencent.devops.common.auth.api.ActionId import com.tencent.devops.common.auth.api.ResourceTypeId -import com.tencent.devops.common.pipeline.Model import com.tencent.devops.common.pipeline.dialect.PipelineDialectUtil import com.tencent.devops.common.pipeline.enums.BuildFormPropertyType import com.tencent.devops.common.pipeline.enums.ChannelCode @@ -55,6 +54,7 @@ import com.tencent.devops.process.engine.service.PipelineRepositoryService import com.tencent.devops.process.engine.service.PipelineRuntimeService import com.tencent.devops.process.pojo.BuildId import com.tencent.devops.process.pojo.app.StartBuildContext +import com.tencent.devops.process.pojo.pipeline.PipelineResourceVersion import com.tencent.devops.process.service.PipelineAsCodeService import com.tencent.devops.process.service.ProjectCacheService import com.tencent.devops.process.util.BuildMsgUtils @@ -128,8 +128,7 @@ class PipelineBuildService( pipelineParamMap: MutableMap, channelCode: ChannelCode, isMobile: Boolean, - model: Model, - yamlVersion: String?, + resource: PipelineResourceVersion, signPipelineVersion: Int? = null, // 指定的版本 frequencyLimit: Boolean = true, buildNo: Int? = null, @@ -137,8 +136,7 @@ class PipelineBuildService( handlePostFlag: Boolean = true, webHookStartParam: MutableMap = mutableMapOf(), triggerReviewers: List? = null, - debug: Boolean? = false, - versionName: String? = null + debug: Boolean? = false ): BuildId { var acquire = false @@ -195,11 +193,11 @@ class PipelineBuildService( // 如果指定了版本号,则设置指定的版本号 pipeline.version = signPipelineVersion ?: pipeline.version - val originModelStr = JsonUtil.toJson(model, formatted = false) + val originModelStr = JsonUtil.toJson(resource.model, formatted = false) // 只有新构建才需要填充Post插件与质量红线插件 if (!pipelineParamMap.containsKey(PIPELINE_RETRY_BUILD_ID)) { pipelineElementService.fillElementWhenNewBuild( - model = model, + model = resource.model, projectId = pipeline.projectId, pipelineId = pipeline.pipelineId, startValues = startValues, @@ -243,16 +241,17 @@ class PipelineBuildService( pipelineParamMap = pipelineParamMap, webHookStartParam = webHookStartParam, // 解析出定义的流水线变量 - realStartParamKeys = model.getTriggerContainer().params.map { it.id }, + realStartParamKeys = resource.model.getTriggerContainer() + .params.map { it.id }, debug = debug ?: false, - versionName = versionName, - yamlVersion = yamlVersion + versionName = resource.versionName, + yamlVersion = resource.yamlVersion ) val interceptResult = pipelineInterceptorChain.filter( InterceptData( pipelineInfo = pipeline, - model = model, + model = resource.model, startType = startType, buildId = buildId, runLockType = setting.runLockType, @@ -272,7 +271,7 @@ class PipelineBuildService( ) } - return pipelineRuntimeService.startBuild(fullModel = model, context = context) + return pipelineRuntimeService.startBuild(fullModel = resource.model, context = context) } finally { if (acquire) { simpleRateLimiter.release(lockKey = lockKey) diff --git a/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/SubPipelineStartUpService.kt b/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/SubPipelineStartUpService.kt index eb6478b5829c..33c3fe35e123 100644 --- a/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/SubPipelineStartUpService.kt +++ b/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/SubPipelineStartUpService.kt @@ -224,21 +224,15 @@ class SubPipelineStartUpService @Autowired constructor( runMode: String, parentExecuteCount: Int? ): BuildId { - - val readyToBuildPipelineInfo = pipelineRepositoryService.getPipelineInfo(projectId, pipelineId, channelCode) - ?: throw ErrorCodeException( - statusCode = Response.Status.NOT_FOUND.statusCode, - params = arrayOf(pipelineId), - errorCode = ProcessMessageCode.ERROR_PIPELINE_NOT_EXISTS - ) + val (readyToBuildPipelineInfo, resource, _) = pipelineRepositoryService.getBuildTriggerInfo( + projectId, pipelineId, null + ) if (readyToBuildPipelineInfo.locked == true) { throw ErrorCodeException(errorCode = ProcessMessageCode.ERROR_PIPELINE_LOCK) } - if (readyToBuildPipelineInfo.latestVersionStatus?.isNotReleased() == true) { - throw ErrorCodeException( - errorCode = ProcessMessageCode.ERROR_NO_RELEASE_PIPELINE_VERSION - ) - } + if (readyToBuildPipelineInfo.latestVersionStatus?.isNotReleased() == true) throw ErrorCodeException( + errorCode = ProcessMessageCode.ERROR_NO_RELEASE_PIPELINE_VERSION + ) val parentPipelineInfo = pipelineRepositoryService.getPipelineInfo( projectId = parentProjectId, pipelineId = parentPipelineId @@ -259,15 +253,7 @@ class SubPipelineStartUpService @Autowired constructor( val startEpoch = System.currentTimeMillis() try { - val resource = pipelineRepositoryService.getPipelineResourceVersion( - projectId, pipelineId, readyToBuildPipelineInfo.version - ) ?: throw ErrorCodeException( - statusCode = Response.Status.NOT_FOUND.statusCode, - errorCode = ProcessMessageCode.ERROR_PIPELINE_MODEL_NOT_EXISTS - ) - val model = resource.model - - val triggerContainer = model.getTriggerContainer() + val triggerContainer = resource.model.getTriggerContainer() // #6090 拨乱反正 val params = buildParamCompatibilityTransformer.parseTriggerParam( userId = userId, projectId = projectId, pipelineId = pipelineId, @@ -335,10 +321,8 @@ class SubPipelineStartUpService @Autowired constructor( pipelineParamMap = params, channelCode = channelCode, isMobile = isMobile, - model = model, - frequencyLimit = false, - versionName = resource.versionName, - yamlVersion = resource.yamlVersion + resource = resource, + frequencyLimit = false ) // 更新父流水线关联子流水线构建id pipelineTaskService.updateSubBuildId( @@ -354,13 +338,6 @@ class SubPipelineStartUpService @Autowired constructor( } } - private fun getModel(projectId: String, pipelineId: String, version: Int? = null) = - pipelineRepositoryService.getPipelineResourceVersion(projectId, pipelineId, version)?.model - ?: throw ErrorCodeException( - statusCode = Response.Status.NOT_FOUND.statusCode, - errorCode = ProcessMessageCode.ERROR_PIPELINE_MODEL_NOT_EXISTS - ) - /** * 解析子流水线启动参数 * @param value 子流水线启动参数 diff --git a/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/builds/PipelineBuildFacadeService.kt b/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/builds/PipelineBuildFacadeService.kt index 0da420814fef..8844d3142430 100644 --- a/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/builds/PipelineBuildFacadeService.kt +++ b/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/builds/PipelineBuildFacadeService.kt @@ -57,7 +57,6 @@ import com.tencent.devops.common.pipeline.enums.BuildStatus import com.tencent.devops.common.pipeline.enums.ChannelCode import com.tencent.devops.common.pipeline.enums.ManualReviewAction import com.tencent.devops.common.pipeline.enums.StartType -import com.tencent.devops.common.pipeline.enums.VersionStatus import com.tencent.devops.common.pipeline.pojo.BuildFormProperty import com.tencent.devops.common.pipeline.pojo.BuildFormValue import com.tencent.devops.common.pipeline.pojo.BuildParameters @@ -125,7 +124,6 @@ import com.tencent.devops.process.pojo.pipeline.BuildRecordInfo import com.tencent.devops.process.pojo.pipeline.ModelDetail import com.tencent.devops.process.pojo.pipeline.ModelRecord import com.tencent.devops.process.pojo.pipeline.PipelineLatestBuild -import com.tencent.devops.process.pojo.pipeline.PipelineResourceVersion import com.tencent.devops.process.service.BuildVariableService import com.tencent.devops.process.service.ParamFacadeService import com.tencent.devops.process.service.PipelineTaskPauseService @@ -228,15 +226,16 @@ class PipelineBuildFacadeService( ) ) } - pipelineRepositoryService.getPipelineInfo(projectId, pipelineId, channelCode) - ?: throw ErrorCodeException( - statusCode = Response.Status.NOT_FOUND.statusCode, - errorCode = ProcessMessageCode.ERROR_PIPELINE_NOT_EXISTS, - params = arrayOf(pipelineId) - ) - val (resource, debug) = getModelAndBuildLevel(projectId, pipelineId, version) - val model = resource.model - val triggerContainer = model.getTriggerContainer() + val (pipeline, resource, debug) = pipelineRepositoryService.getBuildTriggerInfo( + projectId, pipelineId, null + ) + if (pipeline.locked == true) { + throw ErrorCodeException(errorCode = ProcessMessageCode.ERROR_PIPELINE_LOCK) + } + if (pipeline.latestVersionStatus?.isNotReleased() == true) throw ErrorCodeException( + errorCode = ProcessMessageCode.ERROR_NO_RELEASE_PIPELINE_VERSION + ) + val triggerContainer = resource.model.getTriggerContainer() var canManualStartup = false var canElementSkip = false @@ -425,30 +424,27 @@ class PipelineBuildFacadeService( projectId = projectId, pipelineId = pipelineId, buildId = buildId, - executeCount = buildInfo.executeCount ?: 1, + executeCount = buildInfo.executeCount, resourceVersion = buildInfo.version, taskId = taskId, skipFailedTask = skipFailedTask ) ) { - return BuildId(buildId, buildInfo.executeCount ?: 1, projectId, pipelineId) + return BuildId(buildId, buildInfo.executeCount, projectId, pipelineId) } throw ErrorCodeException(errorCode = ProcessMessageCode.ERROR_DUPLICATE_BUILD_RETRY_ACT) } - val readyToBuildPipelineInfo = - pipelineRepositoryService.getPipelineInfo(projectId, pipelineId, channelCode) - ?: throw ErrorCodeException( - statusCode = Response.Status.NOT_FOUND.statusCode, - errorCode = ProcessMessageCode.ERROR_PIPELINE_NOT_EXISTS, - params = arrayOf(buildId) - ) + val (readyToBuildPipelineInfo, resource, _) = pipelineRepositoryService.getBuildTriggerInfo( + projectId, pipelineId, buildInfo.version + ) if (readyToBuildPipelineInfo.locked == true) { throw ErrorCodeException(errorCode = ProcessMessageCode.ERROR_PIPELINE_LOCK) } - val model = buildDetailService.getBuildModel(projectId, buildId) ?: throw ErrorCodeException( + // TODO 重试的model需要被覆盖为上次构建的内容,未来需要替换为RECORD表数据 + resource.model = buildDetailService.getBuildModel(projectId, buildId) ?: throw ErrorCodeException( errorCode = ProcessMessageCode.ERROR_PIPELINE_MODEL_NOT_EXISTS ) @@ -473,7 +469,7 @@ class PipelineBuildFacadeService( } // stage/job/task级重试 run { - model.stages.forEach { s -> + resource.model.stages.forEach { s -> // stage 级重试 if (s.id == taskId) { val stage = pipelineStageService.getStage(projectId, buildId, stageId = s.id) ?: run { @@ -562,7 +558,7 @@ class PipelineBuildFacadeService( } // 重置因暂停而变化的element(需同时支持流水线重试和stage重试, task重试), model不在这保存,在startBuild中保存 - pipelineTaskPauseService.resetElementWhenPauseRetry(projectId, buildId, model) + pipelineTaskPauseService.resetElementWhenPauseRetry(projectId, buildId, resource.model) // rebuild重试计数 val retryCount = (paramMap[PIPELINE_RETRY_COUNT]?.value?.toString()?.toInt() ?: 0) + 1 @@ -582,9 +578,8 @@ class PipelineBuildFacadeService( pipelineParamMap = paramMap, channelCode = channelCode ?: ChannelCode.BS, isMobile = isMobile, - model = model, + resource = resource, signPipelineVersion = buildInfo.version, - yamlVersion = buildInfo.yamlVersion, frequencyLimit = true, handlePostFlag = false, debug = buildInfo.debug, @@ -628,24 +623,20 @@ class PipelineBuildFacadeService( ) ) } - val readyToBuildPipelineInfo = pipelineRepositoryService.getPipelineInfo(projectId, pipelineId, channelCode) - ?: throw ErrorCodeException( - statusCode = Response.Status.NOT_FOUND.statusCode, - errorCode = ProcessMessageCode.ERROR_PIPELINE_NOT_EXISTS, - params = arrayOf(pipelineId) - ) - if (readyToBuildPipelineInfo.locked == true) { - throw ErrorCodeException(errorCode = ProcessMessageCode.ERROR_PIPELINE_LOCK) - } + val startEpoch = System.currentTimeMillis() try { - val (resource, debug) = getModelAndBuildLevel(projectId, pipelineId, version) - val model = resource.model + val (readyToBuildPipelineInfo, resource, debug) = pipelineRepositoryService.getBuildTriggerInfo( + projectId, pipelineId, version + ) + if (readyToBuildPipelineInfo.locked == true) { + throw ErrorCodeException(errorCode = ProcessMessageCode.ERROR_PIPELINE_LOCK) + } /** * 验证流水线参数构建启动参数 */ - val triggerContainer = model.getTriggerContainer() + val triggerContainer = resource.model.getTriggerContainer() if (startType == StartType.MANUAL && !debug) { if (!readyToBuildPipelineInfo.canManualStartup) { @@ -697,62 +688,19 @@ class PipelineBuildFacadeService( pipelineParamMap = paramMap, channelCode = channelCode, isMobile = isMobile, - model = model, + resource = resource, frequencyLimit = frequencyLimit, buildNo = buildNo, startValues = values, triggerReviewers = triggerReviewers, signPipelineVersion = version, - debug = debug, - versionName = resource.versionName, - yamlVersion = resource.yamlVersion + debug = debug ) } finally { logger.info("[$pipelineId]|$userId|It take(${System.currentTimeMillis() - startEpoch})ms to start pipeline") } } - private fun getModelAndBuildLevel(projectId: String, pipelineId: String, version: Int?): Pair { - if (version == null) { - val defaultVersion = pipelineRepositoryService.getPipelineResourceVersion( - projectId = projectId, - pipelineId = pipelineId - ) ?: throw ErrorCodeException( - statusCode = Response.Status.NOT_FOUND.statusCode, - errorCode = ProcessMessageCode.ERROR_NO_PIPELINE_EXISTS_BY_ID, - params = arrayOf(pipelineId) - ) - // 正式执行时,当前最新版本可能是草稿,则作为调试执行 - return if (defaultVersion.status == VersionStatus.COMMITTING) { - Pair(defaultVersion, true) - } else { - Pair(defaultVersion, false) - } - } else { - val targetResource = pipelineRepositoryService.getPipelineResourceVersion( - projectId = projectId, - pipelineId = pipelineId, - version = version - ) ?: throw ErrorCodeException( - statusCode = Response.Status.NOT_FOUND.statusCode, - errorCode = ProcessMessageCode.ERROR_NO_PIPELINE_VERSION_EXISTS_BY_ID, - params = arrayOf(version.toString()) - ) - return if (targetResource.status == VersionStatus.COMMITTING) { - Pair(targetResource, true) - } else { - val releaseVersion = pipelineRepositoryService.getPipelineResourceVersion( - projectId = projectId, - pipelineId = pipelineId - ) ?: throw ErrorCodeException( - statusCode = Response.Status.NOT_FOUND.statusCode, - errorCode = ProcessMessageCode.ERROR_PIPELINE_MODEL_NOT_EXISTS - ) - Pair(releaseVersion, false) - } - } - } - /** * 定时触发 */ @@ -783,23 +731,24 @@ class PipelineBuildFacadeService( ) ) } - val pipeline = pipelineRepositoryService.getPipelineInfo(projectId, pipelineId = pipelineId) ?: return null - if (pipeline.locked == true) { - throw ErrorCodeException(errorCode = ProcessMessageCode.ERROR_PIPELINE_LOCK) - } - if (pipeline.latestVersionStatus?.isNotReleased() == true) throw ErrorCodeException( - errorCode = ProcessMessageCode.ERROR_NO_RELEASE_PIPELINE_VERSION - ) + val startEpoch = System.currentTimeMillis() try { - - val resource = getPipelineResourceVersion(projectId, pipelineId, pipeline.version) - val model = resource.model + // 定时触发不存在调试的情况 + val (pipeline, resource, _) = pipelineRepositoryService.getBuildTriggerInfo( + projectId, pipelineId, null + ) + if (pipeline.locked == true) { + throw ErrorCodeException(errorCode = ProcessMessageCode.ERROR_PIPELINE_LOCK) + } + if (pipeline.latestVersionStatus?.isNotReleased() == true) throw ErrorCodeException( + errorCode = ProcessMessageCode.ERROR_NO_RELEASE_PIPELINE_VERSION + ) /** * 验证流水线参数构建启动参数 */ - val triggerContainer = model.getTriggerContainer() + val triggerContainer = resource.model.getTriggerContainer() val paramPamp = buildParamCompatibilityTransformer.parseTriggerParam( userId = userId, projectId = projectId, pipelineId = pipelineId, @@ -817,11 +766,9 @@ class PipelineBuildFacadeService( pipelineParamMap = paramPamp, channelCode = pipeline.channelCode, isMobile = false, - model = model, + resource = resource, signPipelineVersion = null, - frequencyLimit = false, - versionName = resource.versionName, - yamlVersion = resource.yamlVersion + frequencyLimit = false ).id } finally { logger.info("Timer| It take(${System.currentTimeMillis() - startEpoch})ms to start pipeline($pipelineId)") @@ -855,24 +802,24 @@ class PipelineBuildFacadeService( ) ) } - val readyToBuildPipelineInfo = pipelineRepositoryService.getPipelineInfo(projectId, pipelineId) - ?: return null - if (readyToBuildPipelineInfo.locked == true) { - throw ErrorCodeException(errorCode = ProcessMessageCode.ERROR_PIPELINE_LOCK) - } - if (readyToBuildPipelineInfo.latestVersionStatus?.isNotReleased() == true) throw ErrorCodeException( - errorCode = ProcessMessageCode.ERROR_NO_RELEASE_PIPELINE_VERSION - ) + val startEpoch = System.currentTimeMillis() try { - - val resource = getPipelineResourceVersion(projectId, pipelineId, readyToBuildPipelineInfo.version) - val model = resource.model + // 定时触发不存在调试的情况 + val (readyToBuildPipelineInfo, resource, _) = pipelineRepositoryService.getBuildTriggerInfo( + projectId, pipelineId, null + ) + if (readyToBuildPipelineInfo.locked == true) { + throw ErrorCodeException(errorCode = ProcessMessageCode.ERROR_PIPELINE_LOCK) + } + if (readyToBuildPipelineInfo.latestVersionStatus?.isNotReleased() == true) throw ErrorCodeException( + errorCode = ProcessMessageCode.ERROR_NO_RELEASE_PIPELINE_VERSION + ) /** * 验证流水线参数构建启动参数 */ - val triggerContainer = model.getTriggerContainer() + val triggerContainer = resource.model.getTriggerContainer() val pipelineParamMap = mutableMapOf() parameters.forEach { (key, value) -> @@ -897,13 +844,11 @@ class PipelineBuildFacadeService( pipelineParamMap = pipelineParamMap, channelCode = readyToBuildPipelineInfo.channelCode, isMobile = false, - model = model, + resource = resource, signPipelineVersion = null, frequencyLimit = false, startValues = startValues, - triggerReviewers = triggerReviewers, - versionName = resource.versionName, - yamlVersion = resource.yamlVersion + triggerReviewers = triggerReviewers ).id if (buildId.isNotBlank()) { webhookBuildParameterService.save( diff --git a/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/webhook/PipelineBuildWebhookService.kt b/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/webhook/PipelineBuildWebhookService.kt index a386ab3fc512..acaec7f175be 100644 --- a/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/webhook/PipelineBuildWebhookService.kt +++ b/src/backend/ci/core/process/biz-process/src/main/kotlin/com/tencent/devops/process/service/webhook/PipelineBuildWebhookService.kt @@ -521,32 +521,21 @@ class PipelineBuildWebhookService @Autowired constructor( val repoName = webhookCommit.repoName - val pipelineInfo = pipelineRepositoryService.getPipelineInfo(projectId, pipelineId) - ?: throw ErrorCodeException( - statusCode = Response.Status.NOT_FOUND.statusCode, - errorCode = ProcessMessageCode.ERROR_PIPELINE_NOT_EXISTS, - params = arrayOf(pipelineId) - ) + val (pipelineInfo, resource, _) = pipelineRepositoryService.getBuildTriggerInfo( + projectId, pipelineId, null + ) if (pipelineInfo.locked == true) { throw ErrorCodeException(errorCode = ProcessMessageCode.ERROR_PIPELINE_LOCK) } + if (pipelineInfo.latestVersionStatus?.isNotReleased() == true) throw ErrorCodeException( + errorCode = ProcessMessageCode.ERROR_NO_RELEASE_PIPELINE_VERSION + ) // 代码库触发支持仅有分支版本的情况,如果仅有草稿不需要在这里拦截 // if (pipelineInfo.latestVersionStatus == VersionStatus.COMMITTING) throw ErrorCodeException( // errorCode = ProcessMessageCode.ERROR_NO_RELEASE_PIPELINE_VERSION // ) val version = webhookCommit.version ?: pipelineInfo.version - val resource = pipelineRepositoryService.getPipelineResourceVersion( - projectId = projectId, - pipelineId = pipelineId, - version = version - ) - if (resource == null) { - logger.warn("[$pipelineId]| Fail to get the model") - return null - } - val model = resource.model - // 兼容从旧v1版本下发过来的请求携带旧的变量命名 val params = mutableMapOf() val pipelineParamMap = HashMap(startParams.size, 1F) @@ -571,11 +560,9 @@ class PipelineBuildWebhookService @Autowired constructor( pipelineParamMap = HashMap(pipelineParamMap), channelCode = pipelineInfo.channelCode, isMobile = false, - model = model, + resource = resource, signPipelineVersion = version, - frequencyLimit = false, - versionName = resource.versionName, - yamlVersion = resource.yamlVersion + frequencyLimit = false ) pipelineWebHookQueueService.onWebHookTrigger( projectId = projectId,