From ee9ac3b7b48085c2ecd589d8c20a023748fbde45 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 15:22:26 +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 --- .../common/pipeline/pojo/BuildParameters.java | 5 + .../process/api/process/pojo/BuildTask.java | 2 + .../devops/common/worker/task/TaskDaemon.java | 127 ++++++++++++++++++ 3 files changed, 134 insertions(+) create mode 100644 modules/module-ci-worker/src/main/java/cd/casic/devops/common/worker/task/TaskDaemon.java diff --git a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/pojo/BuildParameters.java b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/pojo/BuildParameters.java index d71480d..0dec43e 100644 --- a/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/pojo/BuildParameters.java +++ b/modules/module-ci-common-pipeline/src/main/java/cd/casic/ci/common/pipeline/pojo/BuildParameters.java @@ -38,4 +38,9 @@ public class BuildParameters { this.desc = desc; this.defaultValue = defaultValue; } + + public BuildParameters(String key, String value) { + this.key = key; + this.value = value; + } } diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/process/api/process/pojo/BuildTask.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/process/api/process/pojo/BuildTask.java index e3d49a4..e333fbb 100644 --- a/modules/module-ci-process-api/src/main/java/cd/casic/ci/process/api/process/pojo/BuildTask.java +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/process/api/process/pojo/BuildTask.java @@ -2,6 +2,7 @@ package cd.casic.ci.process.api.process.pojo; import cd.casic.ci.common.pipeline.enums.BuildTaskStatus; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; import java.util.Map; @@ -14,6 +15,7 @@ import java.util.Map; * @Filename:BuildTask * @description:Todo */ +@Data @Schema(title = "流水线模型-构建任务") public class BuildTask { @Schema(title = "构建ID", required = true) diff --git a/modules/module-ci-worker/src/main/java/cd/casic/devops/common/worker/task/TaskDaemon.java b/modules/module-ci-worker/src/main/java/cd/casic/devops/common/worker/task/TaskDaemon.java new file mode 100644 index 0000000..b804844 --- /dev/null +++ b/modules/module-ci-worker/src/main/java/cd/casic/devops/common/worker/task/TaskDaemon.java @@ -0,0 +1,127 @@ +package cd.casic.devops.common.worker.task; +import cd.casic.ci.common.pipeline.enums.ErrorCode; +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.BuildTaskResult; +import cd.casic.ci.process.api.process.pojo.BuildVariables; +import com.github.xiaoymin.knife4j.core.util.CommonUtils; +import java.io.File; +import java.util.Map; +import java.util.HashMap; +import java.util.concurrent.*; + +import static cd.casic.ci.process.api.process.utils.Constants.PIPELINE_TASK_MESSAGE_STRING_LENGTH_MAX; + +public class TaskDaemon implements Callable> { + private final ITask task; + private final BuildTask buildTask; + private final BuildVariables buildVariables; + private final File workspace; + private static final int PARAM_MAX_LENGTH = 4000; // 流水线参数最大长度 + + public TaskDaemon(ITask task, BuildTask buildTask, BuildVariables buildVariables, File workspace) { + this.task = task; + this.buildTask = buildTask; + this.buildVariables = buildVariables; + this.workspace = workspace; + } + + @Override + public Map call() { + task.run(buildTask, buildVariables, workspace); + return task.getAllEnv(); + } + + public void runWithTimeout() { + int timeout = TaskUtil.getTimeOut(buildTask); + ExecutorService executor = Executors.newCachedThreadPool(); + String taskId = buildTask.getTaskId(); + + if (taskId != null) { + TaskExecutorCache.put(taskId, executor); + } + Future> f1 = executor.submit(this); + try { + if (f1.get(timeout, TimeUnit.MINUTES) == null) { + throw new TimeoutException("Task[" + buildTask.getElementName() + + "] timeout: " + timeout + " minutes"); + } + } catch (Exception e) { + throw new TaskExecuteException( + ErrorType.USER, + ErrorCode.USER_TASK_OUTTIME_LIMIT, + e.getMessage() != null ? e.getMessage() : + "Task[" + buildTask.getElementName() + "] timeout: " + timeout + " minutes" + ); + } finally { + executor.shutdownNow(); + if (taskId != null) { + TaskExecutorCache.invalidate(taskId); + } + } + } + + private Map getAllEnv() { + return task.getAllEnv(); + } + + private Map getMonitorData() { + return task.getMonitorData(); + } + + public BuildTaskResult getBuildResult( + Boolean isSuccess, + String errorMessage, + String errorType, + Integer errorCode) { + Map allEnv = getAllEnv(); + Map buildResult = new HashMap<>(); + + if (allEnv != null && !allEnv.isEmpty()) { + for (Map.Entry entry : allEnv.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + + // 检查值长度 + if (value != null && value.length() > PARAM_MAX_LENGTH) { + LoggerService.getInstance().addWarnLine( + "Warning, assignment to variable [" + key + "] failed, " + + "more than " + PARAM_MAX_LENGTH + " characters(len=" + value.length() + ")" + ); + continue; + } + + if (SensitiveValueService.matchSensitiveValue(value)) { + LoggerService.getInstance().addWarnLine( + "Warning, credentials cannot be assigned to variable[" + key + "]" + ); + continue; + } + + buildResult.put(key, value); + } + } + + return new BuildTaskResult( + buildTask.getTaskId(), + buildTask.getTaskId(), + buildVariables.getContainerHashId(), + buildTask.getElementVersion(), + isSuccess, + buildTask.getExecuteCount(), + buildResult, + errorMessage != null ? + CommonUtils.interceptStringInLength( + SensitiveValueService.fixSensitiveContent(errorMessage), + PIPELINE_TASK_MESSAGE_STRING_LENGTH_MAX + ) : null, + buildTask.getType(), + errorType, + errorCode, + task.getPlatformCode(), + task.getPlatformErrorCode(), + getMonitorData() + ); + + } +} \ No newline at end of file