This document describes the automated database migration pipeline for Brain-Storm.
The CI/CD pipeline automatically validates, tests, and reports on database migrations to ensure safe and reliable schema changes.
- File Structure: Ensures all migrations have
up()anddown()methods - Naming Convention: Validates timestamp-based naming (e.g.,
1234567890123-Description.ts) - Ordering: Checks that migrations are in chronological order
- Duplicates: Detects duplicate timestamps
- Runs migrations on a test PostgreSQL database
- Verifies all migrations execute successfully
- Tests rollback functionality
- Ensures no data loss during migration
- Generates comprehensive migration reports
- Lists all migration files with timestamps
- Comments on PRs with migration status
- Tracks migration history
The migration CI/CD pipeline runs automatically when:
- Pull requests modify files in
apps/backend/src/migrations/ - Pull requests modify files in
apps/backend/src/entities/ - Code is pushed to
mainbranch with migration changes
cd apps/backend
npm run migration:generate -- src/migrations/AddNewFeaturecat src/migrations/1234567890123-AddNewFeature.tsnpm run migration:run
npm run migration:rollbackgit add src/migrations/
git commit -m "feat: add new feature migration"
git pushThe CI/CD pipeline will automatically validate and test your migration.
Each migration should handle a single logical change:
// ✅ Good: Single concern
export class AddUserEmailColumn1234567890123 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.addColumn('users', new TableColumn({
name: 'email',
type: 'varchar',
isUnique: true,
}));
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumn('users', 'email');
}
}Ensure rollback capability:
// ✅ Good: Complete rollback
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumn('users', 'email');
}
// ❌ Bad: Incomplete rollback
public async down(queryRunner: QueryRunner): Promise<void> {
// Empty or incomplete
}Migrations automatically run in transactions for safety:
// ✅ Good: Transactional
export class MyMigration1234567890123 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
// All operations are transactional
await queryRunner.addColumn(...);
await queryRunner.createIndex(...);
}
}For data migrations, include validation:
export class MigrateUserData1234567890123 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
// Validate data before migration
const count = await queryRunner.query('SELECT COUNT(*) FROM users');
console.log(`Migrating ${count[0].count} users...`);
// Perform migration
await queryRunner.query('UPDATE users SET status = ? WHERE status IS NULL', ['active']);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query('UPDATE users SET status = NULL WHERE status = ?', ['active']);
}
}Issue: "Invalid naming convention"
❌ Invalid naming convention: AddUserTable.ts
Expected format: TIMESTAMP-Description.ts
Solution: Rename file to include timestamp:
mv src/migrations/AddUserTable.ts src/migrations/1234567890123-AddUserTable.tsIssue: "Migration failed on test database"
Solution:
- Check migration syntax for SQL errors
- Verify column/table names exist
- Test locally first:
npm run migration:run npm run migration:rollback
Issue: "Rollback test failed"
Solution: Ensure down() method properly reverses up():
// ✅ Correct: Mirrors up() exactly
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumn('users', 'email');
}- All migrations pass CI/CD validation
- Dry-run tests pass on test database
- Rollback tested and verified
- Database backup created
- Deployment window scheduled
- Team notified
- Deploy new code with migrations
- Run migrations on production:
npm run migration:run
- Verify application functionality
- Monitor logs for errors
- Keep rollback plan ready
If issues occur:
npm run migration:rollback
# Repeat as needed to revert multiple migrationsThe CI/CD pipeline provides:
- ✅ Automatic validation on every PR
- ✅ Test database dry-run verification
- ✅ PR comments with migration status
- ✅ Detailed migration reports
- ✅ Rollback testing