This is an automated email from the ASF dual-hosted git repository.
arnold pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git
The following commit(s) were added to refs/heads/develop by this push:
new fe4c970e05 FINERACT-2389: Fix for starting up in Liquibase only mode
and pipeline to verify this to prevent breaking
fe4c970e05 is described below
commit fe4c970e05e0a30708e2e63a4fd3a86b5850e979
Author: Arnold Galovics <[email protected]>
AuthorDate: Fri Nov 7 09:42:11 2025 +0100
FINERACT-2389: Fix for starting up in Liquibase only mode and pipeline to
verify this to prevent breaking
---
.github/workflows/liquibase-only-postgresql.yml | 81 ++++++++++++++++++++++
.../TomcatJdbcDataSourcePerTenantService.java | 6 +-
2 files changed, 85 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/liquibase-only-postgresql.yml
b/.github/workflows/liquibase-only-postgresql.yml
new file mode 100644
index 0000000000..134e13fd22
--- /dev/null
+++ b/.github/workflows/liquibase-only-postgresql.yml
@@ -0,0 +1,81 @@
+name: Fineract Liquibase Only mode - PostgreSQL
+
+on: [push, pull_request]
+
+permissions:
+ contents: read
+
+jobs:
+ test:
+ runs-on: ubuntu-22.04
+ timeout-minutes: 60
+
+ services:
+ postgresql:
+ image: postgres:17.4
+ ports:
+ - 5432:5432
+ env:
+ POSTGRES_USER: root
+ POSTGRES_PASSWORD: postgres
+ options: --health-cmd="pg_isready -q -d postgres -U root"
--health-interval=5s --health-timeout=2s --health-retries=3
+
+ env:
+ TZ: Asia/Kolkata
+ DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
+ with:
+ fetch-depth: 0
+ fetch-tags: true
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5
+ with:
+ java-version: '21'
+ distribution: 'zulu'
+
+ - name: Cache Gradle dependencies
+ uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*',
'**/gradle-wrapper.properties') }}
+
+ - name: Setup Gradle and Validate Wrapper
+ uses:
gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0
+ with:
+ validate-wrappers: true
+
+ - name: Verify PostgreSQL connection
+ run: |
+ while ! pg_isready -d postgres -U root -h 127.0.0.1 -p 5432 ; do
+ sleep 1
+ done
+
+ - name: Initialise databases
+ run: |
+ ./gradlew --no-daemon -q createPGDB -PdbName=fineract_tenants
+ ./gradlew --no-daemon -q createPGDB -PdbName=fineract_default
+
+ - name: Run Fineract in Liquibase only mode
+ env:
+ FINERACT_DEFAULT_TENANTDB_CONN_PARAMS: ""
+ FINERACT_DEFAULT_TENANTDB_DESCRIPTION: "Default Demo Tenant"
+ FINERACT_DEFAULT_TENANTDB_HOSTNAME: "localhost"
+ FINERACT_DEFAULT_TENANTDB_IDENTIFIER: "default"
+ FINERACT_DEFAULT_TENANTDB_NAME: "fineract_default"
+ FINERACT_DEFAULT_TENANTDB_PORT: "5432"
+ FINERACT_DEFAULT_TENANTDB_PWD: "postgres"
+ FINERACT_DEFAULT_TENANTDB_TIMEZONE: "Asia/Kolkata"
+ FINERACT_DEFAULT_TENANTDB_UID: "root"
+ FINERACT_HIKARI_DRIVER_SOURCE_CLASS_NAME: "org.postgresql.Driver"
+ FINERACT_HIKARI_JDBC_URL:
"jdbc:postgresql://localhost:5432/fineract_tenants"
+ FINERACT_HIKARI_PASSWORD: "postgres"
+ FINERACT_HIKARI_USERNAME: "root"
+ SPRING_PROFILES_ACTIVE: "liquibase-only"
+ run:
+ ./gradlew fineract-provider:bootRun
diff --git
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/TomcatJdbcDataSourcePerTenantService.java
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/TomcatJdbcDataSourcePerTenantService.java
index a6c1889dd8..11722bf2f3 100644
---
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/TomcatJdbcDataSourcePerTenantService.java
+++
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/TomcatJdbcDataSourcePerTenantService.java
@@ -33,6 +33,7 @@ import
org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
import
org.apache.fineract.infrastructure.core.domain.FineractPlatformTenantConnection;
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
import
org.apache.fineract.infrastructure.core.service.tenant.TenantDetailsService;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
@@ -56,8 +57,9 @@ public class TomcatJdbcDataSourcePerTenantService implements
RoutingDataSourceSe
private final DataSourcePerTenantServiceFactory
dataSourcePerTenantServiceFactory;
- private final MoneyHelperInitializationService
moneyHelperInitializationService;
private final Set<Long> tenantMoneyInitializingSet =
Sets.newConcurrentHashSet();
+ @Autowired(required = false)
+ private MoneyHelperInitializationService moneyHelperInitializationService;
@Override
public DataSource retrieveDataSource() {
@@ -77,7 +79,7 @@ public class TomcatJdbcDataSourcePerTenantService implements
RoutingDataSourceSe
// TODO: This is definitely not the optimal place to initialize the
rounding modes
// Preferably nothing should use a statically referenced context and
the initialization
// should happen within the rounding mode retrieval
- if (tenant != null) {
+ if (moneyHelperInitializationService != null && tenant != null) {
Long connectionId = tenant.getConnection().getConnectionId();
if (!tenantMoneyInitializingSet.contains(connectionId) &&
!moneyHelperInitializationService.isTenantInitialized(tenant)) {
// Double check to prevent visibility and race-condition issues