diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/pom.xml b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/pom.xml
new file mode 100644
index 0000000000..911e28d84d
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/pom.xml
@@ -0,0 +1,75 @@
+
+
+
+
+ dolphinscheduler-alert-plugin
+ org.apache.dolphinscheduler
+ 1.3.2-SNAPSHOT
+
+ 4.0.0
+
+ org.apache.dolphinscheduler
+ dolphinscheduler-alert-script
+
+
+
+
+
+ org.apache.dolphinscheduler
+ dolphinscheduler-spi
+ provided
+
+
+
+ com.google.guava
+ guava
+
+
+
+ ch.qos.logback
+ logback-classic
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ provided
+
+
+
+ junit
+ junit
+ test
+
+
+
+ org.mockito
+ mockito-core
+ jar
+ test
+
+
+
+
\ No newline at end of file
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/OSUtils.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/OSUtils.java
new file mode 100644
index 0000000000..acf3e310cc
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/OSUtils.java
@@ -0,0 +1,32 @@
+/*
+ * 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.alert.script;
+
+/**
+ * OSUtils
+ */
+public class OSUtils {
+
+ public OSUtils() {
+ throw new UnsupportedOperationException("Construct OSUtils");
+ }
+
+ static Boolean isWindows() {
+ return System.getProperty("os.name").startsWith("Windows");
+ }
+}
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ProcessUtils.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ProcessUtils.java
new file mode 100644
index 0000000000..d63a350051
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ProcessUtils.java
@@ -0,0 +1,62 @@
+/*
+ * 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.alert.script;
+
+import java.io.IOException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * ProcessUtils
+ */
+public class ProcessUtils {
+
+ private static final Logger logger = LoggerFactory.getLogger(ProcessUtils.class);
+
+ private ProcessUtils() {
+ throw new IllegalStateException("Utility class");
+ }
+
+ /**
+ * executeScript
+ *
+ * @param cmd cmd params
+ * @return exit code
+ */
+ static Integer executeScript(String... cmd) {
+
+ int exitCode = -1;
+
+ ProcessBuilder processBuilder = new ProcessBuilder(cmd);
+ try {
+ Process process = processBuilder.start();
+ StreamGobbler inputStreamGobbler = new StreamGobbler(process.getInputStream());
+ StreamGobbler errorStreamGobbler = new StreamGobbler(process.getErrorStream());
+
+ inputStreamGobbler.start();
+ errorStreamGobbler.start();
+ return process.waitFor();
+ } catch (IOException | InterruptedException e) {
+ logger.error("execute alert script error {}", e.getMessage());
+ Thread.currentThread().interrupt();
+ }
+
+ return exitCode;
+ }
+}
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannel.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannel.java
new file mode 100644
index 0000000000..2a0021277d
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannel.java
@@ -0,0 +1,40 @@
+/*
+ * 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.alert.script;
+
+import org.apache.dolphinscheduler.spi.alert.AlertChannel;
+import org.apache.dolphinscheduler.spi.alert.AlertData;
+import org.apache.dolphinscheduler.spi.alert.AlertInfo;
+import org.apache.dolphinscheduler.spi.alert.AlertResult;
+import org.apache.dolphinscheduler.spi.params.PluginParamsTransfer;
+
+import java.util.Map;
+
+/**
+ * ScriptAlertChannel
+ */
+public class ScriptAlertChannel implements AlertChannel {
+
+ @Override
+ public AlertResult process(AlertInfo alertinfo) {
+ AlertData alertData = alertinfo.getAlertData();
+ String alertParams = alertinfo.getAlertParams();
+ Map paramsMap = PluginParamsTransfer.getPluginParamsMap(alertParams);
+ return new ScriptSender(paramsMap).sendScriptAlert(alertData.getTitle());
+ }
+}
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannelFactory.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannelFactory.java
new file mode 100644
index 0000000000..fe7f7adb00
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannelFactory.java
@@ -0,0 +1,71 @@
+/*
+ * 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.alert.script;
+
+import org.apache.dolphinscheduler.spi.alert.AlertChannel;
+import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
+import org.apache.dolphinscheduler.spi.params.InputParam;
+import org.apache.dolphinscheduler.spi.params.RadioParam;
+import org.apache.dolphinscheduler.spi.params.base.ParamsOptions;
+import org.apache.dolphinscheduler.spi.params.base.PluginParams;
+import org.apache.dolphinscheduler.spi.params.base.Validate;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * ScriptAlertChannelFactory
+ */
+public class ScriptAlertChannelFactory implements AlertChannelFactory {
+
+ @Override
+ public String getName() {
+ return "script alert";
+ }
+
+ @Override
+ public List getParams() {
+
+ InputParam scriptUserParam = InputParam.newBuilder(ScriptParamsConstants.NAME_SCRIPT_USER_PARAMS, ScriptParamsConstants.SCRIPT_USER_PARAMS)
+ .addValidate(Validate.newBuilder()
+ .setRequired(false)
+ .build())
+ .setPlaceholder("please enter your custom parameters, which will be passed to you when calling your script")
+ .build();
+ // need check file type and file exist
+ InputParam scriptPathParam = InputParam.newBuilder(ScriptParamsConstants.NAME_SCRIPT_PATH, ScriptParamsConstants.SCRIPT_PATH)
+ .addValidate(Validate.newBuilder()
+ .setRequired(true)
+ .build())
+ .setPlaceholder("please upload the file to the disk directory of the alert server, and ensure that the path is absolute and has the corresponding access rights")
+ .build();
+
+ RadioParam scriptTypeParams = RadioParam.newBuilder(ScriptParamsConstants.NAME_SCRIPT_TYPE, ScriptParamsConstants.SCRIPT_TYPE)
+ .addParamsOptions(new ParamsOptions(ScriptType.SHELL.getDescp(), ScriptType.SHELL.getCode(), false))
+ .setValue(ScriptType.SHELL.getCode())
+ .addValidate(Validate.newBuilder().setRequired(true).build())
+ .build();
+
+ return Arrays.asList(scriptUserParam, scriptPathParam, scriptTypeParams);
+ }
+
+ @Override
+ public AlertChannel create() {
+ return new ScriptAlertChannel();
+ }
+}
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertPlugin.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertPlugin.java
new file mode 100644
index 0000000000..f2ba0e87d0
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertPlugin.java
@@ -0,0 +1,35 @@
+/*
+ * 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.alert.script;
+
+import org.apache.dolphinscheduler.spi.DolphinSchedulerPlugin;
+import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * ScriptAlertPlugin
+ */
+public class ScriptAlertPlugin implements DolphinSchedulerPlugin {
+
+ @Override
+ public Iterable getAlertChannelFactorys() {
+ return ImmutableList.of(new ScriptAlertChannelFactory());
+ }
+
+}
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptParamsConstants.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptParamsConstants.java
new file mode 100644
index 0000000000..67193c853d
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptParamsConstants.java
@@ -0,0 +1,36 @@
+/*
+ * 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.alert.script;
+
+/**
+ * ScriptParamsConstants
+ */
+public class ScriptParamsConstants {
+
+ static final String SCRIPT_TYPE = "script.type";
+
+ static final String NAME_SCRIPT_TYPE = "scriptType";
+
+ static final String SCRIPT_PATH = "script.path";
+
+ static final String NAME_SCRIPT_PATH = "scriptPath";
+
+ static final String SCRIPT_USER_PARAMS = "script.user.params";
+
+ static final String NAME_SCRIPT_USER_PARAMS = "scriptUserParams";
+}
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSender.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSender.java
new file mode 100644
index 0000000000..377c318b8e
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSender.java
@@ -0,0 +1,74 @@
+/*
+ * 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.alert.script;
+
+import org.apache.dolphinscheduler.spi.alert.AlertResult;
+
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * ScriptSender
+ */
+public class ScriptSender {
+
+ private static final Logger logger = LoggerFactory.getLogger(ScriptSender.class);
+
+ private String scriptPath;
+
+ private Integer scriptType;
+
+ private String userParams;
+
+ ScriptSender(Map config) {
+ scriptPath = config.get(ScriptParamsConstants.NAME_SCRIPT_PATH);
+ scriptType = Integer.parseInt(config.get(ScriptParamsConstants.NAME_SCRIPT_TYPE));
+ userParams = config.get(ScriptParamsConstants.NAME_SCRIPT_USER_PARAMS);
+ }
+
+ AlertResult sendScriptAlert(String msg) {
+ AlertResult alertResult = new AlertResult();
+ if (ScriptType.of(scriptType).equals(ScriptType.SHELL)) {
+ return executeShellScript(msg);
+ }
+ return alertResult;
+ }
+
+ private AlertResult executeShellScript(String msg) {
+ AlertResult alertResult = new AlertResult();
+ alertResult.setStatus("false");
+ if (Boolean.TRUE.equals(OSUtils.isWindows())) {
+ alertResult.setMessage("shell script not support windows os");
+ return alertResult;
+ }
+ String[] cmd = {"/bin/sh", "-c", scriptPath + " " + msg + " " + userParams};
+ int exitCode = ProcessUtils.executeScript(cmd);
+
+ if (exitCode == 0) {
+ alertResult.setStatus("true");
+ alertResult.setMessage("send script alert msg success");
+ return alertResult;
+ }
+ alertResult.setMessage("send script alert msg error,exitCode is " + exitCode);
+ logger.info("send script alert msg error,exitCode is {}", exitCode);
+ return alertResult;
+ }
+
+}
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptType.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptType.java
new file mode 100644
index 0000000000..59b17d0a58
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptType.java
@@ -0,0 +1,62 @@
+/*
+ * 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.alert.script;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * ScriptType
+ */
+public enum ScriptType {
+
+
+ SHELL(0, "SHELL"),
+ ;
+
+ ScriptType(int code, String descp) {
+ this.code = code;
+ this.descp = descp;
+ }
+
+ private final int code;
+ private final String descp;
+
+ public int getCode() {
+ return code;
+ }
+
+ public String getDescp() {
+ return descp;
+ }
+
+ private static final Map SCRIPT_TYPE_MAP = new HashMap<>();
+
+ static {
+ for (ScriptType scriptType : ScriptType.values()) {
+ SCRIPT_TYPE_MAP.put(scriptType.code, scriptType);
+ }
+ }
+
+ public static ScriptType of(Integer code) {
+ if (SCRIPT_TYPE_MAP.containsKey(code)) {
+ return SCRIPT_TYPE_MAP.get(code);
+ }
+ throw new IllegalArgumentException("invalid code : " + code);
+ }
+}
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/StreamGobbler.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/StreamGobbler.java
new file mode 100644
index 0000000000..2ec25280b4
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/main/java/org/apache/dolphinscheduler/plugin/alert/script/StreamGobbler.java
@@ -0,0 +1,61 @@
+/*
+ * 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.alert.script;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * StreamGobbler
+ */
+public class StreamGobbler extends Thread {
+
+ private static final Logger logger = LoggerFactory.getLogger(StreamGobbler.class);
+
+ private InputStream inputStream;
+
+ StreamGobbler(InputStream inputStream) {
+ this.inputStream = inputStream;
+ }
+
+ @Override
+ public void run() {
+ InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
+ BufferedReader inputBufferReader = new BufferedReader(inputStreamReader);
+
+ try {
+ String line;
+ StringBuilder output = new StringBuilder();
+ while ((line = inputBufferReader.readLine()) != null) {
+ output.append(line);
+ output.append(System.getProperty("line.separator"));
+ }
+ if (output.length() > 0) {
+ logger.info("out put msg is{}",output.toString());
+ }
+ } catch (IOException e) {
+ logger.error("I/O error occurs {}", e.getMessage());
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ProcessUtilsTest.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ProcessUtilsTest.java
new file mode 100644
index 0000000000..1bf98d2019
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ProcessUtilsTest.java
@@ -0,0 +1,37 @@
+/*
+ * 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.alert.script;
+
+import org.junit.Test;
+
+/**
+ * ProcessUtilsTest
+ */
+public class ProcessUtilsTest {
+
+ private static final String rootPath = System.getProperty("user.dir");
+
+ private static final String shellFilPath = rootPath + "/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/script/shell/example.sh";
+
+ private String[] cmd = {"/bin/sh", "-c", shellFilPath + " " + "testMsg" + " " + "userParams"};
+
+ @Test
+ public void testExecuteScript() {
+ ProcessUtils.executeScript(cmd);
+ }
+}
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannelFactoryTest.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannelFactoryTest.java
new file mode 100644
index 0000000000..72f2197315
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptAlertChannelFactoryTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.alert.script;
+
+import org.apache.dolphinscheduler.spi.alert.AlertChannel;
+import org.apache.dolphinscheduler.spi.params.base.PluginParams;
+import org.apache.dolphinscheduler.spi.utils.JSONUtils;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * ScriptAlertChannelFactoryTest
+ */
+public class ScriptAlertChannelFactoryTest {
+
+ @Test
+ public void testGetParams() {
+ ScriptAlertChannelFactory scriptAlertChannelFactory = new ScriptAlertChannelFactory();
+ List params = scriptAlertChannelFactory.getParams();
+ JSONUtils.toJsonString(params);
+ Assert.assertEquals(3, params.size());
+ }
+
+ @Test
+ public void testCreate() {
+ ScriptAlertChannelFactory scriptAlertChannelFactory = new ScriptAlertChannelFactory();
+ AlertChannel alertChannel = scriptAlertChannelFactory.create();
+ Assert.assertNotNull(alertChannel);
+ }
+}
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSenderTest.java b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSenderTest.java
new file mode 100644
index 0000000000..1cd74cfaba
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/java/org/apache/dolphinscheduler/plugin/alert/script/ScriptSenderTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.alert.script;
+
+import org.apache.dolphinscheduler.spi.alert.AlertResult;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * ScriptSenderTest
+ */
+public class ScriptSenderTest {
+
+ private static Map scriptConfig = new HashMap<>();
+
+ private static final String rootPath = System.getProperty("user.dir");
+
+ private static final String shellFilPath = rootPath + "/src/test/script/shell/scriptTest.sh";
+
+ @Before
+ public void initScriptConfig() {
+
+ scriptConfig.put(ScriptParamsConstants.NAME_SCRIPT_TYPE, String.valueOf(ScriptType.SHELL.getCode()));
+ scriptConfig.put(ScriptParamsConstants.NAME_SCRIPT_USER_PARAMS, "userParams");
+ scriptConfig.put(ScriptParamsConstants.NAME_SCRIPT_PATH, shellFilPath);
+ }
+
+ @Test
+ public void testScriptSenderTest() {
+ ScriptSender scriptSender = new ScriptSender(scriptConfig);
+ AlertResult alertResult;
+ alertResult = scriptSender.sendScriptAlert("success");
+ Assert.assertEquals("true", alertResult.getStatus());
+ alertResult = scriptSender.sendScriptAlert("errorMsg");
+ Assert.assertEquals("false", alertResult.getStatus());
+ }
+
+}
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/script/shell/example.sh b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/script/shell/example.sh
new file mode 100755
index 0000000000..708dcd004b
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/script/shell/example.sh
@@ -0,0 +1,25 @@
+#
+# 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.
+#
+
+
+msg=$1
+content=$2
+
+# Write your specific logic here
+
+# Set the exit code according to your execution result, and alert needs to use it to judge the status of this alarm result
+exit 0
diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/script/shell/scriptTest.sh b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/script/shell/scriptTest.sh
new file mode 100755
index 0000000000..02eba48a81
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-script/src/test/script/shell/scriptTest.sh
@@ -0,0 +1,25 @@
+#
+# 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.
+#
+
+msg=$1
+content=$2
+
+if [ $msg = errorMsg ]
+ then
+ exit 12
+fi
+exit 0
\ No newline at end of file
diff --git a/dolphinscheduler-alert-plugin/pom.xml b/dolphinscheduler-alert-plugin/pom.xml
index d2fbca305d..0f25f1f19b 100644
--- a/dolphinscheduler-alert-plugin/pom.xml
+++ b/dolphinscheduler-alert-plugin/pom.xml
@@ -33,6 +33,7 @@
dolphinscheduler-alert-email
dolphinscheduler-alert-wechat
dolphinscheduler-alert-dingtalk
+ dolphinscheduler-alert-script
diff --git a/pom.xml b/pom.xml
index c0c920d069..33c1dd35d2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -957,6 +957,9 @@
**/plugin/alert/dingtalk/DingTalkAlertChannelFactoryTest.java
**/plugin/alert/wechat/WeChatSenderTest.java
**/plugin/alert/wechat/WeChatAlertChannelFactoryTest.java
+ **/plugin/alert/script/ProcessUtilsTest.java
+ **/plugin/alert/script/ScriptAlertChannelFactoryTest.java
+ **/plugin/alert/script/ScriptSenderTest.java
**/spi/params/PluginParamsTransferTest.java
**/alert/plugin/EmailAlertPluginTest.java
**/alert/plugin/AlertPluginManagerTest.java