Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .github/workflows/migration-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Database Migration Test

on:
workflow_dispatch:
pull_request:
branches:
- main

jobs:
qa:
runs-on: ubuntu-latest

strategy:
fail-fast: false
matrix:
db: [mysql, mariadb, postgres, oracle, sqlserver]

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Docker
uses: docker/setup-buildx-action@v3

- name: Run QA script
run: |
./mvnw clean install -DskipTests -PskipFrontendBuild
cd qa
chmod +x ./db-migration-test.sh
./db-migration-test.sh ${{ matrix.db }}
206 changes: 206 additions & 0 deletions database/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,212 @@
</build>
</profile>

<profile>
<id>mt-mysql</id>
<properties>
<database.type>mysql</database.type>
<database.driver>com.mysql.cj.jdbc.Driver</database.driver>
<database.datasource.class>com.mysql.cj.jdbc.MysqlDataSource</database.datasource.class>
<jboss.datasource.filename>mysql-ds.xml</jboss.datasource.filename>
<database.port>${env.MT_MYSQL_HOST_PORT}</database.port>
<database.name>${env.MT_MYSQL_DATABASE}</database.name>
<database.username>${env.MT_MYSQL_USERNAME}</database.username>
<database.password>${env.MT_MYSQL_PASSWORD}</database.password>
<database.params>${database.name}?allowPublicKeyRetrieval=true</database.params>
<database.url>jdbc:mysql://${database.username}:${database.password}@localhost:${database.port}/${database.params}</database.url>
</properties>

<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${version.mysql}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>

<profile>
<id>mt-mariadb</id>
<properties>
<database.type>mariadb</database.type>
<database.driver>org.mariadb.jdbc.Driver</database.driver>
<hibernate.dialect>org.hibernate.dialect.MariaDBDialect</hibernate.dialect>
<database.datasource.class>org.mariadb.jdbc.MariaDbDataSource</database.datasource.class>
<database.port>${env.MT_MARIADB_HOST_PORT}</database.port>
<database.name>${env.MT_MARIADB_DATABASE}</database.name>
<database.username>${env.MT_MARIADB_USERNAME}</database.username>
<database.password>${env.MT_MARIADB_PASSWORD}</database.password>
<database.params>${database.name}?user=${database.username}&amp;amp;password=${database.password}</database.params>
<database.url>jdbc:mariadb://localhost:${database.port}/${database.params}</database.url>
</properties>

<dependencies>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>${version.mariadb}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>

<profile>
<id>mt-postgres</id>
<properties>
<database.type>postgres</database.type>
<database.driver>org.postgresql.Driver</database.driver>
<hibernate.dialect>org.hibernate.dialect.PostgreSQLDialect</hibernate.dialect>
<database.datasource.class>org.postgresql.ds.PGSimpleDataSource</database.datasource.class>
<jboss.datasource.filename>postgresql-ds.xml</jboss.datasource.filename>
<database.port>${env.MT_POSTGRES_HOST_PORT}</database.port>
<database.name>${env.MT_POSTGRES_DATABASE}</database.name>
<database.username>${env.MT_POSTGRES_USERNAME}</database.username>
<database.password>${env.MT_POSTGRES_PASSWORD}</database.password>
<database.params>${database.name}?user=${database.username}&amp;amp;password=${database.password}</database.params>
<database.url>jdbc:postgresql://localhost:${database.port}/${database.params}</database.url>
</properties>

<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${version.postgresql}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>

<profile>
<id>mt-sqlserver</id>
<properties>
<database.type>sqlserver</database.type>
<database.driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</database.driver>
<database.datasource.class>com.microsoft.sqlserver.jdbc.SQLServerDataSource</database.datasource.class>
<jboss.datasource.filename>sqlserver-ds.xml</jboss.datasource.filename>
<database.port>${env.MT_MSSQL_HOST_PORT}</database.port>
<database.name>${env.MT_MSSQL_DATABASE}</database.name>
<database.username>${env.MT_MSSQL_USERNAME}</database.username>
<database.password>${env.MT_MSSQL_PASSWORD}</database.password>
<database.params>;databaseName=${database.name};user=${database.username};password=${database.password};encrypt=false;</database.params>
<database.url>jdbc:sqlserver://localhost:${database.port}${database.params}</database.url>
</properties>

<dependencies>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>${version.sqlserver}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>

<profile>
<id>mt-oracle</id>
<properties>
<database.type>oracle</database.type>
<database.driver>oracle.jdbc.OracleDriver</database.driver>
<database.datasource.class>oracle.jdbc.pool.OracleDataSource</database.datasource.class>
<jboss.datasource.filename>oracle-ds.xml</jboss.datasource.filename>
<database.port>${env.MT_ORACLE_HOST_PORT}</database.port>
<database.name>${env.MT_ORACLE_DATABASE}</database.name>
<database.username>${env.MT_ORACLE_USERNAME}</database.username>
<database.password>${env.MT_ORACLE_PASSWORD}</database.password>
<database.params>${database.name}</database.params>
<database.url>jdbc:oracle:thin:${database.username}/${database.password}@//localhost:${database.port}/${database.params}</database.url>
</properties>
<dependencies>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<version>${version.oracle}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>

<profile>
<id>oracle</id>
<properties>
Expand Down
32 changes: 32 additions & 0 deletions qa/db-migration-test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/bin/bash
set -e

DB_TYPE="$1"
TEST_DB_CONTAINER_PATH=./test-database-container

case "$DB_TYPE" in
mysql)
source "$TEST_DB_CONTAINER_PATH"/mysql/qa-mysql.sh
test_mysql
;;
mariadb)
source "$TEST_DB_CONTAINER_PATH"/mariadb/qa-mariadb.sh
test_mariadb
;;
postgres)
source "$TEST_DB_CONTAINER_PATH"/postgres/qa-postgres.sh
test_postgres
;;
sqlserver)
source "$TEST_DB_CONTAINER_PATH"/sqlserver/qa-sqlserver.sh
test_sqlserver
;;
oracle)
source "$TEST_DB_CONTAINER_PATH"/oracle/qa-oracle.sh
test_oracle
;;
*)
echo "Usage: $0 {mysql|mariadb|postgres|oracle|sqlserver}"
exit 1
;;
esac
11 changes: 11 additions & 0 deletions qa/test-database-container/mariadb/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
services:
mariadb:
image: mariadb:11.8
container_name: ${MT_MARIADB_CONTAINER_NAME}
ports:
- "${MT_MARIADB_HOST_PORT}:3306"
environment:
- MARIADB_ROOT_PASSWORD=${MT_MARIADB_PASSWORD}
- MARIADB_DATABASE=${MT_MARIADB_DATABASE}
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf
2 changes: 2 additions & 0 deletions qa/test-database-container/mariadb/my.cnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[mysqld]
transaction-isolation=READ-COMMITTED
56 changes: 56 additions & 0 deletions qa/test-database-container/mariadb/qa-mariadb.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#!/bin/bash
test_mariadb() {
set -e # Exit on error (except where we trap it)

# Configuration
export MT_MARIADB_CONTAINER_NAME="mariadb_11_8"
export MT_MARIADB_USERNAME="root"
export MT_MARIADB_PASSWORD="123456"

export MT_MARIADB_HOST_PORT="33070"
export MT_MARIADB_DATABASE="operaton"

MAX_RETRIES=30
SLEEP_SEC=2
COMPOSE_FILE="./test-database-container/mariadb/docker-compose.yaml"
MAVEN_WRAPPER="../mvnw"

# Bring down possible running containers from a broken execution
cleanup_containers

# Start containers
docker compose -f "${COMPOSE_FILE}" up -d
echo "⏳ Waiting for MariaDB to be ready inside container $MT_MARIADB_CONTAINER_NAME..."

# Wait for container to be available
retries=0
until docker exec -i "$MT_MARIADB_CONTAINER_NAME" \
mariadb -u"$MT_MARIADB_USERNAME" -p"$MT_MARIADB_PASSWORD" -e "SELECT 'i_am_up';" 2>/dev/null | grep -q "i_am_up"; do
retries=$((retries+1))
if [ "$retries" -ge "$MAX_RETRIES" ]; then
echo "❌ MariaDB did not become ready in time!"
cleanup_containers
exit 1
fi
echo "⏳ MariaDB not ready yet... waiting $SLEEP_SEC seconds"
sleep "$SLEEP_SEC"
done

echo "🚀 MariaDB is ready!"

# Run Maven build, capture exit code
set +e # allow Maven to fail without stopping the script
"$MAVEN_WRAPPER" clean install -Prolling-update,mt-mariadb
BUILD_EXIT_CODE=$?
set -e

# Always bring down containers at the end
cleanup_containers

# Exit with Maven's exit code
exit $BUILD_EXIT_CODE
}

cleanup_containers() {
docker compose -f "${COMPOSE_FILE}" down
}
11 changes: 11 additions & 0 deletions qa/test-database-container/mysql/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
services:
mysql:
image: mysql:9.2.0
container_name: ${MT_MYSQL_CONTAINER_NAME}
ports:
- "${MT_MYSQL_HOST_PORT}:3306"
environment:
- MYSQL_ROOT_PASSWORD=${MT_MYSQL_PASSWORD}
- MYSQL_DATABASE=${MT_MYSQL_DATABASE}
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf
2 changes: 2 additions & 0 deletions qa/test-database-container/mysql/my.cnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[mysqld]
transaction-isolation=READ-COMMITTED
Loading
Loading