Skip to content

Commit 925cd3a

Browse files
committed
Refactor Laravel migration script to improve isolation handling and database connection checks
- Removed migration isolation argument from test-db-connection script. - Introduced a helper function for running migrations per database, enhancing clarity and reusability. - Updated migration flag assembly logic to better manage isolation settings. - Improved error handling and logging for database connection issues.
1 parent 9b6868e commit 925cd3a

File tree

2 files changed

+63
-45
lines changed

2 files changed

+63
-45
lines changed

src/common/etc/entrypoint.d/50-laravel-automations.sh

Lines changed: 56 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ fi
5353
############################################################################
5454

5555
artisan_migrate() {
56-
migrate_flags=""
57-
5856
debug_log "Starting migrations (isolation: $AUTORUN_LARAVEL_MIGRATION_ISOLATION)"
5957

6058
echo "🚀 Clearing Laravel cache before attempting migrations..."
@@ -73,7 +71,8 @@ artisan_migrate() {
7371
;;
7472
esac
7573

76-
# Build migration flags (used for all databases)
74+
# Determine if isolation is intended to be used
75+
isolation_enabled="false"
7776
if [ "$AUTORUN_LARAVEL_MIGRATION_ISOLATION" = "true" ]; then
7877
# Isolation only works in default mode
7978
if [ "$AUTORUN_LARAVEL_MIGRATION_MODE" != "default" ]; then
@@ -87,9 +86,12 @@ artisan_migrate() {
8786
return 1
8887
fi
8988

90-
migrate_flags="$migrate_flags --isolated"
89+
isolation_enabled="true"
9190
fi
9291

92+
# Start assembling migration flags
93+
migrate_flags=""
94+
9395
if [ "$AUTORUN_LARAVEL_MIGRATION_FORCE" = "true" ]; then
9496
migrate_flags="$migrate_flags --force"
9597
fi
@@ -98,30 +100,55 @@ artisan_migrate() {
98100
migrate_flags="$migrate_flags --seed"
99101
fi
100102

101-
# Determine if multiple databases are specified
103+
# Helper function to run migrations for a specific database
104+
run_migration_for_db() {
105+
db_name="${1:-}"
106+
107+
# Build display name and database flag for messages/commands
108+
if [ -n "$db_name" ]; then
109+
db_display_name="'$db_name'"
110+
db_flag="--database=$db_name"
111+
else
112+
db_display_name="default database"
113+
db_flag=""
114+
fi
115+
116+
# Wait for database connection
117+
if ! wait_for_database_connection $db_name; then
118+
echo "$script_name: Failed to connect to $db_display_name"
119+
return 1
120+
fi
121+
122+
# Determine if --isolated can be used for this database
123+
db_migrate_flags="$migrate_flags"
124+
if [ "$isolation_enabled" = "true" ]; then
125+
if db_has_migrations_table $db_name; then
126+
db_migrate_flags="$db_migrate_flags --isolated"
127+
debug_log "Using --isolated flag for $db_display_name"
128+
else
129+
echo "ℹ️ Skipping --isolated flag for $db_display_name: migrations table not ready (normal for first deployment)"
130+
echo " The --isolated flag will be used on subsequent deployments."
131+
fi
132+
fi
133+
134+
echo "🚀 Running migrations for $db_display_name"
135+
php "$APP_BASE_DIR/artisan" $migration_command $db_flag $db_migrate_flags
136+
}
137+
138+
# Run migrations for specified database(s)
102139
if [ -n "$AUTORUN_LARAVEL_MIGRATION_DATABASE" ]; then
103140
databases=$(convert_comma_delimited_to_space_separated "$AUTORUN_LARAVEL_MIGRATION_DATABASE")
104141
database_list=$(echo "$databases" | tr ',' ' ')
105142

106143
for db in $database_list; do
107-
# Wait for this specific database to be ready
108-
if ! wait_for_database_connection "$db"; then
109-
echo "$script_name: Failed to connect to database: $db"
144+
if ! run_migration_for_db "$db"; then
110145
return 1
111146
fi
112-
113-
echo "🚀 Running migrations for database: $db"
114-
php "$APP_BASE_DIR/artisan" $migration_command --database=$db $migrate_flags
115147
done
116148
else
117-
# Wait for default database connection
118-
if ! wait_for_database_connection; then
119-
echo "$script_name: Failed to connect to default database"
149+
if ! run_migration_for_db; then
120150
return 1
121151
fi
122-
123-
# Run migration with default database connection
124-
php "$APP_BASE_DIR/artisan" $migration_command $migrate_flags
125152
fi
126153
}
127154

@@ -316,6 +343,16 @@ laravel_version_is_at_least() {
316343
fi
317344
}
318345

346+
db_has_migrations_table() {
347+
database_arg="${1:-}"
348+
349+
if [ -n "$database_arg" ]; then
350+
php "$APP_BASE_DIR/artisan" migrate:status --database="$database_arg" > /dev/null 2>&1
351+
else
352+
php "$APP_BASE_DIR/artisan" migrate:status > /dev/null 2>&1
353+
fi
354+
}
355+
319356
test_db_connection() {
320357
if [ "$AUTORUN_LARAVEL_MIGRATION_SKIP_DB_CHECK" = "true" ]; then
321358
return 0
@@ -324,9 +361,9 @@ test_db_connection() {
324361
# Pass database connection name only if specified (not empty)
325362
database_arg="${1:-}"
326363
if [ -n "$database_arg" ]; then
327-
php "$AUTORUN_LIB_DIR/laravel/test-db-connection.php" "$APP_BASE_DIR" "$AUTORUN_LARAVEL_MIGRATION_MODE" "$AUTORUN_LARAVEL_MIGRATION_ISOLATION" "$database_arg"
364+
php "$AUTORUN_LIB_DIR/laravel/test-db-connection.php" "$APP_BASE_DIR" "$AUTORUN_LARAVEL_MIGRATION_MODE" "$database_arg"
328365
else
329-
php "$AUTORUN_LIB_DIR/laravel/test-db-connection.php" "$APP_BASE_DIR" "$AUTORUN_LARAVEL_MIGRATION_MODE" "$AUTORUN_LARAVEL_MIGRATION_ISOLATION"
366+
php "$AUTORUN_LIB_DIR/laravel/test-db-connection.php" "$APP_BASE_DIR" "$AUTORUN_LARAVEL_MIGRATION_MODE"
330367
fi
331368
}
332369

src/common/etc/entrypoint.d/lib/laravel/test-db-connection.php

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@
55
* This script tests if the Laravel application can connect to its configured database.
66
* It's designed to be called from shell scripts during container initialization.
77
*
8-
* Usage: php test-db-connection.php /path/to/app/base/dir [migration_mode] [migration_isolation] [database_connection]
8+
* Usage: php test-db-connection.php /path/to/app/base/dir [migration_mode] [database_connection]
99
*
1010
* Arguments:
11-
* app_base_dir - Path to Laravel application root
12-
* migration_mode - Migration mode: 'default', 'fresh', or 'refresh' (optional, defaults to 'default')
13-
* migration_isolation - Whether to run migrations in isolation (optional, defaults to 'false')
11+
* app_base_dir - Path to Laravel application root
12+
* migration_mode - Migration mode: 'default', 'fresh', or 'refresh' (optional, defaults to 'default')
1413
* database_connection - Name of the database connection to test (optional, defaults to 'default')
1514
*
1615
* Exit codes:
@@ -21,15 +20,14 @@
2120
*/
2221

2322
// Validate arguments
24-
if ($argc < 2 || $argc > 5) {
25-
fwrite(STDERR, "Usage: php test-db-connection.php /path/to/app/base/dir [migration_mode] [migration_isolation] [database_connection]\n");
23+
if ($argc < 2 || $argc > 4) {
24+
fwrite(STDERR, "Usage: php test-db-connection.php /path/to/app/base/dir [migration_mode] [database_connection]\n");
2625
exit(1);
2726
}
2827

2928
$appBaseDir = $argv[1];
3029
$migrationMode = $argc >= 3 ? $argv[2] : 'default';
31-
$migrationIsolation = $argc >= 4 ? $argv[3] : 'false';
32-
$databaseConnection = $argc >= 5 ? $argv[4] : null;
30+
$databaseConnection = $argc >= 4 ? $argv[3] : null;
3331

3432
// Validate migration mode
3533
$validModes = ['default', 'fresh', 'refresh'];
@@ -38,13 +36,6 @@
3836
exit(1);
3937
}
4038

41-
// Validate migration isolation
42-
$validIsolations = ['true', 'false'];
43-
if (!in_array($migrationIsolation, $validIsolations)) {
44-
fwrite(STDERR, "Error: Invalid migration isolation '{$migrationIsolation}'. Must be one of: " . implode(', ', $validIsolations) . "\n");
45-
exit(1);
46-
}
47-
4839
// Validate that the app base directory exists
4940
if (!is_dir($appBaseDir)) {
5041
fwrite(STDERR, "Error: App base directory does not exist: {$appBaseDir}\n");
@@ -126,17 +117,7 @@
126117
exit(1);
127118
}
128119

129-
// For isolated migrations, the database file must exist (even in default mode)
130-
if ($migrationIsolation === 'true') {
131-
fwrite(STDERR, "SQLite database file does not exist: {$dbPath}\n");
132-
fwrite(STDERR, "Isolated migrations require the database file to exist before running.\n");
133-
fwrite(STDERR, "Either:\n");
134-
fwrite(STDERR, " 1. Create the database (ensure it has read and write permissions for your user): touch {$dbPath}\n");
135-
fwrite(STDERR, " 2. Set AUTORUN_LARAVEL_MIGRATION_ISOLATION=false to let migrations create it\n");
136-
exit(1);
137-
}
138-
139-
// Directory exists and is writable - migrations can create the database file (default mode only)
120+
// Directory exists and is writable - migrations can create the database file
140121
fwrite(STDOUT, "SQLite database directory is ready - migrations will create database\n");
141122
exit(0);
142123
}

0 commit comments

Comments
 (0)