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