diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml
index 1bc1915a71..2e22e76ac6 100644
--- a/.github/workflows/budibase_ci.yml
+++ b/.github/workflows/budibase_ci.yml
@@ -108,7 +108,7 @@ jobs:
- name: Pull testcontainers images
run: |
docker pull testcontainers/ryuk:0.5.1 &
- docker pull budibase/couchdb:v3.2.1-sqs &
+ docker pull budibase/couchdb:v3.3.3 &
docker pull redis &
wait $(jobs -p)
@@ -162,17 +162,23 @@ jobs:
node-version: 20.x
cache: yarn
+ - name: Load dotenv
+ id: dotenv
+ uses: falti/dotenv-action@v1.1.3
+ with:
+ path: ./packages/server/datasource-sha.env
+
- name: Pull testcontainers images
run: |
- docker pull mcr.microsoft.com/mssql/server:2022-CU13-ubuntu-22.04 &
- docker pull mysql:8.3 &
- docker pull postgres:16.1-bullseye &
- docker pull mongo:7.0-jammy &
- docker pull mariadb:lts &
- docker pull testcontainers/ryuk:0.5.1 &
- docker pull budibase/couchdb:v3.2.1-sqs &
+ docker pull mcr.microsoft.com/mssql/server@${{ steps.dotenv.outputs.MSSQL_SHA }} &
+ docker pull mysql@${{ steps.dotenv.outputs.MYSQL_SHA }} &
+ docker pull postgres@${{ steps.dotenv.outputs.POSTGRES_SHA }} &
+ docker pull mongo@${{ steps.dotenv.outputs.MONGODB_SHA }} &
+ docker pull mariadb@${{ steps.dotenv.outputs.MARIADB_SHA }} &
docker pull minio/minio &
docker pull redis &
+ docker pull testcontainers/ryuk:0.5.1 &
+ docker pull budibase/couchdb:v3.3.3 &
wait $(jobs -p)
diff --git a/globalSetup.ts b/globalSetup.ts
index dd1454b6e1..aa1cb00fe1 100644
--- a/globalSetup.ts
+++ b/globalSetup.ts
@@ -46,7 +46,7 @@ export default async function setup() {
await killContainers(containers)
try {
- const couchdb = new GenericContainer("budibase/couchdb:v3.2.1-sqs")
+ const couchdb = new GenericContainer("budibase/couchdb:v3.3.3")
.withExposedPorts(5984, 4984)
.withEnvironment({
COUCHDB_PASSWORD: "budibase",
diff --git a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte
index 8a9d1e59ea..677ee79981 100644
--- a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte
+++ b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte
@@ -58,6 +58,7 @@
AutomationEventType,
AutomationStepType,
AutomationActionStepId,
+ AutomationCustomIOType,
} from "@budibase/types"
import { FIELDS } from "constants/backend"
import PropField from "./PropField.svelte"
@@ -394,7 +395,9 @@
*/
const onRowTriggerUpdate = async update => {
if (
- ["tableId", "filters", "meta"].some(key => Object.hasOwn(update, key))
+ ["tableId", AutomationCustomIOType.FILTERS, "meta"].some(key =>
+ Object.hasOwn(update, key)
+ )
) {
try {
let updatedAutomation
@@ -744,7 +747,11 @@
for (let [key, field] of properties) {
// need to look for the builder definition (keyed separately, see saveFilters)
const defKey = `${key}-def`
- if (field.customType === "filters" && inputs?.[defKey]) {
+ if (
+ (field.customType === AutomationCustomIOType.FILTERS ||
+ field.customType === AutomationCustomIOType.TRIGGER_FILTER) &&
+ inputs?.[defKey]
+ ) {
filters = inputs[defKey]
break
}
@@ -846,7 +853,7 @@
- {#if value.customType === "trigger_filter"}
+ {#if value.customType === AutomationCustomIOType.TRIGGER_FILTER}
@@ -977,7 +984,7 @@
{/if}
- {:else if value.customType === "filters" || value.customType === "trigger_filter"}
+ {:else if value.customType === AutomationCustomIOType.FILTERS || value.customType === AutomationCustomIOType.TRIGGER_FILTER}
{filters.length > 0
? "Update Filter"
diff --git a/packages/server/datasource-sha.env b/packages/server/datasource-sha.env
new file mode 100644
index 0000000000..9b935ed8eb
--- /dev/null
+++ b/packages/server/datasource-sha.env
@@ -0,0 +1,5 @@
+MSSQL_SHA=sha256:c4369c38385eba011c10906dc8892425831275bb035d5ce69656da8e29de50d8
+MYSQL_SHA=sha256:9de9d54fecee6253130e65154b930978b1fcc336bcc86dfd06e89b72a2588ebe
+POSTGRES_SHA=sha256:bd0d8e485d1aca439d39e5ea99b931160bd28d862e74c786f7508e9d0053090e
+MONGODB_SHA=sha256:afa36bca12295b5f9dae68a493c706113922bdab520e901bd5d6c9d7247a1d8d
+MARIADB_SHA=sha256:e59ba8783bf7bc02a4779f103bb0d8751ac0e10f9471089709608377eded7aa8
diff --git a/packages/server/src/automations/triggerInfo/rowSaved.ts b/packages/server/src/automations/triggerInfo/rowSaved.ts
index a178e2c7e8..d128934dcc 100644
--- a/packages/server/src/automations/triggerInfo/rowSaved.ts
+++ b/packages/server/src/automations/triggerInfo/rowSaved.ts
@@ -25,7 +25,7 @@ export const definition: AutomationTriggerSchema = {
},
filters: {
type: AutomationIOType.OBJECT,
- customType: AutomationCustomIOType.FILTERS,
+ customType: AutomationCustomIOType.TRIGGER_FILTER,
title: "Filtering",
},
},
diff --git a/packages/server/src/integrations/tests/utils/images.ts b/packages/server/src/integrations/tests/utils/images.ts
new file mode 100644
index 0000000000..8c2bb9b220
--- /dev/null
+++ b/packages/server/src/integrations/tests/utils/images.ts
@@ -0,0 +1,13 @@
+import dotenv from "dotenv"
+import { join } from "path"
+
+const path = join(__dirname, "..", "..", "..", "..", "datasource-sha.env")
+dotenv.config({
+ path,
+})
+
+export const MSSQL_IMAGE = `mcr.microsoft.com/mssql/server@${process.env.MSSQL_SHA}`
+export const MYSQL_IMAGE = `mysql@${process.env.MYSQL_SHA}`
+export const POSTGRES_IMAGE = `postgres@${process.env.POSTGRES_SHA}`
+export const MONGODB_IMAGE = `mongo@${process.env.MONGODB_SHA}`
+export const MARIADB_IMAGE = `mariadb@${process.env.MARIADB_SHA}`
diff --git a/packages/server/src/integrations/tests/utils/index.ts b/packages/server/src/integrations/tests/utils/index.ts
index b888f1adc1..8e317d9099 100644
--- a/packages/server/src/integrations/tests/utils/index.ts
+++ b/packages/server/src/integrations/tests/utils/index.ts
@@ -1,3 +1,4 @@
+import "./images"
import { Datasource, SourceName } from "@budibase/types"
import * as postgres from "./postgres"
import * as mongodb from "./mongodb"
@@ -67,7 +68,11 @@ export async function knexClient(ds: Datasource) {
export async function startContainer(container: GenericContainer) {
const imageName = (container as any).imageName.string as string
- const key = imageName.replaceAll("/", "-").replaceAll(":", "-")
+ let key: string = imageName
+ if (imageName.includes("@sha256")) {
+ key = imageName.split("@")[0]
+ }
+ key = key.replaceAll("/", "-").replaceAll(":", "-")
container = container
.withReuse()
diff --git a/packages/server/src/integrations/tests/utils/mariadb.ts b/packages/server/src/integrations/tests/utils/mariadb.ts
index 3a90b554ee..529ac0b76b 100644
--- a/packages/server/src/integrations/tests/utils/mariadb.ts
+++ b/packages/server/src/integrations/tests/utils/mariadb.ts
@@ -4,6 +4,7 @@ import { AbstractWaitStrategy } from "testcontainers/build/wait-strategies/wait-
import { generator, testContainerUtils } from "@budibase/backend-core/tests"
import { startContainer } from "."
import { knexClient } from "./mysql"
+import { MARIADB_IMAGE } from "./images"
let ports: Promise
@@ -27,7 +28,7 @@ class MariaDBWaitStrategy extends AbstractWaitStrategy {
export async function getDatasource(): Promise {
if (!ports) {
ports = startContainer(
- new GenericContainer("mariadb:lts")
+ new GenericContainer(MARIADB_IMAGE)
.withExposedPorts(3306)
.withEnvironment({ MARIADB_ROOT_PASSWORD: "password" })
.withWaitStrategy(new MariaDBWaitStrategy())
diff --git a/packages/server/src/integrations/tests/utils/mongodb.ts b/packages/server/src/integrations/tests/utils/mongodb.ts
index 0bdbb2808c..a62d895042 100644
--- a/packages/server/src/integrations/tests/utils/mongodb.ts
+++ b/packages/server/src/integrations/tests/utils/mongodb.ts
@@ -2,13 +2,14 @@ import { generator, testContainerUtils } from "@budibase/backend-core/tests"
import { Datasource, SourceName } from "@budibase/types"
import { GenericContainer, Wait } from "testcontainers"
import { startContainer } from "."
+import { MONGODB_IMAGE } from "./images"
let ports: Promise
export async function getDatasource(): Promise {
if (!ports) {
ports = startContainer(
- new GenericContainer("mongo:7.0-jammy")
+ new GenericContainer(MONGODB_IMAGE)
.withExposedPorts(27017)
.withEnvironment({
MONGO_INITDB_ROOT_USERNAME: "mongo",
diff --git a/packages/server/src/integrations/tests/utils/mssql.ts b/packages/server/src/integrations/tests/utils/mssql.ts
index ed94477814..709ebb9439 100644
--- a/packages/server/src/integrations/tests/utils/mssql.ts
+++ b/packages/server/src/integrations/tests/utils/mssql.ts
@@ -3,15 +3,14 @@ import { GenericContainer, Wait } from "testcontainers"
import { generator, testContainerUtils } from "@budibase/backend-core/tests"
import { startContainer } from "."
import knex from "knex"
+import { MSSQL_IMAGE } from "./images"
let ports: Promise
export async function getDatasource(): Promise {
if (!ports) {
ports = startContainer(
- new GenericContainer(
- "mcr.microsoft.com/mssql/server:2022-CU13-ubuntu-22.04"
- )
+ new GenericContainer(MSSQL_IMAGE)
.withExposedPorts(1433)
.withEnvironment({
ACCEPT_EULA: "Y",
diff --git a/packages/server/src/integrations/tests/utils/mysql.ts b/packages/server/src/integrations/tests/utils/mysql.ts
index c35be0689e..68e591837b 100644
--- a/packages/server/src/integrations/tests/utils/mysql.ts
+++ b/packages/server/src/integrations/tests/utils/mysql.ts
@@ -4,6 +4,7 @@ import { AbstractWaitStrategy } from "testcontainers/build/wait-strategies/wait-
import { generator, testContainerUtils } from "@budibase/backend-core/tests"
import { startContainer } from "."
import knex from "knex"
+import { MYSQL_IMAGE } from "./images"
let ports: Promise
@@ -30,7 +31,7 @@ class MySQLWaitStrategy extends AbstractWaitStrategy {
export async function getDatasource(): Promise {
if (!ports) {
ports = startContainer(
- new GenericContainer("mysql:8.3")
+ new GenericContainer(MYSQL_IMAGE)
.withExposedPorts(3306)
.withEnvironment({ MYSQL_ROOT_PASSWORD: "password" })
.withWaitStrategy(new MySQLWaitStrategy().withStartupTimeout(10000))
diff --git a/packages/server/src/integrations/tests/utils/postgres.ts b/packages/server/src/integrations/tests/utils/postgres.ts
index 74f5722737..bf8d76e39d 100644
--- a/packages/server/src/integrations/tests/utils/postgres.ts
+++ b/packages/server/src/integrations/tests/utils/postgres.ts
@@ -3,13 +3,14 @@ import { GenericContainer, Wait } from "testcontainers"
import { generator, testContainerUtils } from "@budibase/backend-core/tests"
import { startContainer } from "."
import knex from "knex"
+import { POSTGRES_IMAGE } from "./images"
let ports: Promise
export async function getDatasource(): Promise {
if (!ports) {
ports = startContainer(
- new GenericContainer("postgres:16.1-bullseye")
+ new GenericContainer(POSTGRES_IMAGE)
.withExposedPorts(5432)
.withEnvironment({ POSTGRES_PASSWORD: "password" })
.withWaitStrategy(