Unverified Commit 9307a285 authored by mingshewhe's avatar mingshewhe Committed by GitHub
Browse files

Merge pull request #7658 from mingshewhe/feat_7588

feat: webhook事件请求调用scm服务增加线程级缓存 #7588
parents 89afd6db 7d8bd89d
Pipeline #43700 failed with stages
in 7 minutes and 52 seconds
Showing with 312 additions and 106 deletions
+312 -106
......@@ -109,6 +109,8 @@ data class GitMrInfo(
val author: GitMrInfoAuthor = GitMrInfoAuthor(),
@JsonProperty("base_commit")
val baseCommit: String? = null,
@JsonProperty("merge_status")
val mergeStatus: String? = null,
@JsonProperty("target_commit")
val targetCommit: String? = null,
@JsonProperty("source_commit")
......
package com.tencent.devops.common.webhook.service.code
import com.tencent.devops.common.api.enums.RepositoryType
import com.tencent.devops.common.client.Client
import com.tencent.devops.common.webhook.util.EventCacheUtil
import com.tencent.devops.repository.api.ServiceP4Resource
import com.tencent.devops.repository.pojo.Repository
import com.tencent.devops.scm.pojo.GitCommit
import com.tencent.devops.scm.pojo.GitMrInfo
import com.tencent.devops.scm.pojo.GitMrReviewInfo
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
/**
* 蓝盾事件触发变量缓存处理
*/
@Service
class EventCacheService @Autowired constructor(
private val gitScmService: GitScmService,
private val client: Client
) {
fun getMergeRequestReviewersInfo(projectId: String, mrId: Long?, repo: Repository): GitMrReviewInfo? {
val eventCache = EventCacheUtil.getOrInitRepoCache(repo)
return eventCache?.gitMrReviewInfo ?: run {
val mrReviewInfo = gitScmService.getMergeRequestReviewersInfo(
projectId = projectId,
mrId = mrId,
repo = repo
)
eventCache?.gitMrReviewInfo = mrReviewInfo
mrReviewInfo
}
}
fun getMergeRequestInfo(projectId: String, mrId: Long?, repo: Repository): GitMrInfo? {
val eventCache = EventCacheUtil.getOrInitRepoCache(repo)
return eventCache?.gitMrInfo ?: run {
val mrInfo = gitScmService.getMergeRequestInfo(
projectId = projectId,
mrId = mrId,
repo = repo
)
eventCache?.gitMrInfo = mrInfo
mrInfo
}
}
fun getMergeRequestChangeInfo(projectId: String, mrId: Long?, repo: Repository): Set<String> {
val eventCache = EventCacheUtil.getOrInitRepoCache(repo)
return eventCache?.gitMrChangeFiles ?: run {
val mrChangeInfo = gitScmService.getMergeRequestChangeInfo(
projectId = projectId,
mrId = mrId,
repo = repo
)
val changeFiles = mrChangeInfo?.files?.map {
if (it.deletedFile) {
it.oldPath
} else {
it.newPath
}
}?.toSet() ?: emptySet()
eventCache?.gitMrChangeFiles = changeFiles
changeFiles
}
}
fun getChangeFileList(projectId: String, repo: Repository, from: String, to: String): Set<String> {
val eventCache = EventCacheUtil.getOrInitRepoCache(repo)
return eventCache?.gitCompareChangeFiles ?: run {
val compareChangFile = gitScmService.getChangeFileList(
projectId = projectId,
repo = repo,
from = from,
to = to
)
eventCache?.gitCompareChangeFiles = compareChangFile
compareChangFile
}
}
fun getRepoAuthUser(projectId: String, repo: Repository): String {
val eventCache = EventCacheUtil.getOrInitRepoCache(repo)
return eventCache?.repoAuthUser ?: run {
val repoAuthUser = gitScmService.getRepoAuthUser(
projectId = projectId,
repo = repo
)
eventCache?.repoAuthUser = repoAuthUser
repoAuthUser
}
}
fun getDefaultBranchLatestCommitInfo(projectId: String, repo: Repository): Pair<String?, GitCommit?> {
val eventCache = EventCacheUtil.getOrInitRepoCache(repo)
return eventCache?.gitDefaultBranchLatestCommitInfo ?: run {
val gitDefaultBranchLatestCommitInfo = gitScmService.getDefaultBranchLatestCommitInfo(
projectId = projectId,
repo = repo
)
eventCache?.gitDefaultBranchLatestCommitInfo = gitDefaultBranchLatestCommitInfo
gitDefaultBranchLatestCommitInfo
}
}
fun getP4ChangelistFiles(
repo: Repository,
projectId: String,
repositoryId: String,
repositoryType: RepositoryType?,
change: Int
): List<String> {
val eventCache = EventCacheUtil.getOrInitRepoCache(repo)
return eventCache?.p4ChangeFiles ?: run {
val changeFiles = client.get(ServiceP4Resource::class).getChangelistFiles(
projectId = projectId,
repositoryId = repositoryId,
repositoryType = repositoryType,
change = change
).data?.map { it.depotPathString } ?: emptyList()
eventCache?.p4ChangeFiles = changeFiles
changeFiles
}
}
}
......@@ -27,7 +27,6 @@
package com.tencent.devops.common.webhook.service.code.handler.p4
import com.tencent.devops.common.client.Client
import com.tencent.devops.common.pipeline.pojo.element.trigger.enums.CodeEventType
import com.tencent.devops.common.pipeline.pojo.element.trigger.enums.PathFilterType
import com.tencent.devops.common.webhook.annotation.CodeWebhookHandler
......@@ -35,6 +34,7 @@ import com.tencent.devops.common.webhook.pojo.code.BK_REPO_P4_WEBHOOK_CHANGE
import com.tencent.devops.common.webhook.pojo.code.PathFilterConfig
import com.tencent.devops.common.webhook.pojo.code.WebHookParams
import com.tencent.devops.common.webhook.pojo.code.p4.P4ChangeEvent
import com.tencent.devops.common.webhook.service.code.EventCacheService
import com.tencent.devops.common.webhook.service.code.filter.EventTypeFilter
import com.tencent.devops.common.webhook.service.code.filter.P4PortFilter
import com.tencent.devops.common.webhook.service.code.filter.PathFilterFactory
......@@ -42,13 +42,12 @@ import com.tencent.devops.common.webhook.service.code.filter.WebhookFilter
import com.tencent.devops.common.webhook.service.code.filter.WebhookFilterResponse
import com.tencent.devops.common.webhook.service.code.handler.CodeWebhookTriggerHandler
import com.tencent.devops.common.webhook.util.WebhookUtils
import com.tencent.devops.repository.api.ServiceP4Resource
import com.tencent.devops.repository.pojo.Repository
@CodeWebhookHandler
@SuppressWarnings("TooManyFunctions")
class P4ChangeTriggerHandler(
private val client: Client
private val eventCacheService: EventCacheService
) : CodeWebhookTriggerHandler<P4ChangeEvent> {
override fun eventClass(): Class<P4ChangeEvent> {
return P4ChangeEvent::class.java
......@@ -94,12 +93,13 @@ class P4ChangeTriggerHandler(
)
val pathFilter = object : WebhookFilter {
override fun doFilter(response: WebhookFilterResponse): Boolean {
val changeFiles = client.get(ServiceP4Resource::class).getChangelistFiles(
val changeFiles = eventCacheService.getP4ChangelistFiles(
repo = repository,
projectId = projectId,
repositoryId = repositoryConfig.getURLEncodeRepositoryId(),
repositoryType = repositoryConfig.repositoryType,
change = event.change
).data?.map { it.depotPathString } ?: emptyList()
)
return PathFilterFactory.newPathFilter(
PathFilterConfig(
pathFilterType = PathFilterType.RegexBasedFilter,
......
......@@ -48,7 +48,7 @@ import com.tencent.devops.common.webhook.pojo.code.BK_REPO_GIT_WEBHOOK_ISSUE_URL
import com.tencent.devops.common.webhook.pojo.code.CI_BRANCH
import com.tencent.devops.common.webhook.pojo.code.WebHookParams
import com.tencent.devops.common.webhook.pojo.code.git.GitIssueEvent
import com.tencent.devops.common.webhook.service.code.GitScmService
import com.tencent.devops.common.webhook.service.code.EventCacheService
import com.tencent.devops.common.webhook.service.code.filter.ContainsFilter
import com.tencent.devops.common.webhook.service.code.filter.WebhookFilter
import com.tencent.devops.common.webhook.service.code.handler.GitHookTriggerHandler
......@@ -58,7 +58,7 @@ import com.tencent.devops.scm.utils.code.git.GitUtils
@CodeWebhookHandler
class TGitIssueTriggerHandler(
private val gitScmService: GitScmService
private val eventCacheService: EventCacheService
) : GitHookTriggerHandler<GitIssueEvent> {
override fun eventClass(): Class<GitIssueEvent> {
......@@ -112,7 +112,7 @@ class TGitIssueTriggerHandler(
startParams[PIPELINE_GIT_EVENT] = GitIssueEvent.classType
if (projectId != null && repository != null) {
val (defaultBranch, commitInfo) =
gitScmService.getDefaultBranchLatestCommitInfo(projectId = projectId, repo = repository)
eventCacheService.getDefaultBranchLatestCommitInfo(projectId = projectId, repo = repository)
startParams[PIPELINE_GIT_REF] = defaultBranch ?: ""
startParams[CI_BRANCH] = defaultBranch ?: ""
......
......@@ -72,6 +72,7 @@ import com.tencent.devops.common.webhook.pojo.code.PathFilterConfig
import com.tencent.devops.common.webhook.pojo.code.WebHookParams
import com.tencent.devops.common.webhook.pojo.code.git.GitMergeRequestEvent
import com.tencent.devops.common.webhook.service.code.GitScmService
import com.tencent.devops.common.webhook.service.code.EventCacheService
import com.tencent.devops.common.webhook.service.code.filter.BranchFilter
import com.tencent.devops.common.webhook.service.code.filter.ContainsFilter
import com.tencent.devops.common.webhook.service.code.filter.PathFilterFactory
......@@ -94,7 +95,8 @@ import java.util.Date
@CodeWebhookHandler
@Suppress("TooManyFunctions")
class TGitMrTriggerHandler(
private val gitScmService: GitScmService
private val gitScmService: GitScmService,
private val eventCacheService: EventCacheService
) : GitHookTriggerHandler<GitMergeRequestEvent> {
companion object {
......@@ -198,7 +200,7 @@ class TGitMrTriggerHandler(
val pathFilter = object : WebhookFilter {
override fun doFilter(response: WebhookFilterResponse): Boolean {
// 只有开启路径匹配时才查询mr change file list
val mrChangeInfo = if (excludePaths.isNullOrBlank() && includePaths.isNullOrBlank()) {
val changeFiles = if (excludePaths.isNullOrBlank() && includePaths.isNullOrBlank()) {
null
} else {
val mrId = if (repository is CodeGitlabRepository) {
......@@ -206,15 +208,8 @@ class TGitMrTriggerHandler(
} else {
event.object_attributes.id
}
gitScmService.getMergeRequestChangeInfo(projectId, mrId, repository)
}
val changeFiles = mrChangeInfo?.files?.map {
if (it.deletedFile) {
it.oldPath
} else {
it.newPath
}
} ?: emptyList()
eventCacheService.getMergeRequestChangeInfo(projectId, mrId, repository)
}?.toList() ?: emptyList()
return PathFilterFactory.newPathFilter(
PathFilterConfig(
pathFilterType = pathFilterType,
......@@ -346,8 +341,8 @@ class TGitMrTriggerHandler(
event.object_attributes.id
}
// MR提交人
val mrInfo = gitScmService.getMergeRequestInfo(projectId, mrRequestId, repository)
val reviewers = gitScmService.getMergeRequestReviewersInfo(projectId, mrRequestId, repository)?.reviewers
val mrInfo = eventCacheService.getMergeRequestInfo(projectId, mrRequestId, repository)
val reviewers = eventCacheService.getMergeRequestReviewersInfo(projectId, mrRequestId, repository)?.reviewers
return WebhookUtils.mrStartParam(
mrInfo = mrInfo,
......
......@@ -70,7 +70,7 @@ import com.tencent.devops.common.webhook.pojo.code.PIPELINE_WEBHOOK_NOTE_COMMENT
import com.tencent.devops.common.webhook.pojo.code.PIPELINE_WEBHOOK_NOTE_ID
import com.tencent.devops.common.webhook.pojo.code.WebHookParams
import com.tencent.devops.common.webhook.pojo.code.git.GitNoteEvent
import com.tencent.devops.common.webhook.service.code.GitScmService
import com.tencent.devops.common.webhook.service.code.EventCacheService
import com.tencent.devops.common.webhook.service.code.filter.ContainsFilter
import com.tencent.devops.common.webhook.service.code.filter.RegexContainFilter
import com.tencent.devops.common.webhook.service.code.filter.WebhookFilter
......@@ -82,7 +82,7 @@ import com.tencent.devops.scm.utils.code.git.GitUtils
@CodeWebhookHandler
class TGitNoteTriggerHandler(
private val gitScmService: GitScmService
private val eventCacheService: EventCacheService
) : GitHookTriggerHandler<GitNoteEvent> {
override fun eventClass(): Class<GitNoteEvent> {
......@@ -134,7 +134,7 @@ class TGitNoteTriggerHandler(
}
if (projectId != null && repository != null) {
val (defaultBranch, commitInfo) =
gitScmService.getDefaultBranchLatestCommitInfo(projectId = projectId, repo = repository)
eventCacheService.getDefaultBranchLatestCommitInfo(projectId = projectId, repo = repository)
startParams[PIPELINE_GIT_REF] = defaultBranch ?: ""
startParams[CI_BRANCH] = defaultBranch ?: ""
......@@ -166,8 +166,9 @@ class TGitNoteTriggerHandler(
return@apply
}
// MR提交人
val mrInfo = gitScmService.getMergeRequestInfo(projectId, mrRequestId, repository)
val reviewers = gitScmService.getMergeRequestReviewersInfo(projectId, mrRequestId, repository)?.reviewers
val mrInfo = eventCacheService.getMergeRequestInfo(projectId, mrRequestId, repository)
val reviewers =
eventCacheService.getMergeRequestReviewersInfo(projectId, mrRequestId, repository)?.reviewers
startParams.putAll(
WebhookUtils.mrStartParam(
mrInfo = mrInfo,
......
......@@ -54,11 +54,12 @@ import com.tencent.devops.common.webhook.pojo.code.PathFilterConfig
import com.tencent.devops.common.webhook.pojo.code.WebHookParams
import com.tencent.devops.common.webhook.pojo.code.git.GitPushEvent
import com.tencent.devops.common.webhook.pojo.code.git.isDeleteBranch
import com.tencent.devops.common.webhook.service.code.GitScmService
import com.tencent.devops.common.webhook.service.code.EventCacheService
import com.tencent.devops.common.webhook.service.code.filter.PathFilterFactory
import com.tencent.devops.common.webhook.service.code.filter.PushKindFilter
import com.tencent.devops.common.webhook.service.code.filter.SkipCiFilter
import com.tencent.devops.common.webhook.service.code.filter.WebhookFilter
import com.tencent.devops.common.webhook.service.code.filter.WebhookFilterResponse
import com.tencent.devops.common.webhook.service.code.handler.GitHookTriggerHandler
import com.tencent.devops.common.webhook.service.code.matcher.ScmWebhookMatcher
import com.tencent.devops.common.webhook.util.WebhookUtils
......@@ -73,7 +74,7 @@ import java.util.Date
@CodeWebhookHandler
@Suppress("TooManyFunctions")
class TGitPushTriggerHandler(
private val gitScmService: GitScmService
private val eventCacheService: EventCacheService
) : GitHookTriggerHandler<GitPushEvent> {
companion object {
......@@ -145,38 +146,44 @@ class TGitPushTriggerHandler(
triggerOnMessage = event.commits?.get(0)?.message ?: ""
)
val commits = event.commits
// 如果是强制提交,文件列表应该只获取强制提交变更的文件,而不是所有的
val eventPaths = if (event.operation_kind == TGitPushOperationKind.UPDATE_NONFASTFORWORD.value) {
gitScmService.getChangeFileList(
projectId = projectId,
repo = repository,
from = event.after,
to = event.before
)
} else {
val eventPaths = mutableSetOf<String>()
commits?.forEach { commit ->
eventPaths.addAll(commit.added ?: listOf())
eventPaths.addAll(commit.removed ?: listOf())
eventPaths.addAll(commit.modified ?: listOf())
}
eventPaths
}
val commitMessageFilter = CommitMessageFilter(
includeCommitMsg,
excludeCommitMsg,
commits?.first()?.message ?: "",
pipelineId
)
val pathFilter = PathFilterFactory.newPathFilter(
PathFilterConfig(
pathFilterType = pathFilterType,
pipelineId = pipelineId,
triggerOnPath = eventPaths.toList(),
includedPaths = convert(includePaths),
excludedPaths = convert(excludePaths)
)
)
val pathFilter = object : WebhookFilter {
override fun doFilter(response: WebhookFilterResponse): Boolean {
if (excludePaths.isNullOrBlank() && includePaths.isNullOrBlank()) {
return true
}
val eventPaths = if (event.operation_kind == TGitPushOperationKind.UPDATE_NONFASTFORWORD.value) {
eventCacheService.getChangeFileList(
projectId = projectId,
repo = repository,
from = event.after,
to = event.before
)
} else {
val changeFiles = mutableSetOf<String>()
commits?.forEach { commit ->
changeFiles.addAll(commit.added ?: listOf())
changeFiles.addAll(commit.removed ?: listOf())
changeFiles.addAll(commit.modified ?: listOf())
}
changeFiles
}
return PathFilterFactory.newPathFilter(
PathFilterConfig(
pathFilterType = pathFilterType,
pipelineId = pipelineId,
triggerOnPath = eventPaths.toList(),
includedPaths = convert(includePaths),
excludedPaths = convert(excludePaths)
)
).doFilter(response)
}
}
val pushKindFilter = PushKindFilter(
pipelineId = pipelineId,
checkCreateAndUpdate = event.create_and_update,
......
......@@ -49,7 +49,7 @@ import com.tencent.devops.common.webhook.pojo.code.BK_REPO_GIT_WEBHOOK_REVIEW_ST
import com.tencent.devops.common.webhook.pojo.code.CI_BRANCH
import com.tencent.devops.common.webhook.pojo.code.WebHookParams
import com.tencent.devops.common.webhook.pojo.code.git.GitReviewEvent
import com.tencent.devops.common.webhook.service.code.GitScmService
import com.tencent.devops.common.webhook.service.code.EventCacheService
import com.tencent.devops.common.webhook.service.code.filter.ContainsFilter
import com.tencent.devops.common.webhook.service.code.filter.EventTypeFilter
import com.tencent.devops.common.webhook.service.code.filter.GitUrlFilter
......@@ -62,7 +62,7 @@ import com.tencent.devops.scm.utils.code.git.GitUtils
@CodeWebhookHandler
@Suppress("TooManyFunctions")
class TGitReviewTriggerHandler(
private val gitScmService: GitScmService
private val eventCacheService: EventCacheService
) : CodeWebhookTriggerHandler<GitReviewEvent> {
override fun eventClass(): Class<GitReviewEvent> {
return GitReviewEvent::class.java
......@@ -125,9 +125,9 @@ class TGitReviewTriggerHandler(
repository != null
) {
// MR提交人
val mrInfo = gitScmService.getMergeRequestInfo(projectId, event.reviewableId, repository)
val mrInfo = eventCacheService.getMergeRequestInfo(projectId, event.reviewableId, repository)
val reviewers =
gitScmService.getMergeRequestReviewersInfo(projectId, event.reviewableId, repository)?.reviewers
eventCacheService.getMergeRequestReviewersInfo(projectId, event.reviewableId, repository)?.reviewers
startParams.putAll(
WebhookUtils.mrStartParam(
......@@ -144,7 +144,7 @@ class TGitReviewTriggerHandler(
startParams[PIPELINE_GIT_REPO_URL] = event.repository.git_http_url
if (projectId != null && repository != null) {
val (defaultBranch, commitInfo) =
gitScmService.getDefaultBranchLatestCommitInfo(projectId = projectId, repo = repository)
eventCacheService.getDefaultBranchLatestCommitInfo(projectId = projectId, repo = repository)
startParams[PIPELINE_GIT_REF] = defaultBranch ?: ""
startParams[CI_BRANCH] = defaultBranch ?: ""
......
......@@ -44,17 +44,17 @@ import com.tencent.devops.common.webhook.pojo.code.BK_REPO_WEBHOOK_REPO_AUTH_USE
import com.tencent.devops.common.webhook.pojo.code.MATCH_BRANCH
import com.tencent.devops.common.webhook.pojo.code.MATCH_PATHS
import com.tencent.devops.common.webhook.pojo.code.WebHookParams
import com.tencent.devops.common.webhook.service.code.GitScmService
import com.tencent.devops.repository.pojo.CodeGitRepository
import com.tencent.devops.repository.pojo.enums.RepoAuthType
import com.tencent.devops.common.webhook.service.code.EventCacheService
import com.tencent.devops.common.webhook.service.code.matcher.ScmWebhookMatcher
import com.tencent.devops.repository.pojo.CodeGitRepository
import com.tencent.devops.repository.pojo.Repository
import com.tencent.devops.repository.pojo.enums.RepoAuthType
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
@Service
class GitWebHookStartParam @Autowired constructor(
private val gitScmService: GitScmService
private val eventCacheService: EventCacheService
) : ScmWebhookStartParams<CodeGitWebHookTriggerElement> {
override fun elementClass(): Class<CodeGitWebHookTriggerElement> {
......@@ -88,7 +88,7 @@ class GitWebHookStartParam @Autowired constructor(
if (repo is CodeGitRepository && repo.authType == RepoAuthType.OAUTH) {
repo.userName
} else {
gitScmService.getRepoAuthUser(projectId = projectId, repo = repo)
eventCacheService.getRepoAuthUser(projectId = projectId, repo = repo)
}
startParams.putAll(
matcher.retrieveParams(
......
package com.tencent.devops.common.webhook.service.code.pojo
import com.tencent.devops.scm.pojo.GitCommit
import com.tencent.devops.scm.pojo.GitMrInfo
import com.tencent.devops.scm.pojo.GitMrReviewInfo
/**
* 事件触发仓库级缓存
*/
data class EventRepositoryCache(
var gitMrReviewInfo: GitMrReviewInfo? = null,
var gitMrInfo: GitMrInfo? = null,
var gitMrChangeFiles: Set<String>? = null,
var gitCompareChangeFiles: Set<String>? = null,
var gitDefaultBranchLatestCommitInfo: Pair<String?, GitCommit?>? = null,
var repoAuthUser: String? = null,
var p4ChangeFiles: List<String>? = null
)
package com.tencent.devops.common.webhook.util
import com.tencent.devops.common.webhook.service.code.pojo.EventRepositoryCache
import com.tencent.devops.repository.pojo.Repository
/**
* 如果同一个仓库配置了多个事件触发插件,那么每个插件都会调用一次scm接口,可以将返回值线程级缓存,减少调用次数
*/
object EventCacheUtil {
private val eventThreadLocalCache =
ThreadLocal<MutableMap<String/* repository alias name*/, EventRepositoryCache>>()
fun initEventCache() = eventThreadLocalCache.set(mutableMapOf())
fun getEventCache(repo: Repository): EventRepositoryCache? = eventThreadLocalCache.get()?.get(repo.aliasName)
fun putIfAbsentEventCache(repo: Repository, eventCache: EventRepositoryCache) =
eventThreadLocalCache.get()?.putIfAbsent(repo.aliasName, eventCache)
/**
* 如果不存在,则初始化空的仓库缓存
*/
fun getOrInitRepoCache(repo: Repository): EventRepositoryCache? {
return eventThreadLocalCache.get()?.let {
getEventCache(repo) ?: run {
val repoCache = EventRepositoryCache()
eventThreadLocalCache.get()[repo.aliasName] = repoCache
repoCache
}
}
}
fun remove() = eventThreadLocalCache.remove()
fun getAll(): Map<String, EventRepositoryCache> = eventThreadLocalCache.get()
}
......@@ -40,6 +40,7 @@ import com.tencent.devops.common.webhook.pojo.code.git.GitNoteEvent
import com.tencent.devops.common.webhook.pojo.code.git.GitPushEvent
import com.tencent.devops.common.webhook.pojo.code.git.GitReviewEvent
import com.tencent.devops.common.webhook.pojo.code.git.GitTagPushEvent
import com.tencent.devops.common.webhook.service.code.EventCacheService
import com.tencent.devops.common.webhook.service.code.GitScmService
import com.tencent.devops.common.webhook.service.code.handler.tgit.TGitIssueTriggerHandler
import com.tencent.devops.common.webhook.service.code.handler.tgit.TGitMrTriggerHandler
......@@ -83,12 +84,20 @@ class GitWebHookMatcherTest {
@BeforeEach
fun setUp() {
val gitScmService: GitScmService = mock()
CodeWebhookHandlerRegistrar.register(TGitPushTriggerHandler(gitScmService))
val eventCacheService: EventCacheService = mock()
CodeWebhookHandlerRegistrar.register(TGitPushTriggerHandler(eventCacheService))
CodeWebhookHandlerRegistrar.register(TGitTagPushTriggerHandler())
CodeWebhookHandlerRegistrar.register(TGitMrTriggerHandler(gitScmService))
CodeWebhookHandlerRegistrar.register(TGitReviewTriggerHandler(gitScmService))
CodeWebhookHandlerRegistrar.register(TGitIssueTriggerHandler(gitScmService))
CodeWebhookHandlerRegistrar.register(TGitNoteTriggerHandler(gitScmService))
CodeWebhookHandlerRegistrar.register(
TGitMrTriggerHandler(
gitScmService = gitScmService,
eventCacheService = eventCacheService
)
)
CodeWebhookHandlerRegistrar.register(
TGitReviewTriggerHandler(eventCacheService = eventCacheService)
)
CodeWebhookHandlerRegistrar.register(TGitIssueTriggerHandler(eventCacheService))
CodeWebhookHandlerRegistrar.register(TGitNoteTriggerHandler(eventCacheService))
}
@Test
......
......@@ -30,17 +30,14 @@ package com.tencent.devops.common.webhook.service.code.matcher
import com.nhaarman.mockito_kotlin.mock
import com.tencent.devops.common.api.enums.RepositoryConfig
import com.tencent.devops.common.api.enums.RepositoryType
import com.tencent.devops.common.api.pojo.Result
import com.tencent.devops.common.api.util.JsonUtil
import com.tencent.devops.common.client.Client
import com.tencent.devops.common.pipeline.pojo.element.trigger.enums.CodeEventType
import com.tencent.devops.common.webhook.pojo.code.WebHookParams
import com.tencent.devops.common.webhook.pojo.code.p4.P4Event
import com.tencent.devops.common.webhook.service.code.EventCacheService
import com.tencent.devops.common.webhook.service.code.handler.p4.P4ChangeTriggerHandler
import com.tencent.devops.common.webhook.service.code.loader.CodeWebhookHandlerRegistrar
import com.tencent.devops.repository.api.ServiceP4Resource
import com.tencent.devops.repository.pojo.CodeP4Repository
import com.tencent.devops.scm.code.p4.api.P4FileSpec
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
......@@ -58,35 +55,25 @@ class P4WebHookMatcherTest {
projectId = "mht",
repoHashId = "dfd"
)
private val client: Client = mock()
private val serviceP4Resource: ServiceP4Resource = mock()
private val eventCacheService: EventCacheService = mock()
@BeforeEach
fun setUp() {
CodeWebhookHandlerRegistrar.register(P4ChangeTriggerHandler(client))
CodeWebhookHandlerRegistrar.register(P4ChangeTriggerHandler(eventCacheService))
}
@Test
@SuppressWarnings("LongMethod")
fun p4CommitChangeEventTrigger() {
Mockito.`when`(client.get(ServiceP4Resource::class)).thenReturn(serviceP4Resource)
Mockito.`when`(
serviceP4Resource.getChangelistFiles(
eventCacheService.getP4ChangelistFiles(
repo = repository,
projectId = "mht",
repositoryId = "dfd",
repositoryType = RepositoryType.ID,
change = 1
)
).thenReturn(
Result(
listOf(
P4FileSpec(
opStatus = "VALID",
depotPathString = "//demo/tt.txt"
)
)
)
)
).thenReturn(listOf("//demo/tt.txt"))
val classPathResource = ClassPathResource(
"com/tencent/devops/common/webhook/service/code/p4/P4CommitChange.json"
)
......
......@@ -31,6 +31,7 @@ import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import com.tencent.devops.common.api.enums.RepositoryTypeNew
import com.tencent.devops.common.api.enums.ScmType
import com.tencent.devops.common.api.util.JsonUtil
import com.tencent.devops.common.api.util.Watcher
import com.tencent.devops.common.client.Client
import com.tencent.devops.common.log.pojo.message.LogMessage
......@@ -59,6 +60,7 @@ import com.tencent.devops.common.webhook.pojo.code.svn.SvnCommitEvent
import com.tencent.devops.common.webhook.service.code.loader.WebhookElementParamsRegistrar
import com.tencent.devops.common.webhook.service.code.loader.WebhookStartParamsRegistrar
import com.tencent.devops.common.webhook.service.code.matcher.ScmWebhookMatcher
import com.tencent.devops.common.webhook.util.EventCacheUtil
import com.tencent.devops.process.api.service.ServiceBuildResource
import com.tencent.devops.process.api.service.ServiceScmWebhookResource
import com.tencent.devops.process.engine.service.PipelineRepositoryService
......@@ -68,7 +70,6 @@ import com.tencent.devops.process.engine.service.PipelineWebhookService
import com.tencent.devops.process.engine.service.WebhookBuildParameterService
import com.tencent.devops.process.engine.service.code.GitWebhookUnlockDispatcher
import com.tencent.devops.process.engine.service.code.ScmWebhookMatcherBuilder
import com.tencent.devops.repository.utils.RepositoryUtils
import com.tencent.devops.process.pojo.code.WebhookCommit
import com.tencent.devops.process.service.builds.PipelineBuildCommitService
import com.tencent.devops.process.service.pipeline.PipelineBuildService
......@@ -76,6 +77,7 @@ import com.tencent.devops.process.utils.PIPELINE_START_TASK_ID
import com.tencent.devops.process.utils.PipelineVarUtil
import com.tencent.devops.project.api.service.ServiceAllocIdResource
import com.tencent.devops.repository.api.ServiceRepositoryResource
import com.tencent.devops.repository.utils.RepositoryUtils
import org.slf4j.LoggerFactory
import org.springframework.context.ApplicationContext
import org.springframework.context.ApplicationContextAware
......@@ -241,6 +243,7 @@ abstract class PipelineBuildWebhookService : ApplicationContextAware {
}
watcher.start("webhookTriggerPipelineBuild")
EventCacheUtil.initEventCache()
pipelines.forEach outside@{ pipeline ->
val projectId = pipeline.first
val pipelineId = pipeline.second
......@@ -283,6 +286,12 @@ abstract class PipelineBuildWebhookService : ApplicationContextAware {
gitWebhookUnlockDispatcher.dispatchUnlockHookLockEvent(matcher)
return true
} finally {
if (logger.isDebugEnabled) {
logger.debug(
"webhook event repository cache: ${JsonUtil.toJson(EventCacheUtil.getAll(), false)}"
)
}
EventCacheUtil.remove()
logger.info("$watcher")
}
}
......@@ -505,7 +514,7 @@ abstract class PipelineBuildWebhookService : ApplicationContextAware {
userId = userId,
pipeline = pipelineInfo,
startType = StartType.WEB_HOOK,
pipelineParamMap = pipelineParamMap,
pipelineParamMap = HashMap(pipelineParamMap),
channelCode = pipelineInfo.channelCode,
isMobile = false,
model = model,
......@@ -519,13 +528,16 @@ abstract class PipelineBuildWebhookService : ApplicationContextAware {
variables = webhookCommit.params
)
// #2958 webhook触发在触发原子上输出变量
buildLogPrinter.addLines(buildId = buildId, logMessages = pipelineParamMap.map {
LogMessage(
message = "${it.key}=${it.value.value}",
timestamp = System.currentTimeMillis(),
tag = startParams[PIPELINE_START_TASK_ID]?.toString() ?: ""
)
})
buildLogPrinter.addLines(
buildId = buildId,
logMessages = pipelineParamMap.map {
LogMessage(
message = "${it.key}=${it.value.value}",
timestamp = System.currentTimeMillis(),
tag = startParams[PIPELINE_START_TASK_ID]?.toString() ?: ""
)
}
)
if (buildId.isNotBlank()) {
webhookBuildParameterService.save(
projectId = projectId,
......
......@@ -39,8 +39,7 @@ import com.tencent.devops.repository.pojo.git.GitCodeFileInfo
import com.tencent.devops.repository.pojo.git.GitCodeProjectInfo
import com.tencent.devops.repository.pojo.git.GitCreateFile
import com.tencent.devops.repository.pojo.git.GitMrChangeInfo
import com.tencent.devops.repository.pojo.git.GitMrInfo
import com.tencent.devops.repository.pojo.git.GitMrReviewInfo
import com.tencent.devops.scm.pojo.GitMrInfo
import com.tencent.devops.repository.pojo.git.GitProjectInfo
import com.tencent.devops.repository.pojo.git.GitUserInfo
import com.tencent.devops.repository.pojo.git.UpdateGitProjectInfo
......@@ -56,6 +55,7 @@ import com.tencent.devops.scm.pojo.GitCodeGroup
import com.tencent.devops.scm.pojo.GitCommit
import com.tencent.devops.scm.pojo.GitFileInfo
import com.tencent.devops.scm.pojo.GitMember
import com.tencent.devops.scm.pojo.GitMrReviewInfo
import com.tencent.devops.scm.pojo.GitProjectGroupInfo
import com.tencent.devops.scm.pojo.GitRepositoryResp
import com.tencent.devops.scm.pojo.Project
......
......@@ -40,8 +40,6 @@ import com.tencent.devops.repository.pojo.git.GitCodeFileInfo
import com.tencent.devops.repository.pojo.git.GitCodeProjectInfo
import com.tencent.devops.repository.pojo.git.GitCreateFile
import com.tencent.devops.repository.pojo.git.GitMrChangeInfo
import com.tencent.devops.repository.pojo.git.GitMrInfo
import com.tencent.devops.repository.pojo.git.GitMrReviewInfo
import com.tencent.devops.repository.pojo.git.GitProjectInfo
import com.tencent.devops.repository.pojo.git.GitUserInfo
import com.tencent.devops.repository.pojo.git.UpdateGitProjectInfo
......@@ -58,6 +56,8 @@ import com.tencent.devops.scm.pojo.GitCodeGroup
import com.tencent.devops.scm.pojo.GitCommit
import com.tencent.devops.scm.pojo.GitFileInfo
import com.tencent.devops.scm.pojo.GitMember
import com.tencent.devops.scm.pojo.GitMrInfo
import com.tencent.devops.scm.pojo.GitMrReviewInfo
import com.tencent.devops.scm.pojo.GitProjectGroupInfo
import com.tencent.devops.scm.pojo.GitRepositoryResp
import com.tencent.devops.scm.pojo.Project
......
......@@ -54,8 +54,6 @@ import com.tencent.devops.repository.pojo.git.GitCodeFileInfo
import com.tencent.devops.repository.pojo.git.GitCodeProjectInfo
import com.tencent.devops.repository.pojo.git.GitCreateFile
import com.tencent.devops.repository.pojo.git.GitMrChangeInfo
import com.tencent.devops.repository.pojo.git.GitMrInfo
import com.tencent.devops.repository.pojo.git.GitMrReviewInfo
import com.tencent.devops.repository.pojo.git.GitProjectInfo
import com.tencent.devops.repository.pojo.git.GitUserInfo
import com.tencent.devops.repository.pojo.git.UpdateGitProjectInfo
......@@ -81,6 +79,8 @@ import com.tencent.devops.scm.pojo.GitCodeGroup
import com.tencent.devops.scm.pojo.GitCommit
import com.tencent.devops.scm.pojo.GitFileInfo
import com.tencent.devops.scm.pojo.GitMember
import com.tencent.devops.scm.pojo.GitMrInfo
import com.tencent.devops.scm.pojo.GitMrReviewInfo
import com.tencent.devops.scm.pojo.GitProjectGroupInfo
import com.tencent.devops.scm.pojo.GitRepositoryDirItem
import com.tencent.devops.scm.pojo.GitRepositoryResp
......
......@@ -38,8 +38,6 @@ import com.tencent.devops.repository.pojo.git.GitCodeFileInfo
import com.tencent.devops.repository.pojo.git.GitCodeProjectInfo
import com.tencent.devops.repository.pojo.git.GitCreateFile
import com.tencent.devops.repository.pojo.git.GitMrChangeInfo
import com.tencent.devops.repository.pojo.git.GitMrInfo
import com.tencent.devops.repository.pojo.git.GitMrReviewInfo
import com.tencent.devops.repository.pojo.git.GitProjectInfo
import com.tencent.devops.repository.pojo.git.GitUserInfo
import com.tencent.devops.repository.pojo.git.UpdateGitProjectInfo
......@@ -55,6 +53,8 @@ import com.tencent.devops.scm.pojo.GitCodeGroup
import com.tencent.devops.scm.pojo.GitCommit
import com.tencent.devops.scm.pojo.GitFileInfo
import com.tencent.devops.scm.pojo.GitMember
import com.tencent.devops.scm.pojo.GitMrInfo
import com.tencent.devops.scm.pojo.GitMrReviewInfo
import com.tencent.devops.scm.pojo.GitProjectGroupInfo
import com.tencent.devops.scm.pojo.GitRepositoryDirItem
import com.tencent.devops.scm.pojo.GitRepositoryResp
......
......@@ -135,6 +135,7 @@ class StreamTriggerRequestService @Autowired constructor(
action.data.setting = StreamTriggerSetting(gitCIBasicSetting)
}
}
action.initCacheData()
// 获取前端展示相关的requestEvent
val requestEvent = action.buildRequestEvent(event) ?: return false
......@@ -300,7 +301,7 @@ class StreamTriggerRequestService @Autowired constructor(
creator = action.data.getUserId()
)
// 远程仓库触发时,主库不需要新建流水线
if (action.data.context.repoTrigger != null && buildPipeline.pipelineId.isBlank()) {
if (action.checkRepoHookTrigger() && buildPipeline.pipelineId.isBlank()) {
return@yamlEach
}
......
......@@ -13,6 +13,7 @@ import com.tencent.devops.stream.trigger.git.pojo.StreamGitCred
import com.tencent.devops.stream.trigger.git.service.StreamGitApiService
import com.tencent.devops.stream.trigger.parsers.triggerMatch.TriggerResult
import com.tencent.devops.stream.pojo.ChangeYamlList
import com.tencent.devops.stream.trigger.actions.streamActions.StreamRepoTriggerAction
import com.tencent.devops.stream.trigger.pojo.YamlContent
import com.tencent.devops.stream.trigger.pojo.YamlPathListEntry
import com.tencent.devops.stream.trigger.pojo.enums.StreamCommitCheckState
......@@ -39,6 +40,11 @@ interface BaseAction {
*/
fun init(): BaseAction?
/**
* 初始化一些用于缓存的数据,主要是为了减少接口调用
*/
fun initCacheData() = Unit
/**
* 通过GIT项目唯一ID获取蓝盾项目ID
* @param gitProjectId git项目唯一标识,为空时取action的执行项目
......@@ -174,4 +180,9 @@ interface BaseAction {
* fork 库触发审核时,提供yaml文件跳转链接
*/
fun forkMrYamlList() = emptyList<ChangeYamlList>()
/**
* 判断是否是远程仓库触发
*/
fun checkRepoHookTrigger() = this is StreamRepoTriggerAction || this.data.context.repoTrigger != null
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment