From 500493f97d6094ffb86a37b545e5849e14660c35 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Fri, 12 Jun 2026 09:37:07 +0800 Subject: [PATCH 1/2] Segregate Docker-dependent tests to GitHub Actions workflow ## Problem Azure DevOps network policies block Microsoft Container Registry (MCR) image pulls, causing Docker-dependent tests to fail in the default CI pipeline. ## Solution - Tag Docker-dependent tests with @Tag("docker") in JUnit 5 - Configure Maven surefire to exclude docker-tagged tests from default CI - Create dedicated GitHub Actions workflow on ubuntu-24.04 with Docker support - Use docker-tests Maven profile to selectively run only tagged tests in GitHub Actions ## Changes 1. Add @Tag("docker") to 9 Docker-dependent test classes: - 5 in spring-cloud-azure-testcontainers module - 4 in spring-cloud-azure-docker-compose module 2. Update pom.xml in both modules: - Configure surefire excludedGroups for docker tag - Add docker-tests Maven profile to override exclusion 3. Create .github/workflows/spring-docker-tests.yml: - Runs on ubuntu-24.04 with Docker pre-installed - Triggered by changes to spring modules and workflow file - Two-phase build: install deps, then run docker-tests profile - Triggered by pull_request and workflow_dispatch events ## Impact - Docker tests no longer block PR merges in ADO - Docker tests run independently in GitHub Actions on Linux - Default local Maven build excludes docker tests - Developers can opt-in with: mvn test -Pdocker-tests --- .github/workflows/spring-docker-tests.yml | 54 +++++++++++++++++++ .../spring-cloud-azure-docker-compose/pom.xml | 17 ++++++ ...rComposeConnectionDetailsFactoryTests.java | 2 + ...rComposeConnectionDetailsFactoryTests.java | 2 + ...rComposeConnectionDetailsFactoryTests.java | 2 + ...rComposeConnectionDetailsFactoryTests.java | 2 + .../spring-cloud-azure-testcontainers/pom.xml | 17 ++++++ ...ontainerConnectionDetailsFactoryTests.java | 2 + ...ontainerConnectionDetailsFactoryTests.java | 2 + ...ontainerConnectionDetailsFactoryTests.java | 2 + ...ontainerConnectionDetailsFactoryTests.java | 2 + ...ontainerConnectionDetailsFactoryTests.java | 2 + 12 files changed, 106 insertions(+) create mode 100644 .github/workflows/spring-docker-tests.yml diff --git a/.github/workflows/spring-docker-tests.yml b/.github/workflows/spring-docker-tests.yml new file mode 100644 index 000000000000..9b57a5b9c0c3 --- /dev/null +++ b/.github/workflows/spring-docker-tests.yml @@ -0,0 +1,54 @@ +name: Spring Docker Tests + +on: + pull_request: + paths: + - '.github/workflows/spring-docker-tests.yml' + - 'pom.xml' + - 'sdk/spring/**' + - 'sdk/parents/**' + workflow_dispatch: + +permissions: + contents: read + +jobs: + spring-docker-tests: + runs-on: ubuntu-24.04 + timeout-minutes: 45 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '17' + cache: maven + + - name: Verify Docker + run: | + docker version + docker info + + - name: Build spring docker test dependencies + run: > + mvn -f sdk/spring/pom.xml + -pl spring-cloud-azure-testcontainers,spring-cloud-azure-docker-compose + -am + install + -DskipTests + -DskipITs + -DfailIfNoTests=false + + - name: Run spring docker-tagged tests + run: > + mvn -f sdk/spring/pom.xml + -pl spring-cloud-azure-testcontainers,spring-cloud-azure-docker-compose + test + -Pdocker-tests + -DfailIfNoTests=false + -DskipITs + -DskipTests=false \ No newline at end of file diff --git a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml index 343791baf6e8..6dfce22a6d59 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml +++ b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml @@ -38,6 +38,8 @@ true 17 17 + + docker https://azuresdkartifacts.blob.core.windows.net/azure-sdk-for-java @@ -196,6 +198,14 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + ${surefire.test.groups} + ${surefire.excluded.test.groups} + + org.apache.maven.plugins maven-jar-plugin @@ -278,6 +288,13 @@ + + docker-tests + + docker + + + below-java-17 diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java index 3f1d51308a7d..454c8659c1f4 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java @@ -12,6 +12,7 @@ import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusErrorHandler; import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusRecordMessageListener; import com.azure.spring.messaging.servicebus.core.ServiceBusTemplate; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -42,6 +43,7 @@ "spring.cloud.azure.servicebus.processor.entity-name=queue.1", "spring.cloud.azure.servicebus.processor.entity-type=queue" }) +@Tag("docker") @EnabledOnOs(OS.LINUX) class ServiceBusDockerComposeConnectionDetailsFactoryTests { diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java index 1369301024c1..9d38f7ebb433 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java @@ -8,6 +8,7 @@ import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -30,6 +31,7 @@ "spring.cloud.azure.eventhubs.event-hub-name=eh1", "spring.cloud.azure.eventhubs.producer.event-hub-name=eh1" }) +@Tag("docker") @EnabledOnOs(OS.LINUX) class EventHubsDockerComposeConnectionDetailsFactoryTests { diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageBlobDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageBlobDockerComposeConnectionDetailsFactoryTests.java index 861401e1957d..310d8e701a20 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageBlobDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageBlobDockerComposeConnectionDetailsFactoryTests.java @@ -6,6 +6,7 @@ import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.storage.blob.AzureStorageBlobAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.storage.blob.AzureStorageBlobResourceAutoConfiguration; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -28,6 +29,7 @@ "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/storage-compose.yaml", "spring.docker.compose.stop.command=down" }) +@Tag("docker") @EnabledOnOs(OS.LINUX) class StorageBlobDockerComposeConnectionDetailsFactoryTests { diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageQueueDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageQueueDockerComposeConnectionDetailsFactoryTests.java index 1e01ed16562b..9287a16a9774 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageQueueDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageQueueDockerComposeConnectionDetailsFactoryTests.java @@ -6,6 +6,7 @@ import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.storage.queue.AzureStorageQueueAutoConfiguration; import com.azure.storage.queue.QueueClient; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -22,6 +23,7 @@ "spring.docker.compose.stop.command=down", "spring.cloud.azure.storage.queue.queue-name=devstoreaccount1/tc-queue" }) +@Tag("docker") @EnabledOnOs(OS.LINUX) class StorageQueueDockerComposeConnectionDetailsFactoryTests { diff --git a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml index b09c9483eeaf..2c16b2ca2355 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml +++ b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml @@ -38,6 +38,8 @@ true 17 17 + + docker https://azuresdkartifacts.blob.core.windows.net/azure-sdk-for-java @@ -204,6 +206,14 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + ${surefire.test.groups} + ${surefire.excluded.test.groups} + + org.apache.maven.plugins maven-jar-plugin @@ -286,6 +296,13 @@ + + docker-tests + + docker + + + below-java-17 diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/bus/ServiceBusContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/bus/ServiceBusContainerConnectionDetailsFactoryTests.java index 5a3cd1e173ab..5f4a543a58ed 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/bus/ServiceBusContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/bus/ServiceBusContainerConnectionDetailsFactoryTests.java @@ -12,6 +12,7 @@ import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusErrorHandler; import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusRecordMessageListener; import com.azure.spring.messaging.servicebus.core.ServiceBusTemplate; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -41,6 +42,7 @@ @TestPropertySource(properties = { "spring.cloud.azure.servicebus.entity-name=queue.1", "spring.cloud.azure.servicebus.entity-type=queue" }) @Testcontainers +@Tag("docker") @EnabledOnOs(OS.LINUX) class ServiceBusContainerConnectionDetailsFactoryTests { diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/cosmos/CosmosContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/cosmos/CosmosContainerConnectionDetailsFactoryTests.java index bc938ddd50e2..b97dd6b1c9c7 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/cosmos/CosmosContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/cosmos/CosmosContainerConnectionDetailsFactoryTests.java @@ -10,6 +10,7 @@ import com.azure.spring.data.cosmos.repository.CosmosRepository; import com.azure.spring.data.cosmos.repository.config.EnableCosmosRepositories; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -41,6 +42,7 @@ @SpringJUnitConfig @Testcontainers +@Tag("docker") @EnabledOnOs(OS.LINUX) class CosmosContainerConnectionDetailsFactoryTests { diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java index 84c05c2bc6a2..ed2fb7f1556e 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java @@ -8,6 +8,7 @@ import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -35,6 +36,7 @@ "spring.cloud.azure.eventhubs.event-hub-name=eh1" }) @Testcontainers +@Tag("docker") @EnabledOnOs(OS.LINUX) class EventHubsContainerConnectionDetailsFactoryTests { diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageBlobContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageBlobContainerConnectionDetailsFactoryTests.java index abcf84118d7f..f0032a109708 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageBlobContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageBlobContainerConnectionDetailsFactoryTests.java @@ -6,6 +6,7 @@ import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.storage.blob.AzureStorageBlobAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.storage.blob.AzureStorageBlobResourceAutoConfiguration; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -29,6 +30,7 @@ @SpringJUnitConfig @Testcontainers +@Tag("docker") @EnabledOnOs(OS.LINUX) class StorageBlobContainerConnectionDetailsFactoryTests { @Container diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageQueueContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageQueueContainerConnectionDetailsFactoryTests.java index ebc0783b5fcf..1ded16f94cdb 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageQueueContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageQueueContainerConnectionDetailsFactoryTests.java @@ -6,6 +6,7 @@ import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.storage.queue.AzureStorageQueueAutoConfiguration; import com.azure.storage.queue.QueueClient; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -24,6 +25,7 @@ @SpringJUnitConfig @TestPropertySource(properties = "spring.cloud.azure.storage.queue.queue-name=devstoreaccount1/tc-queue") @Testcontainers +@Tag("docker") @EnabledOnOs(OS.LINUX) class StorageQueueContainerConnectionDetailsFactoryTests { From bbcbe6372f40a616cd7a873368d72c6e3de3ff49 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Fri, 12 Jun 2026 10:09:24 +0800 Subject: [PATCH 2/2] Fix surefire plugin version marker for pom scanner --- sdk/spring/spring-cloud-azure-docker-compose/pom.xml | 1 + sdk/spring/spring-cloud-azure-testcontainers/pom.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml index 6dfce22a6d59..71a771c93a7c 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml +++ b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml @@ -201,6 +201,7 @@ org.apache.maven.plugins maven-surefire-plugin + 3.5.5 ${surefire.test.groups} ${surefire.excluded.test.groups} diff --git a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml index 2c16b2ca2355..32c6e2517241 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml +++ b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml @@ -209,6 +209,7 @@ org.apache.maven.plugins maven-surefire-plugin + 3.5.5 ${surefire.test.groups} ${surefire.excluded.test.groups}