From 12ccae1f2acd63387b13af6a99f29ad29d526562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=B2=E5=85=88=E7=94=9F?= <821039958@qq.com> Date: Tue, 15 Apr 2025 14:13:42 +0800 Subject: [PATCH] =?UTF-8?q?worker=20common=20=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devops/common/worker/task/ITask.java | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 modules/module-ci-worker/src/main/java/cd/casic/devops/common/worker/task/ITask.java diff --git a/modules/module-ci-worker/src/main/java/cd/casic/devops/common/worker/task/ITask.java b/modules/module-ci-worker/src/main/java/cd/casic/devops/common/worker/task/ITask.java new file mode 100644 index 0000000..af0100c --- /dev/null +++ b/modules/module-ci-worker/src/main/java/cd/casic/devops/common/worker/task/ITask.java @@ -0,0 +1,149 @@ +package cd.casic.devops.common.worker.task; + +import cd.casic.ci.common.pipeline.enums.ErrorCode; +import cd.casic.ci.common.pipeline.pojo.BuildParameters; +import cd.casic.ci.common.pipeline.pojo.ErrorType; +import cd.casic.ci.process.api.process.pojo.BuildTask; +import cd.casic.ci.process.api.process.pojo.BuildVariables; +import cd.casic.devops.common.worker.env.BuildEnv; +import cd.casic.devops.common.worker.env.BuildType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@SuppressWarnings({"NestedMethodCall", "MethodCount"}) +public abstract class ITask { + + private final Logger logger = LoggerFactory.getLogger(ITask.class); + + private final Map environment = new HashMap<>(); + + private final Map monitorData = new HashMap<>(); + + private String platformCode; + + private Integer platformErrorCode; + + private Boolean finishKillFlag; + + /* 存储常量的key */ + private List constVar; + + public void run(BuildTask buildTask, BuildVariables buildVariables, File workspace) { + // 过滤只读变量并收集键名到列表 + constVar = buildVariables.getVariablesWithType().stream() + .filter(variable -> variable.isReadOnly()) + .map(variable -> variable.getKey()) + .collect(Collectors.toList()); + + execute(buildTask, buildVariables, workspace); + } + + private BuildVariables combineVariables(BuildTask buildTask, BuildVariables buildVariables) { + + Map buildVariable = buildTask.getBuildVariable(); + if (buildVariable == null) { + return buildVariables; + } + + Map newVariables = buildVariables.getVariables(); + newVariables.putAll(buildVariable); + + List buildParameters = buildVariable.entrySet().stream().map(entry -> new BuildParameters(entry.getKey(), entry.getValue()) + ).collect(Collectors.toList()); + + Map newBuildParameters = + buildVariables.getVariablesWithType().stream() + .collect(Collectors.toMap( + BuildParameters::getKey, + param -> param, + (a, b) -> b // 合并函数(新值优先) + )); + buildParameters.forEach(param -> newBuildParameters.put(param.getKey(), param)); + + BuildVariables restBuildVariables = new BuildVariables(); + restBuildVariables.setVariables(newVariables); + restBuildVariables.setVariablesWithType(newBuildParameters.values().stream().collect(Collectors.toList())); + return restBuildVariables; + } + + abstract void execute(BuildTask buildTask, BuildVariables buildVariables, File workspace); + + protected void addEnv(Map env) { + if (!constVar.isEmpty()) { + boolean errFlag = false; + for (Map.Entry entry : env.entrySet()) { + String key = entry.getKey(); + if (constVar.contains(key)) { + LoggerService.addErrorLine("Variable " + key + " is read-only and cannot be modified."); + errFlag = true; + } + } + + if (errFlag) { + throw new TaskExecuteException( + "[Finish task] status: false, errorType: " + ErrorType.USER.getNum() + + ", errorCode: " + ErrorCode.USER_INPUT_INVAILD + + ", message: read-only cannot be modified.", + ErrorType.USER, + ErrorCode.USER_INPUT_INVAILD + ); + } + environment.putAll(env); + } + } + + protected void addEnv(String key, String value) { + environment.put(key, value); + } + + protected String getEnv(String key) { + return environment.getOrDefault(key, ""); + } + + public Map getAllEnv() { + return environment; + } + + protected void addMonitorData(Map monitorDataMap) { + monitorData.putAll(monitorDataMap); + } + + public Map getMonitorData() { + return new HashMap<>(monitorData); + } + + protected void addPlatformCode(String taskPlatformCode) { + this.platformCode = taskPlatformCode; + } + + public String getPlatformCode() { + return platformCode; + } + + protected void addPlatformErrorCode(int taskPlatformErrorCode) { + this.platformErrorCode = taskPlatformErrorCode; + } + + public Integer getPlatformErrorCode() { + return platformErrorCode; + } + + protected void addFinishKillFlag(boolean taskFinishKillFlag) { + this.finishKillFlag = taskFinishKillFlag; + } + + public Boolean getFinishKillFlag() { + return finishKillFlag; + } + + protected boolean isThirdAgent() { + return BuildEnv.getBuildType() == BuildType.AGENT; + } + +} \ No newline at end of file