Skip to content
This repository has been archived by the owner on Apr 2, 2024. It is now read-only.

Commit

Permalink
Change idempotent behavior for dev releases.
Browse files Browse the repository at this point in the history
On dev versions idempotent scripts always re-run since
we don't bump versions for idempotent changes.

Also add tests for development on dev versions.
  • Loading branch information
cevian committed Aug 7, 2020
1 parent 299f2be commit f1bb971
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 3 deletions.
39 changes: 38 additions & 1 deletion pkg/pgmodel/end_to_end_tests/migrate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,16 @@ func TestMigrationLib(t *testing.T) {
"migration 0.10.0=2",
"idempotent 1",
"idempotent 2",
"idempotent 1",
"idempotent 2",
"idempotent 1",
"idempotent 2",
"migration 0.10.1=1",
"idempotent 1",
"idempotent 2",
"migration 0.10.1=2",
"idempotent 1",
"idempotent 2",
}

mig := pgmodel.NewMigrator(db, test_migrations.MigrationFiles, testTOC)
Expand All @@ -126,7 +136,7 @@ func TestMigrationLib(t *testing.T) {
}
verifyLogs(t, db, expected[0:6])

//does nothing
//does nothing, since non-dev and same version as before
err = mig.Migrate(semver.MustParse("0.2.0"))
if err != nil {
t.Fatal(err)
Expand All @@ -153,5 +163,32 @@ func TestMigrationLib(t *testing.T) {
t.Fatal(err)
}
verifyLogs(t, db, expected[0:13])

//upgrading version, idempotent files apply
err = mig.Migrate(semver.MustParse("0.10.1-dev"))
if err != nil {
t.Fatal(err)
}
verifyLogs(t, db, expected[0:15])

//even if no version upgrades, idempotent files apply if it's a dev version
err = mig.Migrate(semver.MustParse("0.10.1-dev"))
if err != nil {
t.Fatal(err)
}
verifyLogs(t, db, expected[0:17])

//now test logic within a release:
err = mig.Migrate(semver.MustParse("0.10.1-dev.1"))
if err != nil {
t.Fatal(err)
}
verifyLogs(t, db, expected[0:20])

err = mig.Migrate(semver.MustParse("0.10.1-dev.2"))
if err != nil {
t.Fatal(err)
}
verifyLogs(t, db, expected[0:23])
})
}
28 changes: 26 additions & 2 deletions pkg/pgmodel/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,32 @@ func (t *Migrator) Migrate(appVersion semver.Version) error {
return fmt.Errorf("failed to get the version from database: %w", err)
}

// If already at correct version, nothing to migrate.
// If already at correct version, nothing to migrate on proper release.
// On dev versions, idempotent files need to be reapplied.
if dbVersion.Compare(appVersion) == 0 {
devRelease := false
for _, pre := range appVersion.Pre {
if pre.String() == "dev" {
devRelease = true
}
}

if devRelease {
tx, err := t.db.Begin(context.Background())
if err != nil {
return fmt.Errorf("unable to start transaction: %w", err)
}
defer func() {
_ = tx.Rollback(context.Background())
}()
if err = t.execMigrationFiles(tx, idempotentScripts); err != nil {
return err
}
if err = tx.Commit(context.Background()); err != nil {
return fmt.Errorf("unable to commit migration transaction: %w", err)
}
return nil
}
return nil
}

Expand Down Expand Up @@ -414,7 +438,7 @@ func (t *Migrator) upgradeVersion(tx pgx.Tx, from, to semver.Version) error {

for _, v := range versions {
//When comparing to the latest version use >= (INCLUSIVE). A migration file
//that's marked as version X is part of that version.
//that's marked as version X is part of that version
if from.Compare(v) < 0 && to.Compare(v) >= 0 {
filename := versionMap[v.String()]
if err = t.execMigrationFile(tx, filename); err != nil {
Expand Down
19 changes: 19 additions & 0 deletions pkg/pgmodel/test_migrations/migration_files_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit f1bb971

Please sign in to comment.