This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new 35b2716cde [Fix][CI] Switch minio/minio test containers to the quay.io
mirror (#12287)
35b2716cde is described below
commit 35b2716cde7d4c91a24fc618a8d9cae90e213db3
Author: David Zollo <[email protected]>
AuthorDate: Sun Sep 13 14:00:24 2026 +0000
[Fix][CI] Switch minio/minio test containers to the quay.io mirror (#12287)
Co-authored-by: Claude Sonnet 5 <[email protected]>
Co-authored-by: davidzollo <[email protected]>
---
seatunnel-cli/benchmark/README.md | 2 +-
seatunnel-cli/benchmark/docker/docker-compose.yml | 4 +++-
.../e2e/connector/databend/DatabendCDCSinkIT.java | 7 ++++++-
.../seatunnel/e2e/connector/databend/DatabendIT.java | 7 ++++++-
.../e2e/connector/file/s3/S3FileWithFilterIT.java | 6 +++++-
.../e2e/connector/hudi/HudiSeatunnelS3MultiTableIT.java | 15 +++++++++++++--
.../e2e/connector/hudi/HudiSparkS3MultiTableIT.java | 15 +++++++++++++--
.../e2e/connector/iceberg/s3/IcebergSourceIT.java | 15 +++++++++++++--
.../seatunnel/e2e/connector/paimon/PaimonWithS3IT.java | 15 +++++++++++++--
9 files changed, 73 insertions(+), 13 deletions(-)
diff --git a/seatunnel-cli/benchmark/README.md
b/seatunnel-cli/benchmark/README.md
index 1743c3e40b..d3f32b3cf4 100644
--- a/seatunnel-cli/benchmark/README.md
+++ b/seatunnel-cli/benchmark/README.md
@@ -121,7 +121,7 @@ Task format:
| Kafka (KRaft) | `apache/kafka:3.7.0` | `localhost:9092` | PLAINTEXT | topics
clicks, order_events, dbz.shop.users (seeded), events, wms.inventory,
shop.orders.changelog |
| ClickHouse | `clickhouse/clickhouse-server:23.3.13.6` | `localhost:8123` |
default / Test@123 | db `bench`: pre-created sink tables |
| Elasticsearch | `elasticsearch:8.9.0` | `localhost:9200` | security disabled
| — |
-| MinIO (S3) | `minio/minio` | `localhost:9000` | minioadmin / minioadmin |
bucket `bench` |
+| MinIO (S3) | `quay.io/minio/minio` | `localhost:9000` | minioadmin /
minioadmin | bucket `bench` |
| Doris *(profile `olap`)* | `apache/doris:doris-all-in-one-2.1.0` | FE 8030 /
query 9030 | root / empty | apply `init/doris/01_bench.sql` |
| StarRocks *(profile `olap`)* | `starrocks/allin1-ubuntu:3.3.4` | FE 8031 /
query 9031 | root / empty | apply `init/doris/01_bench.sql` |
diff --git a/seatunnel-cli/benchmark/docker/docker-compose.yml
b/seatunnel-cli/benchmark/docker/docker-compose.yml
index 72d2bd8c09..67938b3810 100644
--- a/seatunnel-cli/benchmark/docker/docker-compose.yml
+++ b/seatunnel-cli/benchmark/docker/docker-compose.yml
@@ -145,7 +145,9 @@ services:
retries: 30
minio:
- image: minio/minio:RELEASE.2024-06-13T22-53-53Z
+ # Docker Hub's minio/minio repository no longer serves
anonymous/unauthenticated pulls;
+ # quay.io is MinIO's own registry and mirrors the same tags publicly.
+ image: quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z
container_name: st-bench-minio
environment:
MINIO_ROOT_USER: minioadmin
diff --git
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-databend-e2e/src/test/java/org/apache/seatunnel/e2e/connector/databend/DatabendCDCSinkIT.java
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-databend-e2e/src/test/java/org/apache/seatunnel/e2e/connector/databend/DatabendCDCSinkIT.java
index 3cccba3bce..f21e67d01b 100644
---
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-databend-e2e/src/test/java/org/apache/seatunnel/e2e/connector/databend/DatabendCDCSinkIT.java
+++
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-databend-e2e/src/test/java/org/apache/seatunnel/e2e/connector/databend/DatabendCDCSinkIT.java
@@ -207,7 +207,12 @@ public class DatabendCDCSinkIT extends TestSuiteBase
implements TestResource {
@Override
public void startUp() throws Exception {
this.minioContainer =
- new GenericContainer<>("minio/minio:latest")
+ // Docker Hub's minio/minio repository no longer serves
anonymous/unauthenticated
+ // pulls; quay.io is MinIO's own registry and mirrors the same
tags publicly.
+ // Pinned to the same release used by the other MinIO
containers in this test
+ // suite instead of :latest, so an upstream MinIO release
can't silently change
+ // this test's behavior underneath it.
+ new
GenericContainer<>("quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z")
.withNetwork(NETWORK)
.withNetworkAliases("minio")
.withEnv("MINIO_ROOT_USER", "minioadmin")
diff --git
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-databend-e2e/src/test/java/org/apache/seatunnel/e2e/connector/databend/DatabendIT.java
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-databend-e2e/src/test/java/org/apache/seatunnel/e2e/connector/databend/DatabendIT.java
index 04cc0b34d4..a27ac0fc93 100644
---
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-databend-e2e/src/test/java/org/apache/seatunnel/e2e/connector/databend/DatabendIT.java
+++
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-databend-e2e/src/test/java/org/apache/seatunnel/e2e/connector/databend/DatabendIT.java
@@ -235,7 +235,12 @@ public class DatabendIT extends TestSuiteBase implements
TestResource {
@Override
public void startUp() throws Exception {
this.minioContainer =
- new GenericContainer<>("minio/minio:latest")
+ // Docker Hub's minio/minio repository no longer serves
anonymous/unauthenticated
+ // pulls; quay.io is MinIO's own registry and mirrors the same
tags publicly.
+ // Pinned to the same release used by the other MinIO
containers in this test
+ // suite instead of :latest, so an upstream MinIO release
can't silently change
+ // this test's behavior underneath it.
+ new
GenericContainer<>("quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z")
.withNetwork(NETWORK)
.withNetworkAliases("minio")
.withEnv("MINIO_ROOT_USER", "minioadmin")
diff --git
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-file-s3-e2e/src/test/java/org/apache/seatunnel/e2e/connector/file/s3/S3FileWithFilterIT.java
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-file-s3-e2e/src/test/java/org/apache/seatunnel/e2e/connector/file/s3/S3FileWithFilterIT.java
index 833829cdf5..99de95eefe 100644
---
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-file-s3-e2e/src/test/java/org/apache/seatunnel/e2e/connector/file/s3/S3FileWithFilterIT.java
+++
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-file-s3-e2e/src/test/java/org/apache/seatunnel/e2e/connector/file/s3/S3FileWithFilterIT.java
@@ -54,7 +54,11 @@ import java.util.concurrent.TimeUnit;
public class S3FileWithFilterIT extends SeaTunnelContainer {
private GenericContainer<?> s3Container;
- private static final String MINIO_IMAGE =
"minio/minio:RELEASE.2024-06-13T22-53-53Z";
+ // Docker Hub's minio/minio repository no longer serves
anonymous/unauthenticated pulls
+ // ("pull access denied ... repository does not exist or may require
'docker login'"); quay.io
+ // is
+ // MinIO's own registry and mirrors the same tags publicly.
+ private static final String MINIO_IMAGE =
"quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z";
private static final int S3_PORT = 9000;
diff --git
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-hudi-e2e/src/test/java/org/apache/seatunnel/e2e/connector/hudi/HudiSeatunnelS3MultiTableIT.java
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-hudi-e2e/src/test/java/org/apache/seatunnel/e2e/connector/hudi/HudiSeatunnelS3MultiTableIT.java
index 3a553d391c..894b5d6c7f 100644
---
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-hudi-e2e/src/test/java/org/apache/seatunnel/e2e/connector/hudi/HudiSeatunnelS3MultiTableIT.java
+++
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-hudi-e2e/src/test/java/org/apache/seatunnel/e2e/connector/hudi/HudiSeatunnelS3MultiTableIT.java
@@ -37,6 +37,7 @@ import org.junit.jupiter.api.TestInstance;
import org.testcontainers.containers.Container;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.MinIOContainer;
+import org.testcontainers.utility.DockerImageName;
import com.amazonaws.services.s3.AmazonS3;
import io.minio.BucketExistsArgs;
@@ -53,7 +54,12 @@ import static org.awaitility.Awaitility.given;
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class HudiSeatunnelS3MultiTableIT extends SeaTunnelContainer {
- private static final String MINIO_DOCKER_IMAGE =
"minio/minio:RELEASE.2024-06-13T22-53-53Z";
+ // Docker Hub's minio/minio repository no longer serves
anonymous/unauthenticated pulls
+ // ("pull access denied ... repository does not exist or may require
'docker login'"); quay.io
+ // is
+ // MinIO's own registry and mirrors the same tags publicly.
+ private static final String MINIO_DOCKER_IMAGE =
+ "quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z";
private static final String HOST = "minio";
private static final int MINIO_PORT = 9000;
private static final String MINIO_USER_NAME = "minio";
@@ -73,7 +79,12 @@ public class HudiSeatunnelS3MultiTableIT extends
SeaTunnelContainer {
@BeforeAll
public void startUp() throws Exception {
container =
- new MinIOContainer(MINIO_DOCKER_IMAGE)
+ // MinIOContainer validates its image name is a recognized
substitute for
+ // "minio/minio"; the quay.io mirror needs an explicit
compatibility declaration
+ // or Testcontainers rejects it with IllegalStateException at
startup.
+ new MinIOContainer(
+ DockerImageName.parse(MINIO_DOCKER_IMAGE)
+
.asCompatibleSubstituteFor("minio/minio"))
.withNetwork(NETWORK)
.withNetworkAliases(HOST)
.withUserName(MINIO_USER_NAME)
diff --git
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-hudi-e2e/src/test/java/org/apache/seatunnel/e2e/connector/hudi/HudiSparkS3MultiTableIT.java
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-hudi-e2e/src/test/java/org/apache/seatunnel/e2e/connector/hudi/HudiSparkS3MultiTableIT.java
index 8b598d443b..e0e1ef4d28 100644
---
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-hudi-e2e/src/test/java/org/apache/seatunnel/e2e/connector/hudi/HudiSparkS3MultiTableIT.java
+++
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-hudi-e2e/src/test/java/org/apache/seatunnel/e2e/connector/hudi/HudiSparkS3MultiTableIT.java
@@ -38,6 +38,7 @@ import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.TestTemplate;
import org.testcontainers.containers.Container;
import org.testcontainers.containers.MinIOContainer;
+import org.testcontainers.utility.DockerImageName;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
@@ -53,7 +54,12 @@ import static org.awaitility.Awaitility.given;
@Slf4j
public class HudiSparkS3MultiTableIT extends TestSuiteBase implements
TestResource {
- private static final String MINIO_DOCKER_IMAGE =
"minio/minio:RELEASE.2024-06-13T22-53-53Z";
+ // Docker Hub's minio/minio repository no longer serves
anonymous/unauthenticated pulls
+ // ("pull access denied ... repository does not exist or may require
'docker login'"); quay.io
+ // is
+ // MinIO's own registry and mirrors the same tags publicly.
+ private static final String MINIO_DOCKER_IMAGE =
+ "quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z";
private static final String HOST = "minio";
private static final int MINIO_PORT = 9000;
private static final String MINIO_USER_NAME = "minio";
@@ -73,7 +79,12 @@ public class HudiSparkS3MultiTableIT extends TestSuiteBase
implements TestResour
@Override
public void startUp() throws Exception {
container =
- new MinIOContainer(MINIO_DOCKER_IMAGE)
+ // MinIOContainer validates its image name is a recognized
substitute for
+ // "minio/minio"; the quay.io mirror needs an explicit
compatibility declaration
+ // or Testcontainers rejects it with IllegalStateException at
startup.
+ new MinIOContainer(
+ DockerImageName.parse(MINIO_DOCKER_IMAGE)
+
.asCompatibleSubstituteFor("minio/minio"))
.withNetwork(NETWORK)
.withNetworkAliases(HOST)
.withUserName(MINIO_USER_NAME)
diff --git
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-iceberg-s3-e2e/src/test/java/org/apache/seatunnel/e2e/connector/iceberg/s3/IcebergSourceIT.java
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-iceberg-s3-e2e/src/test/java/org/apache/seatunnel/e2e/connector/iceberg/s3/IcebergSourceIT.java
index 9176cc24ff..7dcfe5d369 100644
---
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-iceberg-s3-e2e/src/test/java/org/apache/seatunnel/e2e/connector/iceberg/s3/IcebergSourceIT.java
+++
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-iceberg-s3-e2e/src/test/java/org/apache/seatunnel/e2e/connector/iceberg/s3/IcebergSourceIT.java
@@ -58,6 +58,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.TestTemplate;
import org.testcontainers.containers.Container;
import org.testcontainers.containers.MinIOContainer;
+import org.testcontainers.utility.DockerImageName;
import com.amazonaws.services.s3.AmazonS3;
import io.minio.BucketExistsArgs;
@@ -99,7 +100,12 @@ public class IcebergSourceIT extends TestSuiteBase
implements TestResource {
.copyTo(container,
"/tmp/seatunnel/plugins/Iceberg/lib");
};
- private static final String MINIO_DOCKER_IMAGE =
"minio/minio:RELEASE.2024-06-13T22-53-53Z";
+ // Docker Hub's minio/minio repository no longer serves
anonymous/unauthenticated pulls
+ // ("pull access denied ... repository does not exist or may require
'docker login'"); quay.io
+ // is
+ // MinIO's own registry and mirrors the same tags publicly.
+ private static final String MINIO_DOCKER_IMAGE =
+ "quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z";
private static final String HOST = "minio";
private static final int MINIO_PORT = 9000;
@@ -153,7 +159,12 @@ public class IcebergSourceIT extends TestSuiteBase
implements TestResource {
@Override
public void startUp() throws Exception {
container =
- new MinIOContainer(MINIO_DOCKER_IMAGE)
+ // MinIOContainer validates its image name is a recognized
substitute for
+ // "minio/minio"; the quay.io mirror needs an explicit
compatibility declaration
+ // or Testcontainers rejects it with IllegalStateException at
startup.
+ new MinIOContainer(
+ DockerImageName.parse(MINIO_DOCKER_IMAGE)
+
.asCompatibleSubstituteFor("minio/minio"))
.withNetwork(NETWORK)
.withNetworkAliases(HOST)
.withExposedPorts(MINIO_PORT);
diff --git
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-paimon-e2e/src/test/java/org/apache/seatunnel/e2e/connector/paimon/PaimonWithS3IT.java
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-paimon-e2e/src/test/java/org/apache/seatunnel/e2e/connector/paimon/PaimonWithS3IT.java
index a8b488d14e..2a04bcd3d0 100644
---
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-paimon-e2e/src/test/java/org/apache/seatunnel/e2e/connector/paimon/PaimonWithS3IT.java
+++
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-paimon-e2e/src/test/java/org/apache/seatunnel/e2e/connector/paimon/PaimonWithS3IT.java
@@ -38,6 +38,7 @@ import org.junit.jupiter.api.TestInstance;
import org.testcontainers.containers.Container;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.MinIOContainer;
+import org.testcontainers.utility.DockerImageName;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
@@ -51,7 +52,12 @@ import java.util.List;
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class PaimonWithS3IT extends SeaTunnelContainer {
- private static final String MINIO_DOCKER_IMAGE =
"minio/minio:RELEASE.2024-06-13T22-53-53Z";
+ // Docker Hub's minio/minio repository no longer serves
anonymous/unauthenticated pulls
+ // ("pull access denied ... repository does not exist or may require
'docker login'"); quay.io
+ // is
+ // MinIO's own registry and mirrors the same tags publicly.
+ private static final String MINIO_DOCKER_IMAGE =
+ "quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z";
private static final String HOST = "minio";
private static final int MINIO_PORT = 9000;
private static final String MINIO_USER_NAME = "minio";
@@ -142,7 +148,12 @@ public class PaimonWithS3IT extends SeaTunnelContainer {
@BeforeAll
public void startUp() throws Exception {
container =
- new MinIOContainer(MINIO_DOCKER_IMAGE)
+ // MinIOContainer validates its image name is a recognized
substitute for
+ // "minio/minio"; the quay.io mirror needs an explicit
compatibility declaration
+ // or Testcontainers rejects it with IllegalStateException at
startup.
+ new MinIOContainer(
+ DockerImageName.parse(MINIO_DOCKER_IMAGE)
+
.asCompatibleSubstituteFor("minio/minio"))
.withNetwork(NETWORK)
.withNetworkAliases(HOST)
.withUserName(MINIO_USER_NAME)