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
77 changes: 56 additions & 21 deletions src/common/etc/entrypoint.d/50-laravel-automations.sh
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,6 @@ fi
############################################################################

artisan_migrate() {
migrate_flags=""

debug_log "Starting migrations (isolation: $AUTORUN_LARAVEL_MIGRATION_ISOLATION)"

echo "🚀 Clearing Laravel cache before attempting migrations..."
php "$APP_BASE_DIR/artisan" config:clear

Expand All @@ -73,7 +69,8 @@ artisan_migrate() {
;;
esac

# Build migration flags (used for all databases)
# Determine if isolation is intended to be used
isolation_enabled="false"
if [ "$AUTORUN_LARAVEL_MIGRATION_ISOLATION" = "true" ]; then
# Isolation only works in default mode
if [ "$AUTORUN_LARAVEL_MIGRATION_MODE" != "default" ]; then
Expand All @@ -87,9 +84,12 @@ artisan_migrate() {
return 1
fi

migrate_flags="$migrate_flags --isolated"
isolation_enabled="true"
fi

# Start assembling migration flags
migrate_flags=""

if [ "$AUTORUN_LARAVEL_MIGRATION_FORCE" = "true" ]; then
migrate_flags="$migrate_flags --force"
fi
Expand All @@ -98,30 +98,55 @@ artisan_migrate() {
migrate_flags="$migrate_flags --seed"
fi

# Determine if multiple databases are specified
# Helper function to run migrations for a specific database
run_migration_for_db() {
db_name="${1:-}"

# Build display name and database flag for messages/commands
if [ -n "$db_name" ]; then
db_display_name="'$db_name'"
db_flag="--database=$db_name"
else
db_display_name="default database"
db_flag=""
fi

# Wait for database connection
if ! wait_for_database_connection $db_name; then
echo "❌ $script_name: Failed to connect to $db_display_name"
return 1
fi

# Determine if --isolated can be used for this database
db_migrate_flags="$migrate_flags"
if [ "$isolation_enabled" = "true" ]; then
if db_has_migrations_table $db_name; then
db_migrate_flags="$db_migrate_flags --isolated"
debug_log "Using --isolated flag for $db_display_name"
else
echo "ℹ️ Skipping --isolated flag for $db_display_name: migrations table not ready (normal for first deployment)"
echo " The --isolated flag will be used on subsequent deployments."
fi
fi

echo "🚀 Running migrations for $db_display_name"
php "$APP_BASE_DIR/artisan" $migration_command $db_flag $db_migrate_flags
}

# Run migrations for specified database(s)
if [ -n "$AUTORUN_LARAVEL_MIGRATION_DATABASE" ]; then
databases=$(convert_comma_delimited_to_space_separated "$AUTORUN_LARAVEL_MIGRATION_DATABASE")
database_list=$(echo "$databases" | tr ',' ' ')

for db in $database_list; do
# Wait for this specific database to be ready
if ! wait_for_database_connection "$db"; then
echo "❌ $script_name: Failed to connect to database: $db"
if ! run_migration_for_db "$db"; then
return 1
fi

echo "🚀 Running migrations for database: $db"
php "$APP_BASE_DIR/artisan" $migration_command --database=$db $migrate_flags
done
else
# Wait for default database connection
if ! wait_for_database_connection; then
echo "❌ $script_name: Failed to connect to default database"
if ! run_migration_for_db; then
return 1
fi

# Run migration with default database connection
php "$APP_BASE_DIR/artisan" $migration_command $migrate_flags
fi
}

Expand Down Expand Up @@ -316,6 +341,16 @@ laravel_version_is_at_least() {
fi
}

db_has_migrations_table() {
database_arg="${1:-}"

if [ -n "$database_arg" ]; then
php "$APP_BASE_DIR/artisan" migrate:status --database="$database_arg" > /dev/null 2>&1
else
php "$APP_BASE_DIR/artisan" migrate:status > /dev/null 2>&1
fi
}

test_db_connection() {
if [ "$AUTORUN_LARAVEL_MIGRATION_SKIP_DB_CHECK" = "true" ]; then
return 0
Expand All @@ -324,9 +359,9 @@ test_db_connection() {
# Pass database connection name only if specified (not empty)
database_arg="${1:-}"
if [ -n "$database_arg" ]; then
php "$AUTORUN_LIB_DIR/laravel/test-db-connection.php" "$APP_BASE_DIR" "$AUTORUN_LARAVEL_MIGRATION_MODE" "$AUTORUN_LARAVEL_MIGRATION_ISOLATION" "$database_arg"
php "$AUTORUN_LIB_DIR/laravel/test-db-connection.php" "$APP_BASE_DIR" "$AUTORUN_LARAVEL_MIGRATION_MODE" "$database_arg"
else
php "$AUTORUN_LIB_DIR/laravel/test-db-connection.php" "$APP_BASE_DIR" "$AUTORUN_LARAVEL_MIGRATION_MODE" "$AUTORUN_LARAVEL_MIGRATION_ISOLATION"
php "$AUTORUN_LIB_DIR/laravel/test-db-connection.php" "$APP_BASE_DIR" "$AUTORUN_LARAVEL_MIGRATION_MODE"
fi
}

Expand Down
33 changes: 7 additions & 26 deletions src/common/etc/entrypoint.d/lib/laravel/test-db-connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@
* This script tests if the Laravel application can connect to its configured database.
* It's designed to be called from shell scripts during container initialization.
*
* Usage: php test-db-connection.php /path/to/app/base/dir [migration_mode] [migration_isolation] [database_connection]
* Usage: php test-db-connection.php /path/to/app/base/dir [migration_mode] [database_connection]
*
* Arguments:
* app_base_dir - Path to Laravel application root
* migration_mode - Migration mode: 'default', 'fresh', or 'refresh' (optional, defaults to 'default')
* migration_isolation - Whether to run migrations in isolation (optional, defaults to 'false')
* app_base_dir - Path to Laravel application root
* migration_mode - Migration mode: 'default', 'fresh', or 'refresh' (optional, defaults to 'default')
* database_connection - Name of the database connection to test (optional, defaults to 'default')
*
* Exit codes:
Expand All @@ -21,15 +20,14 @@
*/

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

$appBaseDir = $argv[1];
$migrationMode = $argc >= 3 ? $argv[2] : 'default';
$migrationIsolation = $argc >= 4 ? $argv[3] : 'false';
$databaseConnection = $argc >= 5 ? $argv[4] : null;
$databaseConnection = $argc >= 4 ? $argv[3] : null;

// Validate migration mode
$validModes = ['default', 'fresh', 'refresh'];
Expand All @@ -38,13 +36,6 @@
exit(1);
}

// Validate migration isolation
$validIsolations = ['true', 'false'];
if (!in_array($migrationIsolation, $validIsolations)) {
fwrite(STDERR, "Error: Invalid migration isolation '{$migrationIsolation}'. Must be one of: " . implode(', ', $validIsolations) . "\n");
exit(1);
}

// Validate that the app base directory exists
if (!is_dir($appBaseDir)) {
fwrite(STDERR, "Error: App base directory does not exist: {$appBaseDir}\n");
Expand Down Expand Up @@ -126,17 +117,7 @@
exit(1);
}

// For isolated migrations, the database file must exist (even in default mode)
if ($migrationIsolation === 'true') {
fwrite(STDERR, "SQLite database file does not exist: {$dbPath}\n");
fwrite(STDERR, "Isolated migrations require the database file to exist before running.\n");
fwrite(STDERR, "Either:\n");
fwrite(STDERR, " 1. Create the database (ensure it has read and write permissions for your user): touch {$dbPath}\n");
fwrite(STDERR, " 2. Set AUTORUN_LARAVEL_MIGRATION_ISOLATION=false to let migrations create it\n");
exit(1);
}

// Directory exists and is writable - migrations can create the database file (default mode only)
// Directory exists and is writable - migrations can create the database file
fwrite(STDOUT, "SQLite database directory is ready - migrations will create database\n");
exit(0);
}
Expand Down