Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ enum class RunCondition {
PRE_TASK_SUCCESS, // 所有前置插件运行成功时
PRE_TASK_FAILED_BUT_CANCEL, // 即使前面有插件运行失败也运行,除非被取消才不运行
PRE_TASK_FAILED_EVEN_CANCEL, // 即使前面有插件运行失败也运行,即使被取消也运行
PRE_TASK_FAILED_ONLY, // 只有前面有插件运行失败时才运行
PRE_TASK_FAILED_ONLY, // 只有前面有插件运行失败时才运行(包括失败自动跳过的情况)
PRE_TASK_FAILED_ONLY_EXCEPT_SKIP, // 只有前面有插件运行失败时才运行(不包括失败自动跳过的情况)
OTHER_TASK_RUNNING, // 指定插件开始运行时 [未实现]
CUSTOM_VARIABLE_MATCH, // 自定义变量全部满足时运行
CUSTOM_VARIABLE_MATCH_NOT_RUN, // 自定义变量全部满足时不运行
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,10 +185,7 @@ object ModelUtils {
} else {
childElement.canRetry = null // 自动跳过的不能手动重试
}
} else if (additionalOptions.runCondition == RunCondition.PRE_TASK_FAILED_ONLY ||
additionalOptions.runCondition == RunCondition.PRE_TASK_FAILED_BUT_CANCEL ||
additionalOptions.runCondition == RunCondition.PRE_TASK_FAILED_EVEN_CANCEL
) {
} else if (isFailureAwareCondition(additionalOptions.runCondition)) {
childElement.canRetry = null
childElement.canSkip = null
}
Expand Down Expand Up @@ -216,16 +213,20 @@ object ModelUtils {
} else {
element.canRetry = null // 自动跳过的不能手动重试
}
} else if (additionalOptions.runCondition == RunCondition.PRE_TASK_FAILED_ONLY ||
additionalOptions.runCondition == RunCondition.PRE_TASK_FAILED_BUT_CANCEL ||
additionalOptions.runCondition == RunCondition.PRE_TASK_FAILED_EVEN_CANCEL
) {
} else if (isFailureAwareCondition(additionalOptions.runCondition)) {
// “失败时才运行”的插件自身不放开重试/跳过;但不再影响前序失败插件的重试/跳过按钮
element.canRetry = null
element.canSkip = null
}
}

private fun isFailureAwareCondition(runCondition: RunCondition?): Boolean {
return runCondition == RunCondition.PRE_TASK_FAILED_ONLY ||
runCondition == RunCondition.PRE_TASK_FAILED_ONLY_EXCEPT_SKIP ||
runCondition == RunCondition.PRE_TASK_FAILED_BUT_CANCEL ||
runCondition == RunCondition.PRE_TASK_FAILED_EVEN_CANCEL
}

/**
* 根据流水线基础模型map集合和构建变量模型map集合生成完整的流水线构建模型
* @param baseModelMap 流水线基础模型map集合
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -668,9 +668,12 @@ object ProcessMessageCode {
const val BK_CHECK_TASK_RUN_CONDITION = "bkCheckTaskRunCondition" // 检查插件运行条件/Check Task Run Condition:
const val BK_TASK_DISABLED = "bkTaskDisabled" // [插件被禁用](Task disabled) = true

// [只有前面有任务失败时才运行](Only when a previous task has failed)
// [只有前面有任务失败时才运行(包括失败自动跳过情况)](Only when a previous task has failed)
const val BK_ONLY_WHEN_PREVIOUS_TASK_HAS_FAILED = "bkOnlyWhenPreviousTaskHasFailed"

// [只有前面有任务失败时才运行(不包括失败自动跳过情况)]
const val BK_ONLY_WHEN_PREVIOUS_TASK_FAILED_EXCEPT_SKIP = "bkOnlyWhenPreviousTaskFailedExceptSkip"

// [即使前面有插件运行失败也运行,除非被取消才不运行] (Even if a previous task has failed, unless the build was canceled)
const val BK_IT_DOES_NOT_RUN_UNLESS_IT_IS_CANCELED = "bkItDoesNotRunUnlessItIsCanceled"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import com.tencent.devops.process.constant.ProcessMessageCode.BK_CHECK_TASK_RUN_
import com.tencent.devops.process.constant.ProcessMessageCode.BK_CUSTOM_VARIABLES_ARE_ALL_SATISFIED
import com.tencent.devops.process.constant.ProcessMessageCode.BK_IT_DOES_NOT_RUN_UNLESS_IT_IS_CANCELED
import com.tencent.devops.process.constant.ProcessMessageCode.BK_JOB_FAILURE_OR_CANCEL
import com.tencent.devops.process.constant.ProcessMessageCode.BK_ONLY_WHEN_PREVIOUS_TASK_FAILED_EXCEPT_SKIP
import com.tencent.devops.process.constant.ProcessMessageCode.BK_ONLY_WHEN_PREVIOUS_TASK_HAS_FAILED
import com.tencent.devops.process.constant.ProcessMessageCode.BK_RUNS_EVEN_IF_CANCELED
import com.tencent.devops.process.constant.ProcessMessageCode.BK_TASK_DISABLED
Expand Down Expand Up @@ -184,11 +185,18 @@ object ControlUtils {
I18nUtil.getCodeLanMessage(BK_TASK_DISABLED)
)
} else when {
// [只有前面有任务失败时才运行],之前存在失败的任务
// [只有前面有任务失败时才运行],之前存在失败的任务(包含失败自动跳过的情况)
runCondition == RunCondition.PRE_TASK_FAILED_ONLY -> {
skip = !(containerFinalStatus.isFailure() || hasFailedTaskInSuccessContainer)
message.append("${I18nUtil.getCodeLanMessage(BK_ONLY_WHEN_PREVIOUS_TASK_HAS_FAILED)} skip=$skip")
}
// [只有前面有任务失败时才运行(不包括失败自动跳过)],仅当容器真正失败时才运行
runCondition == RunCondition.PRE_TASK_FAILED_ONLY_EXCEPT_SKIP -> {
skip = !containerFinalStatus.isFailure()
message.append(
"${I18nUtil.getCodeLanMessage(BK_ONLY_WHEN_PREVIOUS_TASK_FAILED_EXCEPT_SKIP)} skip=$skip"
)
}
// [即使前面有插件运行失败也运行,除非被取消才不运行],不会跳过
runCondition == RunCondition.PRE_TASK_FAILED_BUT_CANCEL -> {
skip = containerFinalStatus.isCancel()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ object TaskUtils {
private val failToRunBuildStatusList = listOf(
RunCondition.PRE_TASK_FAILED_EVEN_CANCEL, // 不管同一Job下前面任务成功/失败/取消都执行
RunCondition.PRE_TASK_FAILED_BUT_CANCEL, // 不管同一Job下前面任务成功/失败都执行,除了取消不执行
RunCondition.PRE_TASK_FAILED_ONLY // 同一Job下前面任务有失败才执行
RunCondition.PRE_TASK_FAILED_ONLY, // 同一Job下前面任务有失败才执行(包含失败自动跳过)
RunCondition.PRE_TASK_FAILED_ONLY_EXCEPT_SKIP // 同一Job下前面任务有失败才执行(不包含失败自动跳过)
)

/**
Expand Down Expand Up @@ -99,8 +100,13 @@ object TaskUtils {
if (isContainerFailed) { // 当前容器有失败的任务
runCondition in getContinueConditionListWhenFail() // 需要满足[前置任务失败时才运行]或[除了取消才不运行]条件
} else {
// 除了[前置任务失败时才运行]的其他条件,或者设置了[前置任务失败时才运行]并且失败并继续的任务
runCondition != RunCondition.PRE_TASK_FAILED_ONLY || hasFailedTaskInInSuccessContainer
when (runCondition) {
// 设置了[前置任务失败时才运行]并且有失败并继续的任务,允许执行
RunCondition.PRE_TASK_FAILED_ONLY -> hasFailedTaskInInSuccessContainer
// [不包括失败跳过]模式下,容器未失败则不允许执行(失败自动跳过不算真正失败)
RunCondition.PRE_TASK_FAILED_ONLY_EXCEPT_SKIP -> false
else -> true
}
}
}
if (conditionFlag) {
Expand Down
3 changes: 2 additions & 1 deletion support-files/i18n/process/message_en_US.properties
Original file line number Diff line number Diff line change
Expand Up @@ -556,7 +556,8 @@ bkWhenTheCustomVariablesAreAllSatisfied=[Don‘t run it when all the custom vari
bkCustomVariablesAreAllSatisfied=[Run it when all the custom variables are matched]
bkCheckTaskRunCondition=Check Task Run Condition:
bkTaskDisabled=Task disabled = true
bkOnlyWhenPreviousTaskHasFailed=[Only when a previous task has failed]
bkOnlyWhenPreviousTaskHasFailed=[Only when a previous task has failed (including the case of automatic skip on failure)]
bkOnlyWhenPreviousTaskFailedExceptSkip=[Only when a previous task has failed (excluding the case of automatic skip on failure)]
bkItDoesNotRunUnlessItIsCanceled=[Even if a previous task has failed, unless the build was canceled]
bkRunsEvenIfCanceled=[Run even if a previous plugin failed, and run even if it was cancelled]
bkJobFailureOrCancel=Job failure or cancel skip=true
Expand Down
3 changes: 2 additions & 1 deletion support-files/i18n/process/message_ja_JP.properties
Original file line number Diff line number Diff line change
Expand Up @@ -555,7 +555,8 @@ bkWhenTheCustomVariablesAreAllSatisfied=[カスタム変数がすべ
bkCustomVariablesAreAllSatisfied=[カスタム変数が全て満たされた時実行]
bkCheckTaskRunCondition=プラグイン実行条件をチェック:
bkTaskDisabled=プラグインが無効化されました = true
bkOnlyWhenPreviousTaskHasFailed=[前のタスクが失敗した場合のみ実行]
bkOnlyWhenPreviousTaskHasFailed=[前のタスクが失敗した場合のみ実行(失敗の自動スキップを含む)]
bkOnlyWhenPreviousTaskFailedExceptSkip=[前のタスクが失敗した場合のみ実行(失敗自動スキップの場合を除く)]
bkItDoesNotRunUnlessItIsCanceled=[前のプラグインが失敗しても実行します。キャンセルされた場合のみ実行しません]
bkRunsEvenIfCanceled=[前のプラグインが失敗しても実行します。キャンセルされても実行します]
bkJobFailureOrCancel=Jobが失敗またはキャンセルされました skip=true
Expand Down
3 changes: 2 additions & 1 deletion support-files/i18n/process/message_zh_CN.properties
Original file line number Diff line number Diff line change
Expand Up @@ -557,7 +557,8 @@ bkWhenTheCustomVariablesAreAllSatisfied=[自定义变量全部满足时不运行
bkCustomVariablesAreAllSatisfied=[自定义变量全部满足时运行]
bkCheckTaskRunCondition=检查插件运行条件:
bkTaskDisabled=插件被禁用 = true
bkOnlyWhenPreviousTaskHasFailed=[只有前面有任务失败时才运行]
bkOnlyWhenPreviousTaskHasFailed=[只有前面有任务失败时才运行(包括失败自动跳过情况)]
bkOnlyWhenPreviousTaskFailedExceptSkip=[只有前面有任务失败时才运行(不包括失败自动跳过情况)]
bkItDoesNotRunUnlessItIsCanceled=[即使前面有插件运行失败也运行,除非被取消才不运行]
bkRunsEvenIfCanceled=[即使前面有插件运行失败也运行,即使被取消也运行]
bkJobFailureOrCancel=Job失败或被取消 skip=true
Expand Down
Loading