You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by yx...@apache.org on 2025/07/07 14:39:58 UTC

(shardingsphere) branch master updated: Enable nativeTest test suite with GraalVM JIT Compiler on Windows Server 2025 CI via `rdctl` (#35905)

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

yx9o pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new cbe7cccf864 Enable nativeTest test suite with GraalVM JIT Compiler on Windows Server 2025 CI via `rdctl` (#35905)
cbe7cccf864 is described below

commit cbe7cccf8646e5957d7b00a92171fe168e2e4efc
Author: Ling Hengqian <li...@outlook.com>
AuthorDate: Mon Jul 7 22:39:51 2025 +0800

    Enable nativeTest test suite with GraalVM JIT Compiler on Windows Server 2025 CI via `rdctl` (#35905)
---
 .github/workflows/graalvm.yml                      |  19 +-
 .github/workflows/nightly-ci.yml                   |  16 +-
 .../graalvm-native-image/development/_index.cn.md  |   1 -
 .../graalvm-native-image/development/_index.en.md  |   1 -
 .../optional-plugins/seata-at/_index.cn.md         |   2 +-
 .../optional-plugins/seata-at/_index.en.md         |  33 +---
 .../startup/graalvm-native-image.cn.md             |   4 +-
 .../startup/graalvm-native-image.en.md             |   5 +-
 .../transactions/6.0.0/reflect-config.json         |  48 +++++
 .../transactions/6.0.0/resource-config.json        |  26 +++
 .../docker-java-api/3.4.0/proxy-config.json        |   6 +
 .../reflect-config.json                            |  12 +-
 .../resource-config.json                           |   3 +
 .../resource-config.json                           |   2 +-
 .../jaybird/5.0.6.java8/resource-config.json       |   2 +-
 .../ps1/uninstall-docker-engine-for-wcow.ps1       | 214 +++++++++++++++++++++
 .../ps1/wait-for-rancher-desktop-backend.ps1       |  73 +++++++
 17 files changed, 410 insertions(+), 57 deletions(-)

diff --git a/.github/workflows/graalvm.yml b/.github/workflows/graalvm.yml
index f921543454f..915a33a49a3 100644
--- a/.github/workflows/graalvm.yml
+++ b/.github/workflows/graalvm.yml
@@ -32,9 +32,6 @@ concurrency:
   group: graalvm-${{ github.workflow }}-${{ github.ref }}
   cancel-in-progress: true
 
-env:
-  MAVEN_OPTS: -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.http.retryHandler.class=standard -Dmaven.wagon.http.retryHandler.count=3 -Dspotless.apply.skip=true
-
 jobs:
   nativetest:
     if: github.repository == 'apache/shardingsphere'
@@ -45,10 +42,19 @@ jobs:
       max-parallel: 20
       fail-fast: false
       matrix:
-        os: [ 'ubuntu-latest' ]
+        os: [ 'ubuntu-latest', 'windows-2025' ]
         java-version: [ '22.0.2' ]
     steps:
       - uses: actions/checkout@v4
+      - name: Setup Rancher Desktop without GUI on Windows Server
+        if: matrix.os == 'windows-2025'
+        run: |
+          ./test/native/src/test/resources/test-native/ps1/uninstall-docker-engine-for-wcow.ps1
+          winget install --id jazzdelightsme.WingetPathUpdater --source winget
+          winget install --id SUSE.RancherDesktop --source winget --skip-dependencies
+          rdctl start --application.start-in-background --container-engine.name=moby --kubernetes.enabled=false
+          ./test/native/src/test/resources/test-native/ps1/wait-for-rancher-desktop-backend.ps1
+          "PATH=$env:PATH" >> $env:GITHUB_ENV
       - uses: graalvm/setup-graalvm@v1
         with:
           java-version: ${{ matrix.java-version }}
@@ -56,5 +62,10 @@ jobs:
           github-token: ${{ secrets.GITHUB_TOKEN }}
           cache: 'maven'
           native-image-job-reports: 'true'
+      # TODO Remove this workaround after. The graalvm native image built with windows server is missing some GRMs for testcontainers
+      - name: Run test with GraalVM CE
+        if: matrix.os == 'windows-2025'
+        run: ./mvnw -PgenerateMetadata -e -T 1C clean test
       - name: Run nativeTest with GraalVM CE for ${{ matrix.java-version }}
+        if: matrix.os == 'ubuntu-latest'
         run: ./mvnw -PnativeTestInShardingSphere -e clean test
diff --git a/.github/workflows/nightly-ci.yml b/.github/workflows/nightly-ci.yml
index 4d330fbf48b..0bd06ca8fa2 100644
--- a/.github/workflows/nightly-ci.yml
+++ b/.github/workflows/nightly-ci.yml
@@ -110,9 +110,18 @@ jobs:
       max-parallel: 20
       fail-fast: false
       matrix:
-        os: [ ubuntu-latest ]
+        os: [ ubuntu-latest, windows-2025 ]
     steps:
       - uses: actions/checkout@v4
+      - name: Setup Rancher Desktop without GUI on Windows Server
+        if: matrix.os == 'windows-2025'
+        run: |
+          ./test/native/src/test/resources/test-native/ps1/uninstall-docker-engine-for-wcow.ps1
+          winget install --id jazzdelightsme.WingetPathUpdater --source winget
+          winget install --id SUSE.RancherDesktop --source winget --skip-dependencies
+          rdctl start --application.start-in-background --container-engine.name=moby --kubernetes.enabled=false
+          ./test/native/src/test/resources/test-native/ps1/wait-for-rancher-desktop-backend.ps1
+          "PATH=$env:PATH" >> $env:GITHUB_ENV
       - uses: graalvm/setup-graalvm@v1
         with:
           java-version: '22.0.2'
@@ -120,5 +129,10 @@ jobs:
           github-token: ${{ secrets.GITHUB_TOKEN }}
           cache: 'maven'
           native-image-job-reports: 'true'
+      # TODO Remove this workaround after. The graalvm native image built with windows server is missing some GRMs for testcontainers
+      - name: Run test with GraalVM CE
+        if: matrix.os == 'windows-2025'
+        run: ./mvnw -PgenerateMetadata -e -T 1C clean test
       - name: Run nativeTest with GraalVM CE
+        if: matrix.os == 'ubuntu-latest'
         run: ./mvnw -PnativeTestInShardingSphere -e clean test
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/development/_index.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/development/_index.cn.md
index 28f4c7b05f1..3115c1d59c2 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/development/_index.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/development/_index.cn.md
@@ -112,7 +112,6 @@ wsl --install
 ### Windows Server
 
 对于通常的 Windows Server 2025 实例,操作等同于 Windows 11 Home 24H2。
-但 `windows-latest` 的 Github Actions Runner 实例无法运行 Linux Containers,因此 ShardingSphere 不为 Windows 设置 nativeTest 的 CI。
 
 ## 处理单元测试
 
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/development/_index.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/development/_index.en.md
index a45cf96da6d..ee384852fe9 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/development/_index.en.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/development/_index.en.md
@@ -119,7 +119,6 @@ This article does not discuss changing the default logging driver in `/etc/docke
 ### Windows Server
 
 For a regular Windows Server 2025 instance, the operation is equivalent to Windows 11 Home 24H2.
-But the Github Actions Runner instance of `windows-latest` cannot run Linux Containers, so ShardingSphere does not set up CI for nativeTest for Windows.
 
 ## Handling unit tests
 
diff --git a/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.cn.md b/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.cn.md
index b11a45cbf63..28e8460aaba 100644
--- a/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.cn.md
@@ -360,7 +360,7 @@ public class ExampleUtils {
              Statement statement = connection.createStatement()) {
             statement.execute("INSERT INTO t_order (user_id, order_type, address_id, status) VALUES (1, 1, 1, 'INSERT_TEST')");
             statement.executeQuery("SELECT * FROM t_order");
-            statement.execute("DELETE FROM t_order WHERE order_id=1");
+            statement.execute("DELETE FROM t_order WHERE user_id=1");
         }
     }
 }
diff --git a/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.en.md b/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.en.md
index ab3f30953a7..4b36d3128fe 100644
--- a/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.en.md
+++ b/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.en.md
@@ -365,39 +365,8 @@ public class ExampleUtils {
              Statement statement = connection.createStatement()) {
             statement.execute("INSERT INTO t_order (user_id, order_type, address_id, status) VALUES (1, 1, 1, 'INSERT_TEST')");
             statement.executeQuery("SELECT * FROM t_order");
-            statement.execute("DELETE FROM t_order WHERE order_id=1");
+            statement.execute("DELETE FROM t_order WHERE user_id=1");
         }
     }
 }
 ```
-
-## Usage restrictions
-
-### ShardingSphere Proxy Native for GraalVM Native Image
-
-For ShardingSphere Proxy Native in GraalVM Native Image,
-Users always need to modify the ShardingSphere source code to add the Seata Client and Seata integrated Maven modules and compile them into GraalVM Native Image.
-ShardingSphere Proxy Native in GraalVM Native Image cannot recognize the additional JAR files.
-
-```xml
-<project>
-    <dependencies>
-      <dependency>
-         <groupId>org.apache.shardingsphere</groupId>
-         <artifactId>shardingsphere-transaction-base-seata-at</artifactId>
-         <version>${shardingsphere.version}</version>
-      </dependency>
-      <dependency>
-         <groupId>org.apache.seata</groupId>
-         <artifactId>seata-all</artifactId>
-         <version>2.2.0</version>
-         <exclusions>
-            <exclusion>
-               <groupId>org.antlr</groupId>
-               <artifactId>antlr4-runtime</artifactId>
-            </exclusion>
-         </exclusions>
-      </dependency>
-    </dependencies>
-</project>
-```
diff --git a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md
index e4b2dc59e92..ceac6c94b3e 100644
--- a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md
@@ -95,7 +95,7 @@ services:
 
 若从源码构建,开发者有2种选择,
 
-1. 在不安装本地工具链的情况下,构建包含 ShardingSphere Proxy Native 产物的 `Linux Docker Image`
+1. 在不安装本地工具链的情况下,构建包含 ShardingSphere Proxy Native 产物的 `Linux Container`
 2. 在安装本地工具链的情况下,构建包含 ShardingSphere Proxy Native 产物。对于 Windows,可通过此途径创建`.exe`形态的 GraalVM Native Image
 
 ### 使用存在自定义 SPI 实现的 JAR 或第三方依赖的 JAR
@@ -113,7 +113,7 @@ services:
 </dependencies>
 ```
 
-### 构建 Linux Docker Image
+### 构建 Linux Container
 
 #### 前提条件
 
diff --git a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md
index 779536e34aa..fc4d40e31cd 100644
--- a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md
+++ b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md
@@ -97,8 +97,7 @@ services:
 
 If you build from source code, developers have two options,
 
-1. Build a `Linux Docker Image` containing ShardingSphere Proxy Native products without installing a local toolchain
-
+1. Build a `Linux Container` containing ShardingSphere Proxy Native products without installing a local toolchain
 2. Build a ShardingSphere Proxy Native product with a local toolchain installed. For Windows, you can create a GraalVM Native Image in the form of `.exe` in this way
 
 ### Use JARs with custom SPI implementations or third-party dependent JARs
@@ -116,7 +115,7 @@ An example of adding a MySQL JDBC Driver dependency is as follows. The relevant
 </dependencies>
 ```
 
-### Build Linux Docker Image
+### Build Linux Container
 
 #### Prerequisites
 
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.atomikos/transactions/6.0.0/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.atomikos/transactions/6.0.0/reflect-config.json
index cc311dc1fb8..975af8a2a9e 100644
--- a/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.atomikos/transactions/6.0.0/reflect-config.json
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.atomikos/transactions/6.0.0/reflect-config.json
@@ -3,5 +3,53 @@
   "condition":{"typeReachable":"com.atomikos.logging.LoggerFactory"},
   "name":"com.atomikos.logging.Slf4JLoggerFactoryDelegate",
   "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "condition":{"typeReachable":"com.arjuna.common.internal.util.propertyservice.BeanPopulator"},
+  "name":"com.arjuna.ats.jta.common.JTAEnvironmentBean",
+  "allDeclaredConstructors":true,
+  "allDeclaredMethods":true
+},
+{
+  "condition":{"typeReachable":"com.arjuna.ats.internal.jta.recovery.arjunacore.CommitMarkableResourceRecordRecoveryModule"},
+  "name":"com.arjuna.ats.internal.jta.recovery.arjunacore.CommitMarkableResourceRecordRecoveryModule",
+  "allDeclaredConstructors":true,
+  "allDeclaredMethods":true
+},
+{
+  "condition":{"typeReachable":"com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule"},
+  "name":"com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule",
+  "allDeclaredConstructors":true,
+  "allDeclaredMethods":true
+},
+{
+  "condition":{"typeReachable":"com.arjuna.ats.internal.txoj.recovery.TORecoveryModule"},
+  "name":"com.arjuna.ats.internal.txoj.recovery.TORecoveryModule",
+  "allDeclaredConstructors":true,
+  "allDeclaredMethods":true
+},
+{
+  "condition":{"typeReachable":"com.arjuna.ats.arjuna.common.RecoveryEnvironmentBean"},
+  "name":"com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule",
+  "allDeclaredConstructors":true,
+  "allDeclaredMethods":true
+},
+{
+  "condition":{"typeReachable":"com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner"},
+  "name":"com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner",
+  "allDeclaredConstructors":true,
+  "allDeclaredMethods":true
+},
+{
+  "condition":{"typeReachable":"com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter"},
+  "name":"com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter"
+},
+{
+  "condition":{"typeReachable":"com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter"},
+  "name":"com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter"
+},
+{
+  "condition":{"typeReachable":"com.arjuna.ats.internal.jta.recovery.arjunacore.JTAActionStatusServiceXAResourceOrphanFilter"},
+  "name":"com.arjuna.ats.internal.jta.recovery.arjunacore.JTAActionStatusServiceXAResourceOrphanFilter"
 }
 ]
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.atomikos/transactions/6.0.0/resource-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.atomikos/transactions/6.0.0/resource-config.json
new file mode 100644
index 00000000000..1e2410180bf
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.atomikos/transactions/6.0.0/resource-config.json
@@ -0,0 +1,26 @@
+{
+  "resources":{
+  "includes":[{
+    "condition":{"typeReachable":"com.atomikos.util.ClassLoadingHelper"},
+    "pattern":"\\Qcom/atomikos/icatch/provider/imp/transactions-defaults.properties\\E"
+  }, {
+    "condition":{"typeReachable":"com.atomikos.util.ClassLoadingHelper"},
+    "pattern":"\\Qtransactions-defaults.properties\\E"
+  }, {
+    "condition":{"typeReachable":"com.atomikos.util.ClassLoadingHelper"},
+    "pattern":"\\Qcom/atomikos/icatch/provider/imp/transactions.properties\\E"
+  }, {
+    "condition":{"typeReachable":"com.atomikos.util.ClassLoadingHelper"},
+    "pattern":"\\Qtransactions.properties\\E"
+  }, {
+    "condition":{"typeReachable":"com.atomikos.util.ClassLoadingHelper"},
+    "pattern":"\\Qcom/atomikos/icatch/provider/imp/jta.properties\\E"
+  }, {
+    "condition":{"typeReachable":"com.atomikos.util.ClassLoadingHelper"},
+    "pattern":"\\Qjta.properties\\E"
+  }, {
+    "condition":{"typeReachable":"com.atomikos.util.Atomikos"},
+    "pattern":"\\QMETA-INF/maven/com.atomikos/atomikos-util/pom.properties\\E"
+  }]},
+  "bundles":[]
+}
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.github.docker-java/docker-java-api/3.4.0/proxy-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.github.docker-java/docker-java-api/3.4.0/proxy-config.json
new file mode 100644
index 00000000000..0b347762143
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.github.docker-java/docker-java-api/3.4.0/proxy-config.json
@@ -0,0 +1,6 @@
+[
+  {
+    "condition":{"typeReachable":"com.github.dockerjava.transport.NamedPipeSocket"},
+    "interfaces":["com.github.dockerjava.transport.NamedPipeSocket$Kernel32"]
+  }
+]
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/reflect-config.json
index 8e369914a3d..93a5dbf4926 100644
--- a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/reflect-config.json
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/reflect-config.json
@@ -75,10 +75,6 @@
   "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"},
   "name":"[Lcom.github.dockerjava.api.model.VolumesFrom;"
 },
-{
-  "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.connection.DriverDatabaseConnectionManager$$Lambda/0x0000027a3d907cd8"},
-  "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;"
-},
 {
   "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement"},
   "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;"
@@ -131,20 +127,16 @@
   "condition":{"typeReachable":"org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabasesFactory"},
   "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;"
 },
-{
-  "condition":{"typeReachable":"org.apache.shardingsphere.mode.metadata.persist.metadata.service.DatabaseMetaDataPersistService"},
-  "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;"
-},
 {
   "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.JDBCRepository"},
   "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;"
 },
 {
-  "condition":{"typeReachable":"org.apache.shardingsphere.proxy.backend.connector.StandardDatabaseConnector"},
+  "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.ShardingSphereProxy"},
   "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;"
 },
 {
-  "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.ShardingSphereProxy"},
+  "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.mysql.command.query.text.query.MySQLComQueryPacketExecutor"},
   "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;"
 },
 {
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/resource-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/resource-config.json
index f51f6931eee..aa456fc0edb 100644
--- a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/resource-config.json
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/resource-config.json
@@ -333,6 +333,9 @@
   }, {
     "condition":{"typeReachable":"org.apache.shardingsphere.readwritesplitting.route.standard.StandardReadwriteSplittingDataSourceRouter"},
     "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.readwritesplitting.route.standard.filter.ReadDataSourcesFilter\\E"
+  }, {
+    "condition":{"typeReachable":"org.apache.shardingsphere.sharding.checker.sql.dml.ShardingTableSupportedChecker"},
+    "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.sharding.checker.sql.dml.DialectUnsupportedShardingSQLStatementProvider\\E"
   }, {
     "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.compiler.context.connection.config.ConnectionConfigBuilderFactory"},
     "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.sqlfederation.compiler.context.connection.config.ConnectionConfigBuilder\\E"
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/resource-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/resource-config.json
index cd6173c23df..697ca153d98 100644
--- a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/resource-config.json
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/resource-config.json
@@ -18,7 +18,7 @@
     "locales":["en"]
   }, {
     "name":"com.microsoft.sqlserver.jdbc.SQLServerResource",
-    "locales":["zh-CN", "en"]
+    "locales":["zh-CN", "en_US"]
   }, {
     "name":"org.postgresql.translation.messages",
     "locales":["en"]
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.firebirdsql.jdbc/jaybird/5.0.6.java8/resource-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.firebirdsql.jdbc/jaybird/5.0.6.java8/resource-config.json
index 3ab2a84b73e..ef0bf0d1e6e 100644
--- a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.firebirdsql.jdbc/jaybird/5.0.6.java8/resource-config.json
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.firebirdsql.jdbc/jaybird/5.0.6.java8/resource-config.json
@@ -45,6 +45,6 @@
   }]},
   "bundles":[{
     "name":"org.firebirdsql.jaybird.version",
-    "locales":["zh-CN", "en"]
+    "locales":["zh-CN", "en_US"]
   }]
 }
diff --git a/test/native/src/test/resources/test-native/ps1/uninstall-docker-engine-for-wcow.ps1 b/test/native/src/test/resources/test-native/ps1/uninstall-docker-engine-for-wcow.ps1
new file mode 100644
index 00000000000..f2123e1abbc
--- /dev/null
+++ b/test/native/src/test/resources/test-native/ps1/uninstall-docker-engine-for-wcow.ps1
@@ -0,0 +1,214 @@
+#Requires -Version 7.4
+
+#
+# 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.
+#
+
+# This file is only used in the PowerShell 7 of ShardingSphere in GitHub Actions environment and should not be executed manually in a development environment.
+# TODO Once https://github.com/microsoft/Windows-Containers/pull/602 is merged we can remove this script.
+$myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent()
+$myWindowsPrincipal = new-object System.Security.Principal.WindowsPrincipal($myWindowsID)
+$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator
+if (-not $myWindowsPrincipal.IsInRole($adminRole))
+{
+    throw "You must run this script as administrator"
+}
+if (Get-Service -Name docker -ErrorAction SilentlyContinue)
+{
+    $containers = docker ps -aq 2> $null
+    if ($containers)
+    {
+        docker stop $containers 2> $null | Out-Null
+        docker rm -f $containers 2> $null
+    }
+    $images = docker images -q 2> $null
+    if ($images)
+    {
+        docker rmi -f $images 2> $null
+    }
+    $volumes = docker volume ls -q 2> $null
+    if ($volumes)
+    {
+        docker volume rm -f $volumes 2> $null
+    }
+    $networks = docker network ls --format "{{.Name}}" 2> $null
+    if ($networks)
+    {
+        $customNetworks = @()
+        foreach ($network in $networks)
+        {
+            if ($network -ne "bridge" -and $network -ne "host" -and $network -ne "none" -and $network -ne "nat")
+            {
+                $customNetworks += $network
+            }
+        }
+        if ($customNetworks.Count -gt 0)
+        {
+            foreach ($network in $customNetworks)
+            {
+                docker network rm $network 2> $null
+            }
+        }
+    }
+    Stop-Service -Name docker -Force -ErrorAction Stop
+    & sc.exe delete docker 2>&1
+}
+$registryPaths = @(
+    "HKLM:\SYSTEM\CurrentControlSet\Services\docker",
+    "HKLM:\SYSTEM\ControlSet002\Services\docker",
+    "HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\Application\docker"
+)
+foreach ($regPath in $registryPaths)
+{
+    if (Test-Path $regPath)
+    {
+        Remove-Item $regPath -Recurse -Force
+    }
+}
+$dockerExe = Join-Path $env:windir "System32\docker.exe"
+if (Test-Path $dockerExe)
+{
+    Remove-Item $dockerExe -Force
+}
+$dockerdExe = Join-Path $env:windir "System32\dockerd.exe"
+if (Test-Path $dockerdExe)
+{
+    Remove-Item $dockerdExe -Force
+}
+if (-not (Test-Path "$( $env:ProgramData )\docker"))
+{
+    exit 0
+}
+$services = @("cexecsvc", "vmcompute", "vmicguestinterface", "vmicheartbeat", "vmickvpexchange", "vmicrdv", "vmicshutdown", "vmictimesync", "vmicvmsession", "vmicvss")
+foreach ($serviceName in $services)
+{
+    $service = Get-Service -Name $serviceName -ErrorAction SilentlyContinue
+    if ($service -and $service.Status -eq 'Running')
+    {
+        Stop-Service -Name $serviceName -Force -ErrorAction SilentlyContinue
+    }
+}
+Start-Sleep -Seconds 2
+$hcsdiagOutput = & hcsdiag.exe list 2> $null
+if ($hcsdiagOutput)
+{
+    $containerMatches = $hcsdiagOutput | Select-String -Pattern "container" -SimpleMatch
+    if ($containerMatches)
+    {
+        $containerMatches | ForEach-Object {
+            $line = $_.Line
+            if ($line -match '\{([^}]+)\}')
+            {
+                $containerId = $Matches[1]
+                & hcsdiag.exe kill $containerId 2> $null
+            }
+        }
+    }
+}
+if (Get-Command Get-ComputeProcess -ErrorAction SilentlyContinue)
+{
+    $computeProcesses = Get-ComputeProcess -ErrorAction SilentlyContinue
+    if ($computeProcesses)
+    {
+        $containerProcesses = $computeProcesses | Where-Object { $_.Type -like "*container*" }
+        if ($containerProcesses)
+        {
+            $containerProcesses | ForEach-Object {
+                $_ | Stop-ComputeProcess -Force -ErrorAction SilentlyContinue
+            }
+        }
+    }
+}
+Start-Sleep -Seconds 3
+$windowsFilterPath = Join-Path "$( $env:ProgramData )\docker" "windowsfilter"
+if (Test-Path $windowsFilterPath)
+{
+    $layerDirs = Get-ChildItem -Path $windowsFilterPath -Directory -ErrorAction SilentlyContinue
+    if ($layerDirs)
+    {
+        $job = Start-Job -ScriptBlock {
+            param($layers)
+            Add-Type -TypeDefinition @"
+using System;
+using System.Runtime.InteropServices;
+public class Hcs
+{
+[DllImport("ComputeStorage.dll", SetLastError=true, CharSet=CharSet.Unicode)]
+public static extern int HcsDestroyLayer(string layerPath);
+}
+"@
+            $results = @()
+            foreach ($layer in $layers)
+            {
+                try
+                {
+                    $result = [Hcs]::HcsDestroyLayer($layer.FullName)
+                    $results += [PSCustomObject]@{
+                        Layer = $layer.Name
+                        Path = $layer.FullName
+                        Result = $result
+                        Success = ($result -eq 0)
+                    }
+                }
+                catch
+                {
+                    $results += [PSCustomObject]@{
+                        Layer = $layer.Name
+                        Path = $layer.FullName
+                        Result = -1
+                        Success = $false
+                        Error = $_.Exception.Message
+                    }
+                }
+            }
+            return $results
+        } -ArgumentList @(,$layerDirs)
+        if ($job | Wait-Job -Timeout 120)
+        {
+            $results = $job | Receive-Job
+            $job | Remove-Job
+        }
+        else
+        {
+            $job | Stop-Job
+            $job | Remove-Job
+        }
+    }
+    if (Test-Path $windowsFilterPath)
+    {
+        & cmd.exe /c "rd /s /q `"$windowsFilterPath`"" 2> $null | Out-Null
+        if (Test-Path $windowsFilterPath)
+        {
+            $tempEmptyDir = Join-Path $env:TEMP "EmptyDir_$( Get-Random )"
+            try
+            {
+                New-Item -ItemType Directory -Path $tempEmptyDir -Force | Out-Null
+                & robocopy.exe $tempEmptyDir $windowsFilterPath /MIR /R:1 /W:1 /NP /NFL /NDL /NJH /NJS 2> $null | Out-Null
+                Remove-Item $tempEmptyDir -Force -ErrorAction SilentlyContinue
+            }
+            catch
+            {
+                Remove-Item $tempEmptyDir -Force -ErrorAction SilentlyContinue
+            }
+        }
+    }
+}
+Remove-Item "$( $env:ProgramData )\docker" -Recurse -Force
+$dockerDownloads = "$env:UserProfile\DockerDownloads"
+if (Test-Path $dockerDownloads)
+{
+    Remove-Item $dockerDownloads -Recurse -Force
+}
diff --git a/test/native/src/test/resources/test-native/ps1/wait-for-rancher-desktop-backend.ps1 b/test/native/src/test/resources/test-native/ps1/wait-for-rancher-desktop-backend.ps1
new file mode 100644
index 00000000000..1bbf15b8b46
--- /dev/null
+++ b/test/native/src/test/resources/test-native/ps1/wait-for-rancher-desktop-backend.ps1
@@ -0,0 +1,73 @@
+#Requires -Version 7.4
+
+#
+# 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.
+#
+
+# This file is only used in the PowerShell 7 of ShardingSphere in GitHub Actions environment and should not be executed manually in a development environment.
+$deadline = (Get-Date).AddMinutes(10)
+$state = "UNKNOWN"
+while ((Get-Date) -lt $deadline)
+{
+    $now = Get-Date
+    $deadlineString = $deadline.ToString("u")
+    Write-Host "Waiting for backend: ($state) $now / $deadlineString"
+    $rdProcess = Get-Process -Name "Rancher Desktop" -ErrorAction SilentlyContinue | Sort-Object -Property StartTime | Select-Object -First 1
+    if (-not $rdProcess)
+    {
+        $state = "NOT_RUNNING"
+        Start-Sleep -Seconds 10
+        continue
+    }
+    $rdEngineJsonPath = Join-Path $env:LOCALAPPDATA "rancher-desktop\rd-engine.json"
+    if (-not (Test-Path $rdEngineJsonPath))
+    {
+        $state = "NO_SERVER_CONFIG"
+        Start-Sleep -Seconds 10
+        continue
+    }
+    try
+    {
+        $state = (rdctl api /v1/backend_state | ConvertFrom-Json).vmState
+    }
+    catch
+    {
+        $state = "NO_RESPONSE"
+    }
+    switch ($state)
+    {
+        "ERROR" {
+            Write-Error "Backend reached error state."
+            exit 1
+        }
+        "STARTED" {
+            Write-Host "PID $( $rdProcess.Id ) has reached state $state, accepting"
+            exit 0
+        }
+        "DISABLED" {
+            Write-Host "PID $( $rdProcess.Id ) has reached state $state, accepting"
+            exit 0
+        }
+        default {
+            Write-Host "Backend state: $state"
+        }
+    }
+    Start-Sleep -Seconds 10
+}
+Write-Error "Timed out waiting for backend to stabilize."
+Write-Error "Current time: $( Get-Date )"
+Write-Error "Deadline: $($deadline.ToString("u") )"
+exit 1