From 8cffdeda568396f176068051b97135d38c27bd30 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 3 Apr 2024 11:33:39 +0100 Subject: [PATCH] Re-use containers and create namespaces for each test. --- .github/workflows/budibase_ci.yml | 5 +++++ globalSetup.ts | 6 ++++++ .../tests/core/utilities/testContainerUtils.ts | 12 +++++++++++- .../server/src/integrations/tests/utils/index.ts | 6 ++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index 919ad7dfb2..3d166dc262 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -91,6 +91,9 @@ jobs: test-libraries: runs-on: ubuntu-latest + env: + REUSE_CONTAINERS: true + CONTAINER_NAMESPACE: test-server steps: - name: Checkout repo uses: actions/checkout@v4 @@ -141,6 +144,8 @@ jobs: runs-on: budi-tubby-tornado-quad-core-150gb env: DEBUG: testcontainers,testcontainers:exec,testcontainers:build,testcontainers:pull + REUSE_CONTAINERS: true + CONTAINER_NAMESPACE: test-server steps: - name: Checkout repo uses: actions/checkout@v4 diff --git a/globalSetup.ts b/globalSetup.ts index 00d5e3f2dc..a1f66d4fc8 100644 --- a/globalSetup.ts +++ b/globalSetup.ts @@ -26,5 +26,11 @@ export default async function setup() { couchdb = couchdb.withReuse() } + if (process.env.CONTAINER_NAMESPACE) { + couchdb = couchdb.withLabels({ + "org.testcontainers.namespace": process.env.CONTAINER_NAMESPACE, + }) + } + await couchdb.start() } diff --git a/packages/backend-core/tests/core/utilities/testContainerUtils.ts b/packages/backend-core/tests/core/utilities/testContainerUtils.ts index dbb6fc9861..b0fbc2228a 100644 --- a/packages/backend-core/tests/core/utilities/testContainerUtils.ts +++ b/packages/backend-core/tests/core/utilities/testContainerUtils.ts @@ -23,12 +23,22 @@ function getTestcontainers(): ContainerInfo[] { // We use --format json to make sure the output is nice and machine-readable, // and we use --no-trunc so that the command returns full container IDs so we // can filter on them correctly. - return execSync("docker ps --format json --no-trunc") + let containers = execSync("docker ps --format json --no-trunc") .toString() .split("\n") .filter(x => x.length > 0) .map(x => JSON.parse(x) as ContainerInfo) .filter(x => x.Labels.includes("org.testcontainers=true")) + + if (process.env.CONTAINER_NAMESPACE) { + containers = containers.filter(x => + x.Labels.includes( + `org.testcontainers.namespace=${process.env.CONTAINER_NAMESPACE}` + ) + ) + } + + return containers } export function getContainerByImage(image: string) { diff --git a/packages/server/src/integrations/tests/utils/index.ts b/packages/server/src/integrations/tests/utils/index.ts index bbdb41b38a..3286f9a3b8 100644 --- a/packages/server/src/integrations/tests/utils/index.ts +++ b/packages/server/src/integrations/tests/utils/index.ts @@ -67,6 +67,12 @@ export async function rawQuery(ds: Datasource, sql: string): Promise { } export async function startContainer(container: GenericContainer) { + if (process.env.CONTAINER_NAMESPACE) { + container = container.withLabels({ + "org.testcontainers.namespace": process.env.CONTAINER_NAMESPACE, + }) + } + if (process.env.REUSE_CONTAINERS) { container = container.withReuse() }