This is an automated email from the ASF dual-hosted git repository.

zhongjiajie pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 2dbc79693e [feature][task plugin] Add new task plugin for apache 
linkis (#12693)
2dbc79693e is described below

commit 2dbc79693e99f7a10d8bddeef691d9321dc5f10c
Author: Assert <[email protected]>
AuthorDate: Thu Nov 17 10:14:36 2022 +0800

    [feature][task plugin] Add new task plugin for apache linkis (#12693)
---
 docs/configs/docsdev.js                            |   8 +
 docs/docs/en/guide/task/linkis.md                  |  49 ++++
 docs/docs/zh/guide/task/linkis.md                  |  49 ++++
 docs/img/tasks/demo/linkis_task01.png              | Bin 0 -> 130025 bytes
 docs/img/tasks/demo/linkis_task02.png              | Bin 0 -> 163897 bytes
 docs/img/tasks/icons/linkis.png                    | Bin 0 -> 3554 bytes
 .../src/main/resources/task-type-config.yaml       |   1 +
 .../dolphinscheduler-task-all/pom.xml              |   5 +
 .../dolphinscheduler-task-linkis/pom.xml           |  43 ++++
 .../plugin/task/linkis/Constants.java              |  39 ++++
 .../plugin/task/linkis/LinkisJobStatus.java        |  69 ++++++
 .../plugin/task/linkis/LinkisParameters.java       |  54 +++++
 .../plugin/task/linkis/LinkisTask.java             | 256 +++++++++++++++++++++
 .../plugin/task/linkis/LinkisTaskChannel.java      |  49 ++++
 .../task/linkis/LinkisTaskChannelFactory.java      |  45 ++++
 .../plugin/task/linkis/LinkisTaskTest.java         |  59 +++++
 dolphinscheduler-task-plugin/pom.xml               |   1 +
 .../public/images/task-icons/datasync.png          | Bin 24850 -> 159573 bytes
 .../public/images/task-icons/datasync_hover.png    | Bin 159573 -> 24850 bytes
 .../public/images/task-icons/linkis.png            | Bin 0 -> 940 bytes
 .../public/images/task-icons/linkis_hover.png      | Bin 0 -> 3554 bytes
 dolphinscheduler-ui/src/store/project/task-type.ts |   4 +
 dolphinscheduler-ui/src/store/project/types.ts     |   1 +
 .../projects/task/components/node/fields/index.ts  |   1 +
 .../task/components/node/fields/use-linkis.ts      |  94 ++++++++
 .../projects/task/components/node/format-data.ts   |   6 +
 .../projects/task/components/node/tasks/index.ts   |   5 +-
 .../task/components/node/tasks/use-linkis.ts       |  79 +++++++
 .../views/projects/task/components/node/types.ts   |   1 +
 .../src/views/projects/task/constants/task-type.ts |   5 +
 .../workflow/components/dag/dag.module.scss        |  10 +-
 script/env/dolphinscheduler_env.sh                 |   1 +
 32 files changed, 930 insertions(+), 4 deletions(-)

diff --git a/docs/configs/docsdev.js b/docs/configs/docsdev.js
index f0a079ad91..9ce2c22efb 100644
--- a/docs/configs/docsdev.js
+++ b/docs/configs/docsdev.js
@@ -217,6 +217,10 @@ export default {
                                 title: 'Kubeflow',
                                 link: 
'/en-us/docs/dev/user_doc/guide/task/kubeflow.html',
                             },
+                            {
+                                title: 'Apache Linkis',
+                                link: 
'/en-us/docs/dev/user_doc/guide/task/linkis.html',
+                            },
                         ],
                     },
                     {
@@ -877,6 +881,10 @@ export default {
                                 title: 'Kubeflow',
                                 link: 
'/zh-cn/docs/dev/user_doc/guide/task/kubeflow.html',
                             },
+                            {
+                                title: 'Apache Linkis',
+                                link: 
'/zh-cn/docs/dev/user_doc/guide/task/linkis.html',
+                            },
                         ],
                     },
                     {
diff --git a/docs/docs/en/guide/task/linkis.md 
b/docs/docs/en/guide/task/linkis.md
new file mode 100644
index 0000000000..337afa2bfe
--- /dev/null
+++ b/docs/docs/en/guide/task/linkis.md
@@ -0,0 +1,49 @@
+# Apache Linkis
+
+## Overview
+
+`Linkis` task type for creating and executing `Linkis` tasks. When the worker 
executes this task, it will parse the shell parameters through the `linkis-cli` 
command.
+Click [here](https://linkis.apache.org/) for more information about `Apache 
Linkis`.
+
+## Create Task
+
+- Click Project Management -> Project Name -> Workflow Definition, and click 
the "Create Workflow" button to enter the DAG editing page.
+- Drag the <img src="../../../../img/tasks/icons/linkis.png" width="15"/> from 
the toolbar to the drawing board.
+
+## Task Parameter
+
+[//]: # (TODO: use the commented anchor below once our website template 
supports this syntax)
+[//]: # (- Please refer to [DolphinScheduler Task Parameters 
Appendix]&#40;appendix.md#default-task-parameters&#41; `Default Task 
Parameters` section for default parameters.)
+
+- Please refer to [DolphinScheduler Task Parameters Appendix](appendix.md) 
`Default Task Parameters` section for default parameters.
+- Please refer to [Linkis-Cli Task 
Parameters](https://linkis.apache.org/zh-CN/docs/latest/user-guide/linkiscli-manual)
 `Linkis Support Parameters` section for Linkis parameters.
+
+## Task Example
+
+This sample demonstrates using the Spark engine to execute sql script.
+
+### Configuring the Linkis environment in DolphinScheduler
+
+If you want to use the Linkis task type in the production environment, you 
need to configure the required environment first. The configuration file is as 
follows: `/dolphinscheduler/conf/env/dolphinscheduler_env.sh`.
+
+![linkis_task01](../../../../img/tasks/demo/linkis_task01.png)
+
+### Configuring Linkis Task Node
+
+According to the above parameter description, configure the required content.
+
+![linkis_task02](../../../../img/tasks/demo/linkis_task02.png)
+
+### Config example
+
+```
+
+sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -code "select 
count(*) from testdb.test;"  -submitUser hadoop -proxyUser hadoop 
+
+```
+
+### Attention
+
+- No need to fill `sh ./bin/linkis-cli` in the configuration column, it has 
been configured in advance.
+- The default configuration is asynchronous submission. You do not need to 
configure the `--async` parameter.
+
diff --git a/docs/docs/zh/guide/task/linkis.md 
b/docs/docs/zh/guide/task/linkis.md
new file mode 100644
index 0000000000..db6a63e2fb
--- /dev/null
+++ b/docs/docs/zh/guide/task/linkis.md
@@ -0,0 +1,49 @@
+# Apache Linkis
+
+## 综述
+
+`Linkis` 任务类型,用于创建并执行 `Linkis` 类型任务。worker 执行该任务的时候,会通过 `linkis-cli` 执行命令行。
+点击 [这里](https://linkis.apache.org/) 获取更多关于 `Apache Linkis` 的信息。
+
+## 创建任务
+
+- 点击项目管理 -> 项目名称 -> 工作流定义,点击“创建工作流”按钮,进入 DAG 编辑页面;
+- 拖动工具栏的<img src="../../../../img/tasks/icons/linkis.png" width="15"/> 
任务节点到画板中。
+
+## 任务参数
+
+[//]: # (TODO: use the commented anchor below once our website template 
supports this syntax)
+[//]: # (- 
默认参数说明请参考[DolphinScheduler任务参数附录]&#40;appendix.md#默认任务参数&#41;`默认任务参数`一栏。)
+
+- 默认参数说明请参考[DolphinScheduler任务参数附录](appendix.md)`默认任务参数`一栏。
+- 
Linkis支持的参数列表请参考[linkis-cli任务参数](https://linkis.apache.org/zh-CN/docs/latest/user-guide/linkiscli-manual)`支持的参数列表`一栏。
+
+## 任务样例
+
+该样例演示为使用 Spark 引擎提交sql执行。
+
+### 在 DolphinScheduler 中配置 Linkis 环境
+
+若生产环境中要是使用到 Linkis 
任务类型,则需要先配置好所需的环境,配置文件如下:`/dolphinscheduler/conf/env/dolphinscheduler_env.sh`。
+
+![linkis_task01](../../../../img/tasks/demo/linkis_task01.png)
+
+### 配置 Linkis 任务节点
+
+根据上述参数说明,配置所需的内容即可。
+
+![linkis_task02](../../../../img/tasks/demo/linkis_task02.png)
+
+### Config 样例
+
+```
+
+sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -code "select 
count(*) from testdb.test;"  -submitUser hadoop -proxyUser hadoop 
+
+```
+
+### 注意事项
+
+- 无需在配置栏里再填写`sh ./bin/linkis-cli`,已提前配置。
+- 配置默认为异步提交,您无需再配置`--async`参数。
+
diff --git a/docs/img/tasks/demo/linkis_task01.png 
b/docs/img/tasks/demo/linkis_task01.png
new file mode 100644
index 0000000000..afc722b33c
Binary files /dev/null and b/docs/img/tasks/demo/linkis_task01.png differ
diff --git a/docs/img/tasks/demo/linkis_task02.png 
b/docs/img/tasks/demo/linkis_task02.png
new file mode 100644
index 0000000000..08b43759ec
Binary files /dev/null and b/docs/img/tasks/demo/linkis_task02.png differ
diff --git a/docs/img/tasks/icons/linkis.png b/docs/img/tasks/icons/linkis.png
new file mode 100644
index 0000000000..2b86776d89
Binary files /dev/null and b/docs/img/tasks/icons/linkis.png differ
diff --git a/dolphinscheduler-api/src/main/resources/task-type-config.yaml 
b/dolphinscheduler-api/src/main/resources/task-type-config.yaml
index 7144b4a2c9..c4f3c148dd 100644
--- a/dolphinscheduler-api/src/main/resources/task-type-config.yaml
+++ b/dolphinscheduler-api/src/main/resources/task-type-config.yaml
@@ -57,3 +57,4 @@ task:
     - 'ZEPPELIN'
     - 'CHUNJUN'
     - 'DATASYNC'
+    - 'LINKIS'
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-all/pom.xml 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-all/pom.xml
index d355ecf02d..b60f00df24 100644
--- a/dolphinscheduler-task-plugin/dolphinscheduler-task-all/pom.xml
+++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-all/pom.xml
@@ -236,6 +236,11 @@
             <artifactId>dolphinscheduler-task-kubeflow</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.dolphinscheduler</groupId>
+            <artifactId>dolphinscheduler-task-linkis</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/pom.xml 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/pom.xml
new file mode 100644
index 0000000000..63d4b1e5d5
--- /dev/null
+++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.dolphinscheduler</groupId>
+        <artifactId>dolphinscheduler-task-plugin</artifactId>
+        <version>dev-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>dolphinscheduler-task-linkis</artifactId>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dolphinscheduler</groupId>
+            <artifactId>dolphinscheduler-spi</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dolphinscheduler</groupId>
+            <artifactId>dolphinscheduler-task-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/Constants.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/Constants.java
new file mode 100644
index 0000000000..61c4f0ab81
--- /dev/null
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/Constants.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.task.linkis;
+
+public class Constants {
+
+    private Constants() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    public static final String SHELL_CLI_OPTIONS = 
"${LINKIS_HOME}/bin/linkis-cli";
+
+    public static final String KILL_OPTIONS = "--kill";
+
+    public static final String STATUS_OPTIONS = "--status";
+
+    public static final String ASYNC_OPTIONS = "--async true";
+
+    public static final String SPACE = " ";
+
+    public static final String LINKIS_TASK_ID_REGEX = "\"taskID\": \"\\d+";
+
+    public static final String LINKIS_STATUS_REGEX = "\"status\": \"\\w+";
+}
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisJobStatus.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisJobStatus.java
new file mode 100644
index 0000000000..4b6558a402
--- /dev/null
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisJobStatus.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.task.linkis;
+
+import org.apache.commons.lang3.StringUtils;
+
+public enum LinkisJobStatus {
+
+    UNSUBMITTED("Unsubmitted", 0),
+    SUBMITTING("Submitting", 1),
+    INITED("Inited", 2),
+    WAIT_FOR_RETRY("WaitForRetry", 3),
+    SCHEDULED("Scheduled", 4),
+    RUNNING("Running", 5),
+    SUCCEED("Succeed", 6),
+    FAILED("Failed", 7),
+    CANCELLED("Cancelled", 8),
+    TIMEOUT("Timeout", 9),
+    UNKNOWN("Unknown", 10),
+    SHUTTINGDOWN("Shuttingdown", 11);
+
+    private String name;
+    private int id;
+
+    LinkisJobStatus(String name, int id) {
+        this.name = name;
+        this.id = id;
+    }
+
+    public static LinkisJobStatus convertFromJobStatusString(String status) {
+        if (StringUtils.isNotBlank(status)) {
+            if (LinkisJobStatus.INITED.name().equalsIgnoreCase(status))
+                return LinkisJobStatus.INITED;
+            else if 
(LinkisJobStatus.WAIT_FOR_RETRY.name().equalsIgnoreCase(status))
+                return LinkisJobStatus.WAIT_FOR_RETRY;
+            else if (LinkisJobStatus.SCHEDULED.name().equalsIgnoreCase(status))
+                return LinkisJobStatus.SCHEDULED;
+            else if (LinkisJobStatus.RUNNING.name().equalsIgnoreCase(status))
+                return LinkisJobStatus.RUNNING;
+            else if (LinkisJobStatus.SUCCEED.name().equalsIgnoreCase(status))
+                return LinkisJobStatus.SUCCEED;
+            else if (LinkisJobStatus.FAILED.name().equalsIgnoreCase(status))
+                return LinkisJobStatus.FAILED;
+            else if (LinkisJobStatus.CANCELLED.name().equalsIgnoreCase(status))
+                return LinkisJobStatus.CANCELLED;
+            else if (LinkisJobStatus.TIMEOUT.name().equalsIgnoreCase(status))
+                return LinkisJobStatus.TIMEOUT;
+            else
+                return LinkisJobStatus.UNKNOWN;
+        } else {
+            return LinkisJobStatus.UNKNOWN;
+        }
+    }
+}
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisParameters.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisParameters.java
new file mode 100644
index 0000000000..f602d5d7c2
--- /dev/null
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisParameters.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.task.linkis;
+
+import 
org.apache.dolphinscheduler.plugin.task.api.parameters.AbstractParameters;
+
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+@Data
+public class LinkisParameters extends AbstractParameters {
+
+    private Boolean useCustom;
+
+    private List<Param> paramScript;
+
+    private String rawScript;
+
+    @Getter
+    @Setter
+    public static class Param {
+
+        private String props;
+
+        private String value;
+    }
+
+    @Override
+    public boolean checkParameters() {
+        return ((BooleanUtils.isTrue(useCustom) && 
StringUtils.isNotBlank(rawScript))
+                || (BooleanUtils.isFalse(useCustom) && paramScript.size() > 
0));
+    }
+}
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTask.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTask.java
new file mode 100644
index 0000000000..cf79fff077
--- /dev/null
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTask.java
@@ -0,0 +1,256 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.task.linkis;
+
+import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.*;
+
+import org.apache.dolphinscheduler.plugin.task.api.AbstractRemoteTask;
+import org.apache.dolphinscheduler.plugin.task.api.ShellCommandExecutor;
+import org.apache.dolphinscheduler.plugin.task.api.TaskException;
+import org.apache.dolphinscheduler.plugin.task.api.TaskExecutionContext;
+import org.apache.dolphinscheduler.plugin.task.api.model.Property;
+import org.apache.dolphinscheduler.plugin.task.api.model.TaskResponse;
+import 
org.apache.dolphinscheduler.plugin.task.api.parameters.AbstractParameters;
+import org.apache.dolphinscheduler.plugin.task.api.parser.ParamUtils;
+import org.apache.dolphinscheduler.plugin.task.api.parser.ParameterUtils;
+
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * linkis task
+ */
+public class LinkisTask extends AbstractRemoteTask {
+
+    /**
+     * linkis parameters
+     */
+    private LinkisParameters linkisParameters;
+
+    /**
+     * shell command executor
+     */
+    private ShellCommandExecutor shellCommandExecutor;
+
+    /**
+     * taskExecutionContext
+     */
+    protected final TaskExecutionContext taskExecutionContext;
+
+    private String taskId;
+
+    protected static final Pattern LINKIS_TASK_ID_REGEX = 
Pattern.compile(Constants.LINKIS_TASK_ID_REGEX);
+
+    protected static final Pattern LINKIS_STATUS_REGEX = 
Pattern.compile(Constants.LINKIS_STATUS_REGEX);
+
+    /**
+     * constructor
+     *
+     * @param taskExecutionContext taskExecutionContext
+     */
+    public LinkisTask(TaskExecutionContext taskExecutionContext) {
+        super(taskExecutionContext);
+
+        this.taskExecutionContext = taskExecutionContext;
+        this.shellCommandExecutor = new ShellCommandExecutor(this::logHandle,
+                taskExecutionContext,
+                logger);
+    }
+
+    @Override
+    public List<String> getApplicationIds() throws TaskException {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public void init() {
+        logger.info("Linkis task params {}", 
taskExecutionContext.getTaskParams());
+        if (!linkisParameters.checkParameters()) {
+            throw new RuntimeException("Linkis task params is not valid");
+        }
+    }
+
+    @Override
+    public void submitApplication() throws TaskException {
+        try {
+            // construct process
+            String command = buildCommand();
+            TaskResponse commandExecuteResult = 
shellCommandExecutor.run(command);
+            setExitStatusCode(commandExecuteResult.getExitStatusCode());
+            setAppIds(findTaskId(commandExecuteResult.getResultString()));
+            setProcessId(commandExecuteResult.getProcessId());
+            linkisParameters.dealOutParam(shellCommandExecutor.getVarPool());
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            logger.error("The current Linkis task has been interrupted", e);
+            setExitStatusCode(EXIT_CODE_FAILURE);
+            throw new TaskException("The current Linkis task has been 
interrupted", e);
+        } catch (Exception e) {
+            logger.error("Linkis task error", e);
+            setExitStatusCode(EXIT_CODE_FAILURE);
+            throw new TaskException("Execute Linkis task failed", e);
+        }
+    }
+
+    @Override
+    public void trackApplicationStatus() throws TaskException {
+        initTaskId();
+        try {
+            List<String> args = new ArrayList<>();
+            args.add(Constants.SHELL_CLI_OPTIONS);
+            args.add(Constants.STATUS_OPTIONS);
+            args.add(taskId);
+            String command = String.join(Constants.SPACE, args);
+            TaskResponse commandExecuteResult = 
shellCommandExecutor.run(command);
+            String status = findStatus(commandExecuteResult.getResultString());
+            LinkisJobStatus jobStatus = 
LinkisJobStatus.convertFromJobStatusString(status);
+            switch (jobStatus) {
+                case FAILED:
+                    setExitStatusCode(EXIT_CODE_FAILURE);
+                    break;
+                case SUCCEED:
+                    setExitStatusCode(EXIT_CODE_SUCCESS);
+                    break;
+                case CANCELLED:
+                    setExitStatusCode(EXIT_CODE_KILL);
+                    break;
+            }
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            logger.error("The current Linkis task has been interrupted", e);
+            throw new TaskException("The current Linkis task has been 
interrupted", e);
+        } catch (Exception e) {
+            throw new TaskException("track linkis status error", e);
+        }
+    }
+
+    @Override
+    public void cancelApplication() throws TaskException {
+        // cancel process
+        initTaskId();
+        try {
+            List<String> args = new ArrayList<>();
+            args.add(Constants.SHELL_CLI_OPTIONS);
+            args.add(Constants.KILL_OPTIONS);
+            args.add(taskId);
+            String command = String.join(Constants.SPACE, args);
+            shellCommandExecutor.run(command);
+            setExitStatusCode(EXIT_CODE_KILL);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            logger.error("The current Linkis task has been interrupted", e);
+            throw new TaskException("The current Linkis task has been 
interrupted", e);
+        } catch (Exception e) {
+            throw new TaskException("cancel linkis task error", e);
+        }
+    }
+
+    private String buildCommand() {
+
+        List<String> args = new ArrayList<>();
+        args.addAll(buildOptions());
+
+        String command = String.join(Constants.SPACE, args);
+        logger.info("Linkis task command: {}", command);
+
+        return command;
+    }
+
+    protected List<String> buildOptions() {
+        List<String> args = new ArrayList<>();
+        args.add(Constants.SHELL_CLI_OPTIONS);
+        args.add(Constants.ASYNC_OPTIONS);
+        if (BooleanUtils.isTrue(linkisParameters.getUseCustom())) {
+            args.add(buildCustomConfigContent());
+        } else {
+            args.add(buildParamConfigContent());
+        }
+        return args;
+    }
+
+    private String buildCustomConfigContent() {
+        logger.info("raw custom config content : {}", 
linkisParameters.getRawScript());
+        String script = linkisParameters.getRawScript().replaceAll("\\r\\n", 
"\n");
+        script = parseScript(script);
+        return script;
+    }
+
+    private String buildParamConfigContent() {
+        logger.info("raw param config content : {}", 
linkisParameters.getParamScript());
+        String script = "";
+        List<LinkisParameters.Param> paramList = 
linkisParameters.getParamScript();
+        for (LinkisParameters.Param param : paramList) {
+            script = script.concat(param.getProps())
+                    .concat(Constants.SPACE)
+                    .concat(param.getValue());
+        }
+        script = parseScript(script);
+        return script;
+    }
+
+    private void initTaskId() {
+        if (taskId == null) {
+            if (StringUtils.isNotEmpty(getAppIds())) {
+                taskId = getAppIds();
+            }
+        }
+        if (taskId == null) {
+            throw new TaskException("linkis task id is null");
+        }
+    }
+
+    protected String findTaskId(String line) {
+        Matcher matcher = LINKIS_TASK_ID_REGEX.matcher(line);
+        if (matcher.find()) {
+            String str = matcher.group();
+            return str.substring(11);
+        }
+        return null;
+    }
+
+    protected String findStatus(String line) {
+        Matcher matcher = LINKIS_STATUS_REGEX.matcher(line);
+        if (matcher.find()) {
+            String str = matcher.group();
+            return str.substring(11);
+        }
+        return null;
+    }
+
+    @Override
+    public AbstractParameters getParameters() {
+        return linkisParameters;
+    }
+
+    private String parseScript(String script) {
+        // combining local and global parameters
+        Map<String, Property> paramsMap = 
taskExecutionContext.getPrepareParamsMap();
+        return ParameterUtils.convertParameterPlaceholders(script, 
ParamUtils.convert(paramsMap));
+    }
+
+    public void setLinkisParameters(LinkisParameters linkisParameters) {
+        this.linkisParameters = linkisParameters;
+    }
+}
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTaskChannel.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTaskChannel.java
new file mode 100644
index 0000000000..b5d357a45e
--- /dev/null
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTaskChannel.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.task.linkis;
+
+import org.apache.dolphinscheduler.common.utils.JSONUtils;
+import org.apache.dolphinscheduler.plugin.task.api.TaskChannel;
+import org.apache.dolphinscheduler.plugin.task.api.TaskExecutionContext;
+import 
org.apache.dolphinscheduler.plugin.task.api.parameters.AbstractParameters;
+import org.apache.dolphinscheduler.plugin.task.api.parameters.ParametersNode;
+import 
org.apache.dolphinscheduler.plugin.task.api.parameters.resource.ResourceParametersHelper;
+
+public class LinkisTaskChannel implements TaskChannel {
+
+    @Override
+    public void cancelApplication(boolean status) {
+
+    }
+
+    @Override
+    public LinkisTask createTask(TaskExecutionContext taskRequest) {
+        return new LinkisTask(taskRequest);
+    }
+
+    @Override
+    public AbstractParameters parseParameters(ParametersNode parametersNode) {
+        return JSONUtils.parseObject(parametersNode.getTaskParams(), 
LinkisParameters.class);
+    }
+
+    @Override
+    public ResourceParametersHelper getResources(String parameters) {
+        return null;
+    }
+
+}
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTaskChannelFactory.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTaskChannelFactory.java
new file mode 100644
index 0000000000..5d2c0d563e
--- /dev/null
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/main/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTaskChannelFactory.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.task.linkis;
+
+import org.apache.dolphinscheduler.plugin.task.api.TaskChannel;
+import org.apache.dolphinscheduler.plugin.task.api.TaskChannelFactory;
+import org.apache.dolphinscheduler.spi.params.base.PluginParams;
+
+import java.util.List;
+
+import com.google.auto.service.AutoService;
+
+@AutoService(TaskChannelFactory.class)
+public class LinkisTaskChannelFactory implements TaskChannelFactory {
+
+    @Override
+    public TaskChannel create() {
+        return new LinkisTaskChannel();
+    }
+
+    @Override
+    public String getName() {
+        return "LINKIS";
+    }
+
+    @Override
+    public List<PluginParams> getParams() {
+        return null;
+    }
+}
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/test/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTaskTest.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/test/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTaskTest.java
new file mode 100644
index 0000000000..9271bff661
--- /dev/null
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-linkis/src/test/java/org/apache/dolphinscheduler/plugin/task/linkis/LinkisTaskTest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.task.linkis;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class LinkisTaskTest {
+
+    @Test
+    public void testBuildLinkisExecuteCommand() throws Exception {
+        Assertions.assertEquals("sh ./bin/shell-cli -engineType spark-2.4.3",
+                testBuildRunCommandLine(testBuildLinkisParameters()));
+    }
+
+    private LinkisParameters testBuildLinkisParameters() {
+        LinkisParameters linkisParameters = new LinkisParameters();
+        List<LinkisParameters.Param> testParamList = new ArrayList<>();
+        LinkisParameters.Param testParam = new LinkisParameters.Param();
+        testParam.setProps("-engineType");
+        testParam.setValue("spark-2.4.3");
+        testParamList.add(testParam);
+        linkisParameters.setUseCustom(false);
+        linkisParameters.setParamScript(testParamList);
+        return linkisParameters;
+    }
+
+    private static String testBuildRunCommandLine(LinkisParameters 
linkisParameters) {
+        List<String> args = new ArrayList<>();
+        String script = "";
+        List<LinkisParameters.Param> paramList = 
linkisParameters.getParamScript();
+        for (LinkisParameters.Param param : paramList) {
+            script = script.concat(param.getProps())
+                    .concat(Constants.SPACE)
+                    .concat(param.getValue());
+        }
+        args.add("sh ./bin/shell-cli");
+        args.add(script);
+        return String.join(Constants.SPACE, args);
+    }
+}
diff --git a/dolphinscheduler-task-plugin/pom.xml 
b/dolphinscheduler-task-plugin/pom.xml
index dcc0023f7e..a4478f0d6a 100644
--- a/dolphinscheduler-task-plugin/pom.xml
+++ b/dolphinscheduler-task-plugin/pom.xml
@@ -65,6 +65,7 @@
         <module>dolphinscheduler-task-dms</module>
         <module>dolphinscheduler-task-datasync</module>
         <module>dolphinscheduler-task-kubeflow</module>
+        <module>dolphinscheduler-task-linkis</module>
     </modules>
 
     <dependencyManagement>
diff --git a/dolphinscheduler-ui/public/images/task-icons/datasync.png 
b/dolphinscheduler-ui/public/images/task-icons/datasync.png
index e429282359..e1a3d1416d 100644
Binary files a/dolphinscheduler-ui/public/images/task-icons/datasync.png and 
b/dolphinscheduler-ui/public/images/task-icons/datasync.png differ
diff --git a/dolphinscheduler-ui/public/images/task-icons/datasync_hover.png 
b/dolphinscheduler-ui/public/images/task-icons/datasync_hover.png
index e1a3d1416d..e429282359 100644
Binary files a/dolphinscheduler-ui/public/images/task-icons/datasync_hover.png 
and b/dolphinscheduler-ui/public/images/task-icons/datasync_hover.png differ
diff --git a/dolphinscheduler-ui/public/images/task-icons/linkis.png 
b/dolphinscheduler-ui/public/images/task-icons/linkis.png
new file mode 100644
index 0000000000..8358c5ecab
Binary files /dev/null and 
b/dolphinscheduler-ui/public/images/task-icons/linkis.png differ
diff --git a/dolphinscheduler-ui/public/images/task-icons/linkis_hover.png 
b/dolphinscheduler-ui/public/images/task-icons/linkis_hover.png
new file mode 100644
index 0000000000..2b86776d89
Binary files /dev/null and 
b/dolphinscheduler-ui/public/images/task-icons/linkis_hover.png differ
diff --git a/dolphinscheduler-ui/src/store/project/task-type.ts 
b/dolphinscheduler-ui/src/store/project/task-type.ts
index e403cbfc68..b1f426bef8 100644
--- a/dolphinscheduler-ui/src/store/project/task-type.ts
+++ b/dolphinscheduler-ui/src/store/project/task-type.ts
@@ -145,6 +145,10 @@ export const TASK_TYPES_MAP = {
   KUBEFLOW: {
     alias: 'KUBEFLOW',
     helperLinkDisable: true
+  },
+  LINKIS: {
+    alias: 'LINKIS',
+    helperLinkDisable: true
   }
 } as {
   [key in TaskType]: {
diff --git a/dolphinscheduler-ui/src/store/project/types.ts 
b/dolphinscheduler-ui/src/store/project/types.ts
index 0cc500385d..050190cf40 100644
--- a/dolphinscheduler-ui/src/store/project/types.ts
+++ b/dolphinscheduler-ui/src/store/project/types.ts
@@ -55,6 +55,7 @@ type TaskType =
   | 'DMS'
   | 'DATASYNC'
   | 'KUBEFLOW'
+  | 'LINKIS'
 
 type ProgramType = 'JAVA' | 'SCALA' | 'PYTHON'
 type DependentResultType = {
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/index.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/index.ts
index d0df64cdba..678f7d2ce3 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/index.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/index.ts
@@ -83,3 +83,4 @@ export { useHiveCli } from './use-hive-cli'
 export { useDms } from './use-dms'
 export { useDatasync } from './use-datasync'
 export { useKubeflow } from './use-kubeflow'
+export { useLinkis } from './use-linkis'
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-linkis.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-linkis.ts
new file mode 100644
index 0000000000..df3088a48a
--- /dev/null
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-linkis.ts
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { computed } from 'vue'
+import { useI18n } from 'vue-i18n'
+import { useCustomParams } from '.'
+import type { IJsonItem } from '../types'
+
+export function useLinkis(model: { [field: string]: any }): IJsonItem[] {
+  const { t } = useI18n()
+
+  const configEditorSpan = computed(() => (model.useCustom ? 24 : 0))
+  const parmaEditorSpan = computed(() => (model.useCustom ? 0 : 24))
+  computed(() => (model.useCustom ? 0 : 24));
+  return [
+    {
+      type: 'switch',
+      field: 'useCustom',
+      name: t('project.node.custom_config')
+    },
+    {
+      type: 'custom-parameters',
+      field: 'paramScript',
+      name: t('project.node.option_parameters'),
+      span: parmaEditorSpan,
+      children: [
+        {
+          type: 'input',
+          field: 'prop',
+          span: 10,
+          props: {
+            placeholder: t('project.node.prop_tips'),
+            maxLength: 256
+          },
+          validate: {
+            trigger: ['input', 'blur'],
+            required: true,
+            validator(validate: any, value: string) {
+              if (!value) {
+                return new Error(t('project.node.prop_tips'))
+              }
+
+              const sameItems = model.localParams.filter(
+                  (item: { prop: string }) => item.prop === value
+              )
+
+              if (sameItems.length > 1) {
+                return new Error(t('project.node.prop_repeat'))
+              }
+            }
+          }
+        },
+        {
+          type: 'input',
+          field: 'value',
+          span: 10,
+          props: {
+            placeholder: t('project.node.value_tips'),
+            maxLength: 256
+          }
+        }
+      ]
+    },
+    {
+      type: 'editor',
+      field: 'rawScript',
+      name: t('project.node.script'),
+      span: configEditorSpan,
+      validate: {
+        trigger: ['input', 'trigger'],
+        required: model.useCustom,
+        validator(validate: any, value: string) {
+          if (model.useCustom && !value) {
+            return new Error(t('project.node.script_tips'))
+          }
+        }
+      }
+    },
+    ...useCustomParams({ model, field: 'localParams', isSimple: true })
+  ]
+}
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
index 276b872f4b..a8b1def6b3 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
@@ -460,6 +460,12 @@ export function formatParams(data: INodeData): {
     taskParams.yamlContent = data.yamlContent
     taskParams.namespace = data.namespace
   }
+  
+  if (data.taskType === 'LINKIS') {
+    taskParams.useCustom = data.useCustom
+    taskParams.paramScript = data.paramScript
+    taskParams.rawScript = data.rawScript
+  }
 
   let timeoutNotifyStrategy = ''
   if (data.timeoutNotifyStrategy) {
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/index.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/index.ts
index 6fa4c47ee0..1b6f998b4e 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/index.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/index.ts
@@ -49,7 +49,7 @@ import { useHiveCli } from './use-hive-cli'
 import { useDms } from './use-dms'
 import { useDatasync } from './use-datasync'
 import { useKubeflow } from './use-kubeflow'
-
+import { useLinkis } from './use-linkis'
 
 export default {
   SHELL: useShell,
@@ -85,5 +85,6 @@ export default {
   HIVECLI: useHiveCli,
   DMS: useDms,
   DATASYNC: useDatasync,
-  KUBEFLOW: useKubeflow
+  KUBEFLOW: useKubeflow,
+  LINKIS: useLinkis
 }
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-linkis.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-linkis.ts
new file mode 100644
index 0000000000..8b0afaf93b
--- /dev/null
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-linkis.ts
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { reactive } from 'vue'
+import * as Fields from '../fields/index'
+import type { IJsonItem, INodeData } from '../types'
+import { ITaskData } from '../types'
+
+export function useLinkis({
+  projectCode,
+  from = 0,
+  readonly,
+  data
+}: {
+  projectCode: number
+  from?: number
+  readonly?: boolean
+  data?: ITaskData
+}) {
+  const model = reactive({
+    name: '',
+    taskType: 'LINKIS',
+    flag: 'YES',
+    description: '',
+    timeoutFlag: false,
+    localParams: [],
+    environmentCode: null,
+    failRetryInterval: 1,
+    failRetryTimes: 0,
+    workerGroup: 'default',
+    cpuQuota: -1,
+    memoryMax: -1,
+    delayTime: 0,
+    timeout: 30,
+    timeoutNotifyStrategy: ['WARN'],
+    useCustom: false,
+    paramScript: [
+      {
+        prop: '',
+        value: ''
+      },
+    ],
+    rawScript: ''
+  } as INodeData)
+
+  return {
+    json: [
+      Fields.useName(from),
+      ...Fields.useTaskDefinition({ projectCode, from, readonly, data, model 
}),
+      Fields.useRunFlag(),
+      Fields.useDescription(),
+      Fields.useTaskPriority(),
+      Fields.useWorkerGroup(),
+      Fields.useEnvironmentName(model, !data?.id),
+      ...Fields.useTaskGroup(model, projectCode),
+      ...Fields.useFailed(),
+      ...Fields.useResourceLimit(),
+      Fields.useDelayTime(model),
+      ...Fields.useTimeoutAlarm(model),
+      ...Fields.useLinkis(model),
+      Fields.usePreTasks()
+    ] as IJsonItem[],
+    model
+  }
+}
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
index 6f07500cc8..64eea2c040 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
@@ -396,6 +396,7 @@ interface ITaskParams {
   name?: string
   cloudWatchLogGroupArn?: string
   yamlContent?: string
+  paramScript?: ILocalParam[]
 }
 
 interface INodeData
diff --git a/dolphinscheduler-ui/src/views/projects/task/constants/task-type.ts 
b/dolphinscheduler-ui/src/views/projects/task/constants/task-type.ts
index 8de119648f..2606bea240 100644
--- a/dolphinscheduler-ui/src/views/projects/task/constants/task-type.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/constants/task-type.ts
@@ -49,6 +49,7 @@ export type TaskType =
   | 'DMS'
   | 'DATASYNC'
   | 'KUBEFLOW'
+  | 'LINKIS'
 
 export type TaskExecuteType = 'STREAM' | 'BATCH'
 
@@ -175,6 +176,10 @@ export const TASK_TYPES_MAP = {
   KUBEFLOW: {
     alias: 'KUBEFLOW',
     helperLinkDisable: true
+  },
+  LINKIS: {
+    alias: 'LINKIS',
+    helperLinkDisable: true
   }
 } as {
   [key in TaskType]: {
diff --git 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag.module.scss
 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag.module.scss
index 09cd094732..ab61220845 100644
--- 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag.module.scss
+++ 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag.module.scss
@@ -196,7 +196,10 @@ $bgLight: #ffffff;
       background-image: url('/images/task-icons/dms.png');
     }
     &.icon-datasync {
-      background-image: url('/images/task-icons/datasync_hover.png');
+      background-image: url('/images/task-icons/datasync.png');
+    }
+    &.icon-linkis {
+      background-image: url('/images/task-icons/linkis.png');
     }
     &.icon-kubeflow {
       background-image: url('/images/task-icons/kubeflow_hover.png');
@@ -300,7 +303,10 @@ $bgLight: #ffffff;
         background-image: url('/images/task-icons/dms_hover.png');
       }
       &.icon-datasync {
-        background-image: url('/images/task-icons/datasync.png');
+        background-image: url('/images/task-icons/datasync_hover.png');
+      }
+      &.icon-linkis {
+        background-image: url('/images/task-icons/linkis_hover.png');
       }
       &.icon-kubeflow {
         background-image: url('/images/task-icons/kubeflow.png');
diff --git a/script/env/dolphinscheduler_env.sh 
b/script/env/dolphinscheduler_env.sh
index 4c4405437c..6701e9f49c 100755
--- a/script/env/dolphinscheduler_env.sh
+++ b/script/env/dolphinscheduler_env.sh
@@ -31,6 +31,7 @@ export FLINK_HOME=${FLINK_HOME:-/opt/soft/flink}
 export DATAX_HOME=${DATAX_HOME:-/opt/soft/datax}
 export SEATUNNEL_HOME=${SEATUNNEL_HOME:-/opt/soft/seatunnel}
 export CHUNJUN_HOME=${CHUNJUN_HOME:-/opt/soft/chunjun}
+export LINKIS_HOME=${LINKIS_HOME:-/opt/soft/linkis}
 
 export 
PATH=$HADOOP_HOME/bin:$SPARK_HOME/bin:$PYTHON_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$FLINK_HOME/bin:$DATAX_HOME/bin:$SEATUNNEL_HOME/bin:$CHUNJUN_HOME/bin:$PATH
 

Reply via email to