Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion buildSrc/src/main/kotlin/Versions.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
object Release {
const val Group = "com.tencent.bk.devops.scm"
const val Version = "1.1.7"
const val Version = "1.1.8"
}

object Versions {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ data class CheckRunListOptions(
val page: Int? = null,
val pageSize: Int? = null,
val ref: String,
val pullRequestId: Long? = null
val pullRequestId: Long? = null,
val targetBranch: String? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,29 @@ import com.tencent.devops.scm.sdk.bkcode.BkCodeApiFactory
class BkCodeCheckRunService(private val apiFactory: BkCodeApiFactory) : CheckRunService {

override fun create(repository: ScmProviderRepository, input: CheckRunInput): CheckRun {
throw UnsupportedOperationException("bkcode not support create check run")
return BkCodeApiTemplate.execute(repository, apiFactory) { repo, bkCodeApi ->
val bkCodeCommitStatus = bkCodeApi.checkRunApi.create(
repo.projectIdOrPath,
input.ref ?: throw IllegalArgumentException("ref is required for BKCode check run"),
BkCodeObjectConverter.convertCheckRunInput(input)
)
BkCodeObjectConverter.convertCheckRun(bkCodeCommitStatus)
}
}

override fun update(repository: ScmProviderRepository, input: CheckRunInput): CheckRun {
throw UnsupportedOperationException("bkcode not support update check run")
// BkCode API不支持更新check run,直接调用创建接口进行覆盖
return create(repository, input)
}

override fun getCheckRuns(repository: ScmProviderRepository, opts: CheckRunListOptions): List<CheckRun> {
throw UnsupportedOperationException("bkcode not support get check run")
return BkCodeApiTemplate.execute(repository, apiFactory) { repo, bkCodeApi ->
val checkRuns = bkCodeApi.checkRunApi.getCheckRuns(
repo.projectIdOrPath,
opts.ref,
opts.targetBranch
)
checkRuns.map { BkCodeObjectConverter.convertCheckRun(it) }
}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.tencent.devops.scm.provider.git.bkcode

import com.tencent.devops.scm.api.enums.CheckRunConclusion
import com.tencent.devops.scm.api.enums.CheckRunStatus
import com.tencent.devops.scm.api.enums.ScmEventType
import com.tencent.devops.scm.api.enums.Visibility
import com.tencent.devops.scm.api.pojo.Change
import com.tencent.devops.scm.api.pojo.CheckRun
import com.tencent.devops.scm.api.pojo.CheckRunInput
import com.tencent.devops.scm.api.pojo.Comment
import com.tencent.devops.scm.api.pojo.Commit
import com.tencent.devops.scm.api.pojo.Content
Expand All @@ -18,6 +22,9 @@ import com.tencent.devops.scm.api.pojo.repository.ScmProviderRepository
import com.tencent.devops.scm.api.pojo.repository.git.GitRepositoryUrl
import com.tencent.devops.scm.api.pojo.repository.git.GitScmProviderRepository
import com.tencent.devops.scm.api.pojo.repository.git.GitScmServerRepository
import com.tencent.devops.scm.sdk.bkcode.enums.BkCodeCommitStateType
import com.tencent.devops.scm.sdk.bkcode.pojo.BkCodeCommitStatus
import com.tencent.devops.scm.sdk.bkcode.pojo.BkCodeCommitStatusInput
import com.tencent.devops.scm.sdk.bkcode.enums.BkCodeEventType
import com.tencent.devops.scm.sdk.bkcode.enums.BkCodeNoteableType
import com.tencent.devops.scm.sdk.bkcode.enums.BkCodeRepoType
Expand Down Expand Up @@ -122,11 +129,10 @@ object BkCodeObjectConverter {
sshUrl = srcSource.sshUrl,
webUrl = srcSource.httpUrl
)
// :TODO 最新commitId
val lastCommitSha = ""
val lastCommitSha = eventMergeRequest.headCommitId
val base = Reference(
name = eventMergeRequest.targetBranch,
sha = "",
sha = eventMergeRequest.baseCommitId,
linkUrl = ""
)

Expand Down Expand Up @@ -431,4 +437,52 @@ object BkCodeObjectConverter {
sha = "",
blobId = ""
)

/*========================================check run====================================================*/
fun convertCheckRunInput(input: CheckRunInput) = with(input) {
BkCodeCommitStatusInput.builder()
.context(name)
.state(convertCheckRunStatus(status, conclusion))
.description(output?.summary ?: "")
.targetUrl(detailsUrl)
.reportHtml(output?.text ?: "")
.targetBranches(targetBranches)
.build()
}

fun convertCheckRun(from: BkCodeCommitStatus) = with(from) {
CheckRun(
id = id,
name = context,
status = convertCheckRunStatus(state),
summary = description,
detailsUrl = targetUrl,
detail = reportHtml,
conclusion = convertCheckRunConclusion(state)
)
}

private fun convertCheckRunStatus(status: CheckRunStatus, conclusion: CheckRunConclusion?): BkCodeCommitStateType {
return when (status) {
CheckRunStatus.QUEUED, CheckRunStatus.IN_PROGRESS -> BkCodeCommitStateType.PENDING
CheckRunStatus.COMPLETED -> when (conclusion) {
CheckRunConclusion.SUCCESS -> BkCodeCommitStateType.SUCCESS
else -> BkCodeCommitStateType.FAILURE
}

else -> BkCodeCommitStateType.FAILURE
}
}

private fun convertCheckRunStatus(state: BkCodeCommitStateType) = when (state) {
BkCodeCommitStateType.PENDING -> CheckRunStatus.IN_PROGRESS
else -> CheckRunStatus.COMPLETED
}

private fun convertCheckRunConclusion(state: BkCodeCommitStateType) = when (state) {
BkCodeCommitStateType.SUCCESS -> CheckRunConclusion.SUCCESS
BkCodeCommitStateType.FAILURE -> CheckRunConclusion.FAILURE
BkCodeCommitStateType.ERROR -> CheckRunConclusion.FAILURE
else -> null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -168,15 +168,13 @@ class BkCodeWebhookParser : WebhookParser {
)
val user = BkCodeObjectConverter.convertUser(src.sender)
val pullRequest = BkCodeObjectConverter.convertPullRequest(user, src.mergeRequest)
// TODO: 完善commit
// val commit = BkCodeObjectConverter.convertCommit(src.commits.first())
return PullRequestHook(
action = action,
repo = repo,
eventType = MERGE_REQUEST.name,
pullRequest = pullRequest,
sender = getSender(src),
commit = Commit(sha = "", message = ""),
commit = Commit(sha = src.mergeRequest.headCommitId, message = ""),
extras = extras,
changes = listOf()
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package com.tencent.devops.scm.provider.git.bkcode

import com.fasterxml.jackson.core.type.TypeReference
import com.tencent.devops.scm.api.enums.CheckRunConclusion
import com.tencent.devops.scm.api.enums.CheckRunStatus
import com.tencent.devops.scm.api.pojo.CheckRunInput
import com.tencent.devops.scm.api.pojo.CheckRunListOptions
import com.tencent.devops.scm.api.pojo.CheckRunOutput
import com.tencent.devops.scm.sdk.bkcode.BkCodeApiFactory
import com.tencent.devops.scm.sdk.bkcode.pojo.BkCodeCommitStatus
import com.tencent.devops.scm.sdk.bkcode.pojo.BkCodeResult
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.anyString
import org.mockito.Mockito
import java.time.LocalDateTime
import org.mockito.Mockito.`when` as whenMock

class BkCodeCheckRunServiceTest : AbstractBkCodeServiceTest() {

companion object {
private lateinit var checkRunService: BkCodeCheckRunService
}

private val TEST_REF = "0cfeacad6fd5ceb7dc5dece5252b1bbdc3da3cc8"

private val checkRunInput = CheckRunInput(
name = "devops-scm-bkcode-check",
ref = TEST_REF,
pullRequestId = 12345,
status = CheckRunStatus.IN_PROGRESS,
startedAt = LocalDateTime.now(),
output = CheckRunOutput(
title = "BKCode Check Run Test",
summary = "BKCode check run service test summary",
text = "BKCode check run service test details"
),
targetBranches = listOf("master", "develop"),
conclusion = CheckRunConclusion.FAILURE,
detailsUrl = "https://github.com"
)

init {
apiFactory = createBkCodeApiFactory()
checkRunService = BkCodeCheckRunService(apiFactory)
mockData()
}

private fun mockData() {
val apiFactory = Mockito.mock(BkCodeApiFactory::class.java)
checkRunService = BkCodeCheckRunService(apiFactory)

val bkCodeApi = Mockito.mock(com.tencent.devops.scm.sdk.bkcode.BkCodeApi::class.java)
whenMock(apiFactory.fromAuthProvider(any()))
.thenReturn(bkCodeApi)

val checkRunApi = Mockito.mock(com.tencent.devops.scm.sdk.bkcode.BkCodeCheckRunApi::class.java)
whenMock(bkCodeApi.checkRunApi).thenReturn(checkRunApi)

whenMock(checkRunApi.create(anyString(), anyString(), any()))
.thenReturn(
read(
"create_check_run_result.json",
object : TypeReference<BkCodeResult<BkCodeCommitStatus>>() {}
).data
)

whenMock(checkRunApi.getCheckRuns(anyString(), anyString(), anyString()))
.thenReturn(
read(
"get_check_runs_result.json",
object : TypeReference<BkCodeResult<List<BkCodeCommitStatus>>>() {}
).data
)
}

@Test
fun create() {
val result = checkRunService.create(providerRepository, checkRunInput)
Assertions.assertEquals(result.status, CheckRunStatus.COMPLETED)
Assertions.assertEquals(result.conclusion, CheckRunConclusion.SUCCESS)
}

@Test
fun update() {
val updateCheckRun = checkRunInput.copy(
status = CheckRunStatus.COMPLETED,
completedAt = LocalDateTime.now(),
conclusion = CheckRunConclusion.SUCCESS,
id = 67890
)
val result = checkRunService.update(providerRepository, updateCheckRun)
println("Updated check run: $result")
}

@Test
fun getCheckRuns() {
val opts = CheckRunListOptions(
ref = TEST_REF,
targetBranch = "master"
)
val results = checkRunService.getCheckRuns(providerRepository, opts)
println("Found ${results.size} check runs")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,9 @@
"closedAt": "null",
"createdAt": "2025-11-07T19:53:38",
"updatedAt": "2025-11-07T19:53:38",
"url": "https://bkcode.template.com/hejieehe/devops_trigger/-/mergeRequest/detail/2"
"url": "https://bkcode.template.com/hejieehe/devops_trigger/-/mergeRequest/detail/2",
"baseCommitId": "7eaa451cdfd155338f113f1bb2d57527f34fc657",
"headCommitId": "0cfeacad6fd5ceb7dc5dece5252b1bbdc3da3cc8"
},
"changes": null,
"requestedReviewers": null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,9 @@
"closedAt": "null",
"createdAt": "2025-11-07T19:53:38",
"updatedAt": "2025-11-07T19:53:38",
"url": "https://bkcode.template.com/hejieehe/devops_trigger/-/mergeRequest/detail/2"
"url": "https://bkcode.template.com/hejieehe/devops_trigger/-/mergeRequest/detail/2",
"baseCommitId": "7eaa451cdfd155338f113f1bb2d57527f34fc657",
"headCommitId": "0cfeacad6fd5ceb7dc5dece5252b1bbdc3da3cc8"
},
"event": "COMMENT_EVENT",
"action": "created",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,14 @@ class TGitWebhookParser : WebhookParser {
"approved" -> ReviewState.APPROVED
"change_required" -> ReviewState.CHANGE_REQUIRED
"change_denied" -> ReviewState.CHANGE_DENIED
"close" -> ReviewState.UNKNOWN
"close" -> ReviewState.CLOSED
"empty" -> {
// review状态为空,则尝试使用[event]字段进行转换
when (src.event) {
EventAction.CREATE.value, EventAction.REOPEN.value -> ReviewState.APPROVING
else -> ReviewState.UNKNOWN
}
}
else -> ReviewState.UNKNOWN
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public class BkCodeApi {
private volatile BkCodeCommitApi commitApi;
private volatile BkCodeTagApi tagApi;
private volatile BkCodeUserApi userApi;
private volatile BkCodeCheckRunApi checkRunApi;


public BkCodeApi(BkCodeApiClient client) {
Expand Down Expand Up @@ -134,4 +135,15 @@ public BkCodeUserApi getUserApi() {
}
return userApi;
}

public BkCodeCheckRunApi getCheckRunApi() {
if (checkRunApi == null) {
synchronized (this) {
if (checkRunApi == null) {
checkRunApi = new BkCodeCheckRunApi(this);
}
}
}
return checkRunApi;
}
}
Loading