You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by gi...@apache.org on 2022/06/19 06:00:23 UTC

[dolphinscheduler-website] branch asf-site updated: Automated deployment: a7d0de2b86d26e21479d52cb2b94d34fc8d5c7be

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

github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new a91de5f22 Automated deployment: a7d0de2b86d26e21479d52cb2b94d34fc8d5c7be
a91de5f22 is described below

commit a91de5f2271ea20519f2f077a570bc3796833e8c
Author: github-actions[bot] <gi...@users.noreply.github.com>
AuthorDate: Sun Jun 19 06:00:17 2022 +0000

    Automated deployment: a7d0de2b86d26e21479d52cb2b94d34fc8d5c7be
---
 ...ent.md.627e13d.js => development.md.83367a2.js} |   2 +-
 en-us/development/api-standard.html                |   4 +-
 .../{api-standard.html => api-test.html}           | 157 +++++++++-----------
 en-us/development/api-test.json                    |   6 +
 en-us/development/architecture-design.html         |   4 +-
 .../backend/mechanism/global-parameter.html        |   4 +-
 en-us/development/backend/mechanism/overview.html  |   4 +-
 .../development/backend/mechanism/task/switch.html |   4 +-
 en-us/development/backend/spi/alert.html           |   4 +-
 en-us/development/backend/spi/datasource.html      |   4 +-
 en-us/development/backend/spi/registry.html        |   4 +-
 en-us/development/backend/spi/task.html            |   4 +-
 .../development/development-environment-setup.html |   4 +-
 en-us/development/e2e-test.html                    |   4 +-
 en-us/development/frontend-development.html        |   4 +-
 en-us/development/have-questions.html              |   4 +-
 zh-cn/development/api-standard.html                |   4 +-
 .../{api-standard.html => api-test.html}           | 158 +++++++++------------
 zh-cn/development/api-test.json                    |   6 +
 zh-cn/development/architecture-design.html         |   4 +-
 .../backend/mechanism/global-parameter.html        |   4 +-
 zh-cn/development/backend/mechanism/overview.html  |   4 +-
 .../development/backend/mechanism/task/switch.html |   4 +-
 zh-cn/development/backend/spi/alert.html           |   4 +-
 zh-cn/development/backend/spi/datasource.html      |   4 +-
 zh-cn/development/backend/spi/registry.html        |   4 +-
 zh-cn/development/backend/spi/task.html            |   4 +-
 .../development/development-environment-setup.html |   4 +-
 zh-cn/development/e2e-test.html                    |   4 +-
 zh-cn/development/frontend-development.html        |   4 +-
 zh-cn/development/have-questions.html              |   4 +-
 31 files changed, 194 insertions(+), 239 deletions(-)

diff --git a/build/development.md.627e13d.js b/build/development.md.83367a2.js
similarity index 61%
rename from build/development.md.627e13d.js
rename to build/development.md.83367a2.js
index 29581eff5..bb9fceb5e 100644
--- a/build/development.md.627e13d.js
+++ b/build/development.md.83367a2.js
@@ -1 +1 @@
-webpackJsonp([7],{1:function(e,t){e.exports=React},3:function(e,t){e.exports=ReactDOM},427:function(e,t,n){"use strict";function l(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new Type [...]
\ No newline at end of file
+webpackJsonp([7],{1:function(e,t){e.exports=React},3:function(e,t){e.exports=ReactDOM},427:function(e,t,n){"use strict";function l(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new Type [...]
\ No newline at end of file
diff --git a/en-us/development/api-standard.html b/en-us/development/api-standard.html
index 4e8c15a52..d0db3618e 100644
--- a/en-us/development/api-standard.html
+++ b/en-us/development/api-standard.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <p>A standardized and unified API is the cornerstone of project design.The API of DolphinScheduler follows the REST ful standard. REST ful is currently the most popular Internet software architecture. It has a clear structure, conforms to standards, is easy to understand and extend.</p>
 <p>This article uses the DolphinScheduler API as an example to explain how to construct a Restful API.</p>
 <h2>1. URI design</h2>
@@ -106,7 +106,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/api-standard.html b/en-us/development/api-test.html
similarity index 61%
copy from en-us/development/api-standard.html
copy to en-us/development/api-test.html
index 4e8c15a52..7a536b7f5 100644
--- a/en-us/development/api-standard.html
+++ b/en-us/development/api-test.html
@@ -3,110 +3,83 @@
 <head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-  <meta name="keywords" content="api-standard">
-  <meta name="description" content="api-standard">
-  <title>api-standard</title>
+  <meta name="keywords" content="api-test">
+  <meta name="description" content="api-test">
+  <title>api-test</title>
   <link rel="shortcut icon" href="/img/favicon.ico">
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
-<p>A standardized and unified API is the cornerstone of project design.The API of DolphinScheduler follows the REST ful standard. REST ful is currently the most popular Internet software architecture. It has a clear structure, conforms to standards, is easy to understand and extend.</p>
-<p>This article uses the DolphinScheduler API as an example to explain how to construct a Restful API.</p>
-<h2>1. URI design</h2>
-<p>REST is &quot;Representational State Transfer&quot;.The design of Restful URI is based on resources.The resource corresponds to an entity on the network, for example: a piece of text, a picture, and a service. And each resource corresponds to a URI.</p>
-<ul>
-<li>One Kind of Resource: expressed in the plural, such as <code>task-instances</code>、<code>groups</code> ;</li>
-<li>A Resource: expressed in the singular, or use the ID to represent the corresponding resource, such as <code>group</code>、<code>groups/{groupId}</code>;</li>
-<li>Sub Resources: Resources under a certain resource, such as <code>/instances/{instanceId}/tasks</code>;</li>
-<li>A Sub Resource:<code>/instances/{instanceId}/tasks/{taskId}</code>;</li>
-</ul>
-<h2>2. Method design</h2>
-<p>We need to locate a certain resource by URI, and then use Method or declare actions in the path suffix to reflect the operation of the resource.</p>
-<h3>① Query - GET</h3>
-<p>Use URI to locate the resource, and use GET to indicate query.</p>
-<ul>
-<li>When the URI is a type of resource, it means to query a type of resource. For example, the following example indicates paging query <code>alter-groups</code>.</li>
-</ul>
-<pre><code>Method: GET
-/dolphinscheduler/alert-groups
-</code></pre>
-<ul>
-<li>When the URI is a single resource, it means to query this resource. For example, the following example means to query the specified <code>alter-group</code>.</li>
-</ul>
-<pre><code>Method: GET
-/dolphinscheduler/alter-groups/{id}
-</code></pre>
-<ul>
-<li>In addition, we can also express query sub-resources based on URI, as follows:</li>
-</ul>
-<pre><code>Method: GET
-/dolphinscheduler/projects/{projectId}/tasks
-</code></pre>
-<p><strong>The above examples all represent paging query. If we need to query all data, we need to add <code>/list</code> after the URI to distinguish. Do not mix the same API for both paged query and query.</strong></p>
-<pre><code>Method: GET
-/dolphinscheduler/alert-groups/list
-</code></pre>
-<h3>② Create - POST</h3>
-<p>Use URI to locate the resource, use POST to indicate create, and then return the created id to requester.</p>
-<ul>
-<li>create an <code>alter-group</code>:</li>
-</ul>
-<pre><code>Method: POST
-/dolphinscheduler/alter-groups
-</code></pre>
-<ul>
-<li>create sub-resources is also the same as above.</li>
-</ul>
-<pre><code>Method: POST
-/dolphinscheduler/alter-groups/{alterGroupId}/tasks
-</code></pre>
-<h3>③ Modify - PUT</h3>
-<p>Use URI to locate the resource, use PUT to indicate modify.</p>
-<ul>
-<li>modify an <code>alert-group</code></li>
-</ul>
-<pre><code>Method: PUT
-/dolphinscheduler/alter-groups/{alterGroupId}
-</code></pre>
-<h3>④ Delete -DELETE</h3>
-<p>Use URI to locate the resource, use DELETE to indicate delete.</p>
-<ul>
-<li>delete an <code>alert-group</code></li>
-</ul>
-<pre><code>Method: DELETE
-/dolphinscheduler/alter-groups/{alterGroupId}
-</code></pre>
-<ul>
-<li>batch deletion: batch delete the id array,we should use POST. <strong>(Do not use the DELETE method, because the body of the DELETE request has no semantic meaning, and it is possible that some gateways, proxies, and firewalls will directly strip off the request body after receiving the DELETE request.)</strong></li>
-</ul>
-<pre><code>Method: POST
-/dolphinscheduler/alter-groups/batch-delete
-</code></pre>
-<h3>⑤ Partial Modifications -PATCH</h3>
-<p>Use URI to locate the resource, use PATCH to partial modifications.</p>
-<pre><code>Method: PATCH
-/dolphinscheduler/alter-groups/{alterGroupId}
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+<h2>Preparatory knowledge</h2>
+<h3>The difference between API Test and Unit Test</h3>
+<p>API test, which imitates the user calling API, starts from a certain entry and performs operations step by step until a certain work is completed. Different from unit testing, the latter usually needs to test parameters, parameter types, parameter values, parameter numbers, return values, throw errors, etc. in order to ensure that a specific function can complete its work stably and reliably in any case. Unit tests assume that the entire product will work as long as all functions work [...]
+<p>In contrast, API testing focuses on whether a complete operation chain can be completed</p>
+<p>For example, the API test of the tenant management interface focuses on whether users can log in normally; If the login fails, whether the error message can be displayed correctly. After logging in, you can perform tenant management operations through the sessionid you carry.</p>
+<h2>API Test</h2>
+<h3>API-Pages</h3>
+<p>DolphinScheduler's API tests are deployed using docker-compose. The current tests are in standalone mode and are mainly used to check some basic functions such as &quot;add, delete, change and check&quot;. For further cluster validation, such as collaboration between services or communication mechanisms between services, refer to <code>deploy/docker/docker-compose.yml</code> for configuration.</p>
+<p>For API test,  the <a href="https://www.selenium.dev/documentation/guidelines/page_object_models/">page model</a> form is used, mainly to create a corresponding model for each page. The following is an example of a login page.</p>
+<pre><code class="language-java"><span class="hljs-keyword">package</span> org.apache.dolphinscheduler.api.test.pages;
+
+
+<span class="hljs-keyword">import</span> org.apache.dolphinscheduler.api.test.entity.HttpResponse;
+<span class="hljs-keyword">import</span> org.apache.dolphinscheduler.api.test.utils.RequestClient;
+
+<span class="hljs-keyword">import</span> java.util.HashMap;
+<span class="hljs-keyword">import</span> java.util.Map;
+
+<span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoginPage</span> </span>{
+    <span class="hljs-function"><span class="hljs-keyword">public</span> HttpResponse <span class="hljs-title">login</span><span class="hljs-params">(String username, String password)</span> </span>{
+        Map&lt;String, Object&gt; params = <span class="hljs-keyword">new</span> HashMap&lt;&gt;();
+
+        params.put(<span class="hljs-string">&quot;userName&quot;</span>, username);
+        params.put(<span class="hljs-string">&quot;userPassword&quot;</span>, password);
+
+        RequestClient requestClient = <span class="hljs-keyword">new</span> RequestClient();
+
+        <span class="hljs-keyword">return</span> requestClient.post(<span class="hljs-string">&quot;/login&quot;</span>, <span class="hljs-keyword">null</span>, params);
+    }
+}
 </code></pre>
-<h3>⑥ Others</h3>
-<p>In addition to creating, deleting, modifying and quering, we also locate the corresponding resource through url, and then append operations to it after the path, such as:</p>
-<pre><code>/dolphinscheduler/alert-groups/verify-name
-/dolphinscheduler/projects/{projectCode}/process-instances/{code}/view-gantt
+<p>During the test process, we only test the interfaces we need to focus on, not all interfaces in the page. Therefore, we only declare the user name, password and interface path on the login page.</p>
+<p>In addition, during the testing process, the interface are not requested directly. The general choice is to package the corresponding methods to achieve the effect of reuse. For example, if you want to log in, you input your username and password through the <code>public LoginPage login()</code> method to manipulate the elements you pass in to achieve the effect of logging in. That is, when the user finishes logging in, he or she achieve the effect of login.</p>
+<p>On the login page, only the input parameter specification of the interface request is defined. For the output parameter of the interface request, only the unified basic response structure is defined. The data actually returned by the interface is tested in the actual test case. Whether the input and output of main test interfaces can meet the requirements of test cases.</p>
+<h3>API-Cases</h3>
+<p>The following is an example of a tenant management test. As explained earlier, we use docker-compose for deployment, so for each test case, we need to import the corresponding file in the form of an annotation.</p>
+<p>The interface is requested using the RemoteWebDriver provided with Selenium. Before each test case is started there is some preparation work that needs to be done. For example: logging in the user, jumping to the corresponding page (depending on the specific test case).</p>
+<pre><code class="language-java">    <span class="hljs-meta">@BeforeAll</span>
+    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setup</span><span class="hljs-params">()</span> </span>{
+        LoginPage loginPage = <span class="hljs-keyword">new</span> LoginPage();
+        HttpResponse loginHttpResponse = loginPage.login(user, password);
+
+        sessionId = JSONUtils.convertValue(loginHttpResponse.body().data(), LoginResponseData.class).sessionId();
+    }
 </code></pre>
-<h2>3. Parameter design</h2>
-<p>There are two types of parameters, one is request parameter and the other is path parameter. And the parameter must use small hump.</p>
-<p>In the case of paging, if the parameter entered by the user is less than 1, the front end needs to automatically turn to 1, indicating that the first page is requested; When the backend finds that the parameter entered by the user is greater than the total number of pages, it should directly return to the last page.</p>
-<h2>4. Others design</h2>
-<h3>base URL</h3>
-<p>The URI of the project needs to use <code>/&lt;project_name&gt;</code> as the base path, so as to identify that these APIs are under this project.</p>
-<pre><code>/dolphinscheduler
+<p>When the preparation is complete, it is time for the formal test case writing. We use a form of @Order() annotation for modularity, to confirm the order of the tests. After the tests have been run, assertions are used to determine if the tests were successful, and if the assertion returns true, the tenant creation was successful. The following code can be used as a reference:</p>
+<pre><code class="language-java">    <span class="hljs-meta">@Test</span>
+    <span class="hljs-meta">@Order(1)</span>
+    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testCreateTenant</span><span class="hljs-params">()</span> </span>{
+        TenantPage tenantPage = <span class="hljs-keyword">new</span> TenantPage();
+
+        HttpResponse createTenantHttpResponse = tenantPage.createTenant(sessionId, tenant, <span class="hljs-number">1</span>, <span class="hljs-string">&quot;&quot;</span>);
+
+        Assertions.assertTrue(createTenantHttpResponse.body().success());
+    }
 </code></pre>
+<p>The rest are similar cases and can be understood by referring to the specific source code.</p>
+<p><a href="https://github.com/apache/dolphinscheduler/tree/dev/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/cases">https://github.com/apache/dolphinscheduler/tree/dev/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/cases</a></p>
+<h2>Supplements</h2>
+<p>When running API tests locally, First, you need to start the local service, you can refer to this page:
+<a href="https://dolphinscheduler.apache.org/en-us/development/development-environment-setup.html">development-environment-setup</a></p>
+<p>When running API tests locally, the <code>-Dlocal=true</code> parameter can be configured to connect locally and facilitate changes to the UI.</p>
+<p>The current default request timeout length is 10 seconds. This value should not be modified without special requirements.</p>
 </div></section><footer class="footer-container"><div class="footer-body"><div><h3>About us</h3><h4>Do you need feedback? Please contact us through the following ways.</h4></div><div class="contact-container"><ul><li><a href="/en-us/community/development/subscribe.html"><img class="img-base" src="/img/emailgray.png"/><img class="img-change" src="/img/emailblue.png"/><p>Email List</p></a></li><li><a href="https://twitter.com/dolphinschedule"><img class="img-base" src="/img/twittergray.png [...]
   <script src="/asset/js/react/react-with-addons.min.js"></script>
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/api-test.json b/en-us/development/api-test.json
new file mode 100644
index 000000000..410d56959
--- /dev/null
+++ b/en-us/development/api-test.json
@@ -0,0 +1,6 @@
+{
+  "filename": "api-test.md",
+  "__html": "<h1>DolphinScheduler API Automation Test</h1>\n<h2>Preparatory knowledge</h2>\n<h3>The difference between API Test and Unit Test</h3>\n<p>API test, which imitates the user calling API, starts from a certain entry and performs operations step by step until a certain work is completed. Different from unit testing, the latter usually needs to test parameters, parameter types, parameter values, parameter numbers, return values, throw errors, etc. in order to ensure that a specif [...]
+  "link": "/dist/en-us/development/api-test.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/development/architecture-design.html b/en-us/development/architecture-design.html
index 43ec5d048..3b9dfa872 100644
--- a/en-us/development/architecture-design.html
+++ b/en-us/development/architecture-design.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <p>Before explaining the architecture of the schedule system, let us first understand the common nouns of the schedule system.</p>
 <h3>1.Noun Interpretation</h3>
 <p><strong>DAG:</strong> Full name Directed Acyclic Graph,referred to as DAG。Tasks in the workflow are assembled in the form of directed acyclic graphs, which are topologically traversed from nodes with zero indegrees of ingress until there are no successor nodes. For example, the following picture:</p>
@@ -291,7 +291,7 @@ Public <span class="hljs-class"><span class="hljs-keyword">class</span> <span cl
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/backend/mechanism/global-parameter.html b/en-us/development/backend/mechanism/global-parameter.html
index 4f6560649..5cb7a9217 100644
--- a/en-us/development/backend/mechanism/global-parameter.html
+++ b/en-us/development/backend/mechanism/global-parameter.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <p>After the user defines the parameter with the direction OUT, it is saved in the localParam of the task.</p>
 <h2>Usage of parameters</h2>
 <p>Getting the direct predecessor node <code>preTasks</code> of the current <code>taskInstance</code> to be created from the DAG, get the <code>varPool</code> of <code>preTasks</code>, merge this varPool (List) into one <code>varPool</code>, and in the merging process, if parameters with the same parameter name are found, they will be handled according to the following logics:</p>
@@ -61,7 +61,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/backend/mechanism/overview.html b/en-us/development/backend/mechanism/overview.html
index c44a45fde..54fdf3abe 100644
--- a/en-us/development/backend/mechanism/overview.html
+++ b/en-us/development/backend/mechanism/overview.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <!-- TODO Since the side menu does not support multiple levels, add new page to keep all sub page here -->
 <ul>
 <li><a href="global-parameter.md">Global Parameter</a></li>
@@ -21,7 +21,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/backend/mechanism/task/switch.html b/en-us/development/backend/mechanism/task/switch.html
index ec045c7e5..95da3bafb 100644
--- a/en-us/development/backend/mechanism/task/switch.html
+++ b/en-us/development/backend/mechanism/task/switch.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <p>Switch task workflow step as follows</p>
 <ul>
 <li>User-defined expressions and branch information are stored in <code>taskParams</code> in <code>taskdefinition</code>. When the switch is executed, it will be formatted as <code>SwitchParameters</code></li>
@@ -23,7 +23,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/backend/spi/alert.html b/en-us/development/backend/spi/alert.html
index f9712ff7b..a5b0350f1 100644
--- a/en-us/development/backend/spi/alert.html
+++ b/en-us/development/backend/spi/alert.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <h4>DolphinScheduler SPI Design</h4>
 <p>DolphinScheduler is undergoing a microkernel + plug-in architecture change. All core capabilities such as tasks, resource storage, registration centers, etc. will be designed as extension points. We hope to use SPI to improve DolphinScheduler’s own flexibility and friendliness (extended sex).</p>
 <p>For alarm-related codes, please refer to the <code>dolphinscheduler-alert-api</code> module. This module defines the extension interface of the alarm plug-in and some basic codes. When we need to realize the plug-inization of related functions, it is recommended to read the code of this block first. Of course, it is recommended that you read the document. This will reduce a lot of time, but the document There is a certain degree of lag. When the document is missing, it is recommended  [...]
@@ -101,7 +101,7 @@ This package is a plug-in parameter definition. Our front-end uses the from-crea
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/backend/spi/datasource.html b/en-us/development/backend/spi/datasource.html
index 2f3d1df65..4687546db 100644
--- a/en-us/development/backend/spi/datasource.html
+++ b/en-us/development/backend/spi/datasource.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <h4>How do I use data sources?</h4>
 <p>The data source center supports POSTGRESQL, HIVE/IMPALA, SPARK, CLICKHOUSE, SQLSERVER data sources by default.</p>
 <p>If you are using MySQL or ORACLE data source, you need to place the corresponding driver package in the lib directory</p>
@@ -34,7 +34,7 @@ org.apache.dolphinscheduler.plugin.datasource.api.client.CommonDataSourceClient<
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/backend/spi/registry.html b/en-us/development/backend/spi/registry.html
index 7ba922531..062d39954 100644
--- a/en-us/development/backend/spi/registry.html
+++ b/en-us/development/backend/spi/registry.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <h4>how to use?</h4>
 <p>Make the following configuration (take zookeeper as an example)</p>
 <ul>
@@ -33,7 +33,7 @@ All configuration information prefixes need to be +registry, such as <a href="ht
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/backend/spi/task.html b/en-us/development/backend/spi/task.html
index 7648755ae..d90d58637 100644
--- a/en-us/development/backend/spi/task.html
+++ b/en-us/development/backend/spi/task.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <h4>How to develop task plugins?</h4>
 <p>org.apache.dolphinscheduler.spi.task.TaskChannel</p>
 <p>The plug-in can implement the above interface. It mainly includes creating tasks (task initialization, task running, etc.) and task cancellation. If it is a yarn task, you need to implement org.apache.dolphinscheduler.plugin.task.api.AbstractYarnTask.</p>
@@ -23,7 +23,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/development-environment-setup.html b/en-us/development/development-environment-setup.html
index abe241a0f..e434713e9 100644
--- a/en-us/development/development-environment-setup.html
+++ b/en-us/development/development-environment-setup.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <h2>Software Requirements</h2>
 <p>Before setting up the DolphinScheduler development environment, please make sure you have installed the software as below:</p>
 <ul>
@@ -195,7 +195,7 @@ pnpm run dev
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/e2e-test.html b/en-us/development/e2e-test.html
index ee3936955..73be39e3f 100644
--- a/en-us/development/e2e-test.html
+++ b/en-us/development/e2e-test.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <h2>I. Preparatory knowledge</h2>
 <h3>1. The difference between E2E Test and Unit Test</h3>
 <p>E2E, which stands for &quot;End to End&quot;, can be translated as &quot;end-to-end&quot; testing. It imitates the user, starting from a certain entry point and progressively performing actions until a certain job is completed. And unit tests are different, the latter usually requires testing parameters, types and parameter values, the number of arguments, the return value, throw an error, and so on, the purpose is to ensure that a specific function to finishing the work is stable and [...]
@@ -167,7 +167,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/frontend-development.html b/en-us/development/frontend-development.html
index 456e7bf7d..9223c4975 100644
--- a/en-us/development/frontend-development.html
+++ b/en-us/development/frontend-development.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <h3>Technical selection</h3>
 <pre><code>Vue mvvm framework
 
@@ -515,7 +515,7 @@ Interface parameter transfer needs to be changed to the following way</p>
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/en-us/development/have-questions.html b/en-us/development/have-questions.html
index 0181a8982..627dc6fcd 100644
--- a/en-us/development/have-questions.html
+++ b/en-us/development/have-questions.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 Have queries regarding Apache DolphinScheduler, Join Slack channel to disscuss them <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/en-us/index.html"><img class="logo [...]
 <h2>StackOverflow</h2>
 <p>For usage questions, it is recommended you use the StackOverflow tag <a href="https://stackoverflow.com/questions/tagged/apache-dolphinscheduler">apache-dolphinscheduler</a> as it is an active forum for DolphinScheduler users’ questions and answers.</p>
 <p>Some quick tips when using StackOverflow:</p>
@@ -74,7 +74,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/api-standard.html b/zh-cn/development/api-standard.html
index e6de9029f..0e2ab37b5 100644
--- a/zh-cn/development/api-standard.html
+++ b/zh-cn/development/api-standard.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <p>规范统一的 API 是项目设计的基石。DolphinScheduler 的 API 遵循 REST ful 标准,REST ful 是目前最流行的一种互联网软件架构,它结构清晰,符合标准,易于理解,扩展方便。</p>
 <p>本文以 DolphinScheduler 项目的接口为样例,讲解如何构造具有 Restful 风格的 API。</p>
 <h2>1. URI 设计</h2>
@@ -108,7 +108,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/api-standard.html b/zh-cn/development/api-test.html
similarity index 63%
copy from zh-cn/development/api-standard.html
copy to zh-cn/development/api-test.html
index e6de9029f..24d3ddd83 100644
--- a/zh-cn/development/api-standard.html
+++ b/zh-cn/development/api-test.html
@@ -3,112 +3,82 @@
 <head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-  <meta name="keywords" content="api-standard">
-  <meta name="description" content="api-standard">
-  <title>api-standard</title>
+  <meta name="keywords" content="api-test">
+  <meta name="description" content="api-test">
+  <title>api-test</title>
   <link rel="shortcut icon" href="/img/favicon.ico">
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
-<p>规范统一的 API 是项目设计的基石。DolphinScheduler 的 API 遵循 REST ful 标准,REST ful 是目前最流行的一种互联网软件架构,它结构清晰,符合标准,易于理解,扩展方便。</p>
-<p>本文以 DolphinScheduler 项目的接口为样例,讲解如何构造具有 Restful 风格的 API。</p>
-<h2>1. URI 设计</h2>
-<p>REST 即为 Representational State Transfer 的缩写,即“表现层状态转化”。</p>
-<p>“表现层”指的就是“资源”。资源对应网络上的一种实体,例如:一段文本,一张图片,一种服务。且每种资源都对应一个特定的 URI。</p>
-<p>Restful URI 的设计基于资源:</p>
-<ul>
-<li>一类资源:用复数表示,如 <code>task-instances</code>、<code>groups</code> 等;</li>
-<li>单个资源:用单数,或是用 id 值表示某类资源下的一个,如 <code>group</code>、<code>groups/{groupId}</code>;</li>
-<li>子资源:某个资源下的资源:<code>/instances/{instanceId}/tasks</code>;</li>
-<li>子资源下的单个资源:<code>/instances/{instanceId}/tasks/{taskId}</code>;</li>
-</ul>
-<h2>2. Method 设计</h2>
-<p>我们需要通过 URI 来定位某种资源,再通过 Method,或者在路径后缀声明动作来体现对资源的操作。</p>
-<h3>① 查询操作 - GET</h3>
-<p>通过 URI 来定位要资源,通过 GET 表示查询。</p>
-<ul>
-<li>当 URI 为一类资源时表示查询一类资源,例如下面样例表示分页查询 <code>alter-groups</code>。</li>
-</ul>
-<pre><code>Method: GET
-/dolphinscheduler/alert-groups
-</code></pre>
-<ul>
-<li>当 URI 为单个资源时表示查询此资源,例如下面样例表示查询对应的 <code>alter-group</code>。</li>
-</ul>
-<pre><code>Method: GET
-/dolphinscheduler/alter-groups/{id}
-</code></pre>
-<ul>
-<li>此外,我们还可以根据 URI 来表示查询子资源,如下:</li>
-</ul>
-<pre><code>Method: GET
-/dolphinscheduler/projects/{projectId}/tasks
-</code></pre>
-<p><strong>上述的关于查询的方式都表示分页查询,如果我们需要查询全部数据的话,则需在 URI 的后面加 <code>/list</code> 来区分。分页查询和查询全部不要混用一个 API。</strong></p>
-<pre><code>Method: GET
-/dolphinscheduler/alert-groups/list
-</code></pre>
-<h3>② 创建操作 - POST</h3>
-<p>通过 URI 来定位要创建的资源类型,通过 POST 表示创建动作,并且将创建后的 <code>id</code> 返回给请求者。</p>
-<ul>
-<li>下面样例表示创建一个 <code>alter-group</code>:</li>
-</ul>
-<pre><code>Method: POST
-/dolphinscheduler/alter-groups
-</code></pre>
-<ul>
-<li>创建子资源也是类似的操作:</li>
-</ul>
-<pre><code>Method: POST
-/dolphinscheduler/alter-groups/{alterGroupId}/tasks
-</code></pre>
-<h3>③ 修改操作 - PUT</h3>
-<p>通过 URI 来定位某一资源,通过 PUT 指定对其修改。</p>
-<pre><code>Method: PUT
-/dolphinscheduler/alter-groups/{alterGroupId}
-</code></pre>
-<h3>④ 删除操作 -DELETE</h3>
-<p>通过 URI 来定位某一资源,通过 DELETE 指定对其删除。</p>
-<ul>
-<li>下面例子表示删除 <code>alterGroupId</code> 对应的资源:</li>
-</ul>
-<pre><code>Method: DELETE
-/dolphinscheduler/alter-groups/{alterGroupId}
-</code></pre>
-<ul>
-<li>批量删除:对传入的 id 数组进行批量删除,使用 POST 方法。<strong>(这里不要用 DELETE 方法,因为 DELETE 请求的 body 在语义上没有任何意义,而且有可能一些网关,代理,防火墙在收到 DELETE 请求后会把请求的 body 直接剥离掉。)</strong></li>
-</ul>
-<pre><code>Method: POST
-/dolphinscheduler/alter-groups/batch-delete
-</code></pre>
-<h3>⑤ 部分更新操作 -PATCH</h3>
-<p>通过 URI 来定位某一资源,通过 PATCH 指定对其部分更新。</p>
-<ul>
-<li>下面例子表示部分更新 <code>alterGroupId</code> 对应的资源:</li>
-</ul>
-<pre><code>Method: PATCH
-/dolphinscheduler/alter-groups/{alterGroupId}
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+<h2>前置知识:</h2>
+<h3>API 测试与单元测试的区别</h3>
+<p>API测试,它模仿用户调用API,从某个入口开始,逐步执行操作,直到完成某项工作。与单元测试不同,后者通常需要测试参数、参数类型、参数值、参数数量、返回值、抛出错误等,目的在于保证特定函数能够在任何情况下都稳定可靠完成工作。单元测试假定只要所有函数都正常工作,那么整个产品就能正常工作。</p>
+<p>相对来说,API 测试关注的<strong>一个完整的操作链是否能够完成</strong>。</p>
+<p>比如,租户管理界面的 API 测试,关注用户是否能够正常登录;登陆失败的话,是否能够正确显示错误信息。登陆之后时候能够通过携带的 SessionId 进行租户管理的操作等等。</p>
+<h2>API 测试</h2>
+<h3>API-Pages</h3>
+<p>DolphinScheduler 的 API 测试使用 docker-compose 部署,当前测试的为单机模式,主要用于检验一些例如“增删改查”基本功能,后期如需做集群验证,例如不同服务之间的协作,或者各个服务之间的通讯机制,可参考 <code>deploy/docker/docker-compose.yml</code>来配置。</p>
+<p>对于 API 测试,使用 <a href="https://www.selenium.dev/documentation/guidelines/page_object_models/">页面模型</a> 的形式,主要为每一个页面建立一个对应的模型。下面以登录页为例:</p>
+<pre><code class="language-java"><span class="hljs-keyword">package</span> org.apache.dolphinscheduler.api.test.pages;
+
+
+<span class="hljs-keyword">import</span> org.apache.dolphinscheduler.api.test.entity.HttpResponse;
+<span class="hljs-keyword">import</span> org.apache.dolphinscheduler.api.test.utils.RequestClient;
+
+<span class="hljs-keyword">import</span> java.util.HashMap;
+<span class="hljs-keyword">import</span> java.util.Map;
+
+<span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoginPage</span> </span>{
+    <span class="hljs-function"><span class="hljs-keyword">public</span> HttpResponse <span class="hljs-title">login</span><span class="hljs-params">(String username, String password)</span> </span>{
+        Map&lt;String, Object&gt; params = <span class="hljs-keyword">new</span> HashMap&lt;&gt;();
+
+        params.put(<span class="hljs-string">&quot;userName&quot;</span>, username);
+        params.put(<span class="hljs-string">&quot;userPassword&quot;</span>, password);
+
+        RequestClient requestClient = <span class="hljs-keyword">new</span> RequestClient();
+
+        <span class="hljs-keyword">return</span> requestClient.post(<span class="hljs-string">&quot;/login&quot;</span>, <span class="hljs-keyword">null</span>, params);
+    }
+}
 </code></pre>
-<h3>⑥ 其他操作</h3>
-<p>除增删改查外的操作,我们同样也通过 <code>url</code> 定位到对应的资源,然后再在路径后面追加对其进行的操作。例如:</p>
-<pre><code>/dolphinscheduler/alert-groups/verify-name
-/dolphinscheduler/projects/{projectCode}/process-instances/{code}/view-gantt
+<p>在测试过程中,我们只针对所需要关注的接口进行测试,而非页面中的所有接口,所以在登陆页面只对用户名、密码和接口路径进行声明。</p>
+<p>此外,在测试过程中,并不会直接去操作接口,一般选择封装对应的方法,以达到复用的效果。例如想要登录的话,直接传入用户名和密码,通过 <code>public LoginPage login()</code> 方法去操作所传入的信息,从而达到实现登录的效果。</p>
+<p>在登陆页面(LoginPage)只定义接口请求的入参规范,对于接口请求出参只定义统一的基础响应结构,接口实际返回的data数据则再实际的测试用例中测试。主要测试接口的输入和输出是否能够符合测试用例的要求。</p>
+<h3>API-Cases</h3>
+<p>下面以租户管理测试为例,前文已经说明,我们使用 docker-compose 进行部署,所以每个测试案例,都需要以注解的形式引入对应的文件。</p>
+<p>使用 OkHttpClient 框架来进行 HTTP 请求。在每个测试案例开始之前都需要进行一些准备工作。比如:登录用户、创建对应的租户(根据具体的测试案例而定)。</p>
+<pre><code class="language-java">    <span class="hljs-meta">@BeforeAll</span>
+    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setup</span><span class="hljs-params">()</span> </span>{
+        LoginPage loginPage = <span class="hljs-keyword">new</span> LoginPage();
+        HttpResponse loginHttpResponse = loginPage.login(user, password);
+
+        sessionId = JSONUtils.convertValue(loginHttpResponse.body().data(), LoginResponseData.class).sessionId();
+    }
 </code></pre>
-<h2>3. 参数设计</h2>
-<p>参数分为两种,一种是请求参数(Request Param 或 Request Body),另一种是路径参数(Path Param)。</p>
-<p>参数变量必须用小驼峰表示,并且在分页场景中,用户输入的参数小于 1,则前端需要返给后端 1 表示请求第一页;当后端发现用户输入的参数大于总页数时,直接返回最后一页。</p>
-<h2>4. 其他设计</h2>
-<h3>基础路径</h3>
-<p>整个项目的 URI 需要以 <code>/&lt;project_name&gt;</code> 作为基础路径,从而标识这类 API 都是项目下的,即:</p>
-<pre><code>/dolphinscheduler
+<p>在完成准备工作之后,就是正式的测试案例编写。我们使用 @Order() 注解的形式,用于模块化,确认测试顺序。在进行测试之后,使用断言来判断测试是否成功,如果断言返回 true,则表示创建租户成功。可参考创建租户的测试代码:</p>
+<pre><code class="language-java">    <span class="hljs-meta">@Test</span>
+    <span class="hljs-meta">@Order(1)</span>
+    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testCreateTenant</span><span class="hljs-params">()</span> </span>{
+        TenantPage tenantPage = <span class="hljs-keyword">new</span> TenantPage();
+
+        HttpResponse createTenantHttpResponse = tenantPage.createTenant(sessionId, tenant, <span class="hljs-number">1</span>, <span class="hljs-string">&quot;&quot;</span>);
+
+        Assertions.assertTrue(createTenantHttpResponse.body().success());
+    }
 </code></pre>
+<p>其余的都是类似的情况,可参考具体的源码来理解。</p>
+<p><a href="https://github.com/apache/dolphinscheduler/tree/dev/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/cases">https://github.com/apache/dolphinscheduler/tree/dev/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/cases</a></p>
+<h2>补充</h2>
+<p>在本地运行的时候,首先需要启动相应的本地服务,可以参考该页面: <a href="https://dolphinscheduler.apache.org/zh-cn/development/development-environment-setup.html">环境搭建</a></p>
+<p>在本地运行 API 测试的时候,可以配置 <code>-Dlocal=true</code> 参数,用于连接本地,方便对于 UI 界面的更改。</p>
+<p>当前默认的请求超时时长为 10 秒,如无特殊需求不应修改此值。</p>
 </div></section><footer class="footer-container"><div class="footer-body"><div><h3>联系我们</h3><h4>有问题需要反馈?请通过以下方式联系我们。</h4></div><div class="contact-container"><ul><li><a href="/zh-cn/community/development/subscribe.html"><img class="img-base" src="/img/emailgray.png"/><img class="img-change" src="/img/emailblue.png"/><p>邮件列表</p></a></li><li><a href="https://twitter.com/dolphinschedule"><img class="img-base" src="/img/twittergray.png"/><img class="img-change" src="/img/twitterblue.png"/><p [...]
   <script src="/asset/js/react/react-with-addons.min.js"></script>
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/api-test.json b/zh-cn/development/api-test.json
new file mode 100644
index 000000000..b6e8af69b
--- /dev/null
+++ b/zh-cn/development/api-test.json
@@ -0,0 +1,6 @@
+{
+  "filename": "api-test.md",
+  "__html": "<h1>DolphinScheduler — API 测试</h1>\n<h2>前置知识:</h2>\n<h3>API 测试与单元测试的区别</h3>\n<p>API测试,它模仿用户调用API,从某个入口开始,逐步执行操作,直到完成某项工作。与单元测试不同,后者通常需要测试参数、参数类型、参数值、参数数量、返回值、抛出错误等,目的在于保证特定函数能够在任何情况下都稳定可靠完成工作。单元测试假定只要所有函数都正常工作,那么整个产品就能正常工作。</p>\n<p>相对来说,API 测试关注的<strong>一个完整的操作链是否能够完成</strong>。</p>\n<p>比如,租户管理界面的 API 测试,关注用户是否能够正常登录;登陆失败的话,是否能够正确显示错误信息。登陆之后时候能够通过携带的 SessionId 进行租户管理的操作等等。</p>\n<h2>API 测试</h2>\n<h3>API-Pages</h3>\n<p>DolphinScheduler 的 API 测试使用 docker-compose 部�
 �,当前测试的为单机模式,主要 [...]
+  "link": "/dist/zh-cn/development/api-test.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/development/architecture-design.html b/zh-cn/development/architecture-design.html
index b691f0912..cd6b73421 100644
--- a/zh-cn/development/architecture-design.html
+++ b/zh-cn/development/architecture-design.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <p>在对调度系统架构说明之前,我们先来认识一下调度系统常用的名词</p>
 <h3>1.名词解释</h3>
 <p><strong>DAG:</strong> 全称Directed Acyclic Graph,简称DAG。工作流中的Task任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。举例如下图:</p>
@@ -299,7 +299,7 @@ ZooKeeper Master容错完成之后则重新由DolphinScheduler中Scheduler线程
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/backend/mechanism/global-parameter.html b/zh-cn/development/backend/mechanism/global-parameter.html
index 6d7c70cc1..a9a373c63 100644
--- a/zh-cn/development/backend/mechanism/global-parameter.html
+++ b/zh-cn/development/backend/mechanism/global-parameter.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <p>用户在定义方向为 OUT 的参数后,会保存在 task 的 localParam 中。</p>
 <h2>参数的使用</h2>
 <p>从 DAG 中获取当前需要创建的 taskInstance 的直接前置节点 preTasks,获取 preTasks 的 varPool,将该 <code>varPool(List&lt;Property&gt;)</code>合并为一个 varPool,在合并过程中,如果发现有相同的变量名的变量,按照以下逻辑处理</p>
@@ -60,7 +60,7 @@ Master 接收到 varPool 后,将其中为 OUT 的参数回写到 localParam 
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/backend/mechanism/overview.html b/zh-cn/development/backend/mechanism/overview.html
index 59a02495f..f620a0ef4 100644
--- a/zh-cn/development/backend/mechanism/overview.html
+++ b/zh-cn/development/backend/mechanism/overview.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <!-- TODO 由于 side menu 不支持多个等级,所以新建了一个leading page存放 -->
 <ul>
 <li><a href="global-parameter.md">全局参数</a></li>
@@ -21,7 +21,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/backend/mechanism/task/switch.html b/zh-cn/development/backend/mechanism/task/switch.html
index 24a7e5604..a06ef593e 100644
--- a/zh-cn/development/backend/mechanism/task/switch.html
+++ b/zh-cn/development/backend/mechanism/task/switch.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <p>Switch任务类型的工作流程如下</p>
 <ul>
 <li>用户定义的表达式和分支流转的信息存在了taskdefinition中的taskParams中,当switch被执行到时,会被格式化为SwitchParameters。</li>
@@ -23,7 +23,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/backend/spi/alert.html b/zh-cn/development/backend/spi/alert.html
index d6b02d23f..921ab587e 100644
--- a/zh-cn/development/backend/spi/alert.html
+++ b/zh-cn/development/backend/spi/alert.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <h4>DolphinScheduler SPI 设计</h4>
 <p>DolphinScheduler 正在处于微内核 + 插件化的架构更改之中,所有核心能力如任务、资源存储、注册中心等都将被设计为扩展点,我们希望通过 SPI 来提高 DolphinScheduler 本身的灵活性以及友好性(扩展性)。</p>
 <p>告警相关代码可以参考 <code>dolphinscheduler-alert-api</code> 模块。该模块定义了告警插件扩展的接口以及一些基础代码,当我们需要实现相关功能的插件化的时候,建议先阅读此块的代码,当然,更建议你阅读文档,这会减少很多时间,不过文档有一定的后滞性,当文档缺失的时候,建议以源码为准(如果有兴趣,我们也欢迎你来提交相关文档),此外,我们几乎不会对扩展接口做变更(不包括新增),除非重大架构调整,出现不兼容升级版本,因此,现有文档一般都能够满足。</p>
@@ -97,7 +97,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/backend/spi/datasource.html b/zh-cn/development/backend/spi/datasource.html
index 88e00e4ea..b89967076 100644
--- a/zh-cn/development/backend/spi/datasource.html
+++ b/zh-cn/development/backend/spi/datasource.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <h4>如何使用数据源?</h4>
 <p>数据源中心默认支持POSTGRESQL、HIVE/IMPALA、SPARK、CLICKHOUSE、SQLSERVER数据源。</p>
 <p>如果使用的是MySQL、ORACLE数据源则需要、把对应的驱动包放置lib目录下</p>
@@ -30,7 +30,7 @@ org.apache.dolphinscheduler.plugin.datasource.api.client.CommonDataSourceClient<
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/backend/spi/registry.html b/zh-cn/development/backend/spi/registry.html
index 339d97561..032a056a4 100644
--- a/zh-cn/development/backend/spi/registry.html
+++ b/zh-cn/development/backend/spi/registry.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <h4>如何使用?</h4>
 <p>进行以下配置(以 zookeeper 为例)</p>
 <ul>
@@ -33,7 +33,7 @@ dolphinscheduler-service/src/main/resources/registry.properties<pre><code class=
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/backend/spi/task.html b/zh-cn/development/backend/spi/task.html
index e5d853c16..f24cc95b9 100644
--- a/zh-cn/development/backend/spi/task.html
+++ b/zh-cn/development/backend/spi/task.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <h4>如何进行任务插件开发?</h4>
 <p>org.apache.dolphinscheduler.spi.task.TaskChannel</p>
 <p>插件实现以上接口即可。主要包含创建任务(任务初始化,任务运行等方法)、任务取消,如果是 yarn 任务,则需要实现 org.apache.dolphinscheduler.plugin.task.api.AbstractYarnTask。</p>
@@ -23,7 +23,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/development-environment-setup.html b/zh-cn/development/development-environment-setup.html
index 001847a12..58af23cc9 100644
--- a/zh-cn/development/development-environment-setup.html
+++ b/zh-cn/development/development-environment-setup.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <h2>软件要求</h2>
 <p>在搭建 DolphinScheduler 开发环境之前请确保你已经安装以下软件:</p>
 <ul>
@@ -188,7 +188,7 @@ pnpm run dev
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/e2e-test.html b/zh-cn/development/e2e-test.html
index 3885ff99d..acbe218b9 100644
--- a/zh-cn/development/e2e-test.html
+++ b/zh-cn/development/e2e-test.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <h2>一、前置知识:</h2>
 <h3>1、E2E 测试与单元测试的区别</h3>
 <p>E2E,是“End to End”的缩写,可以翻译成“端到端”测试。它模仿用户,从某个入口开始,逐步执行操作,直到完成某项工作。与单元测试不同,后者通常需要测试参数、参数类型、参数值、参数数量、返回值、抛出错误等,目的在于保证特定函数能够在任何情况下都稳定可靠完成工作。单元测试假定只要所有函数都正常工作,那么整个产品就能正常工作。</p>
@@ -165,7 +165,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/frontend-development.html b/zh-cn/development/frontend-development.html
index e4a8cdb67..3cc3c9f84 100644
--- a/zh-cn/development/frontend-development.html
+++ b/zh-cn/development/frontend-development.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <h3>技术选型</h3>
 <pre><code>Vue mvvm 框架
 
@@ -515,7 +515,7 @@ test.then(res =&gt; {
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {
diff --git a/zh-cn/development/have-questions.html b/zh-cn/development/have-questions.html
index d10eab390..ea54f611f 100644
--- a/zh-cn/development/have-questions.html
+++ b/zh-cn/development/have-questions.html
@@ -10,7 +10,7 @@
   <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
 </head>
 <body>
-  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
+  <div id="root"><div class="md2html development-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://s.apache.org/dolphinscheduler-slack">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img class="logo" src="/img/hlogo_white.svg"/></a>< [...]
 <h2>StackOverflow</h2>
 <p>如果在使用上有疑问,建议你使用StackOverflow标签 <a href="https://stackoverflow.com/questions/tagged/apache-dolphinscheduler">apache-dolphinscheduler</a>,这是一个DolphinScheduler用户问答的活跃论坛。</p>
 <p>使用StackOverflow时的快速提示:</p>
@@ -75,7 +75,7 @@
   <script src="/asset/js/react/react-dom.min.js"></script>
   <script>window.rootPath = '';</script>
   <script src="/build/vendor.ca86cb0.js"></script>
-  <script src="/build/development.md.627e13d.js"></script>
+  <script src="/build/development.md.83367a2.js"></script>
   <script>
     var _hmt = _hmt || [];
     (function() {