From 0d463ca467d30e7c839d3ced4e1c548a71639673 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 31 Jan 2022 15:50:10 +0100 Subject: [PATCH] Let non required migration tasks fail and continue (#729) --- .../datastore/migration/000_legacy_to_xorm.go | 3 ++- server/store/datastore/migration/migration.go | 25 +++++++++++-------- .../datastore/migration/migration_test.go | 5 ++++ 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/server/store/datastore/migration/000_legacy_to_xorm.go b/server/store/datastore/migration/000_legacy_to_xorm.go index db747f749..0f78f8ccf 100644 --- a/server/store/datastore/migration/000_legacy_to_xorm.go +++ b/server/store/datastore/migration/000_legacy_to_xorm.go @@ -23,7 +23,8 @@ import ( ) var legacy2Xorm = task{ - name: "xorm", + name: "xorm", + required: true, fn: func(sess *xorm.Session) error { // make sure we have required migrations - else fail and point to last major version for _, mig := range []string{ diff --git a/server/store/datastore/migration/migration.go b/server/store/datastore/migration/migration.go index 7f1422b18..5e78926b4 100644 --- a/server/store/datastore/migration/migration.go +++ b/server/store/datastore/migration/migration.go @@ -26,12 +26,12 @@ import ( // APPEND NEW MIGRATIONS // they are executed in order and if one fail woodpecker try to rollback and quit -var migrationTasks = []task{ - legacy2Xorm, - alterTableReposDropFallback, - alterTableReposDropAllowDeploysAllowTags, - fixPRSecretEventName, - alterTableReposDropCounter, +var migrationTasks = []*task{ + &legacy2Xorm, + &alterTableReposDropFallback, + &alterTableReposDropAllowDeploysAllowTags, + &fixPRSecretEventName, + &alterTableReposDropCounter, } var allBeans = []interface{}{ @@ -56,8 +56,9 @@ type migrations struct { } type task struct { - name string - fn func(sess *xorm.Session) error + name string + required bool + fn func(sess *xorm.Session) error } // initNew create tables for new instance @@ -111,7 +112,7 @@ func Migrate(e *xorm.Engine) error { return syncAll(e) } -func runTasks(sess *xorm.Session, tasks []task) error { +func runTasks(sess *xorm.Session, tasks []*task) error { // cache migrations in db migCache := make(map[string]bool) var migList []*migrations @@ -132,7 +133,11 @@ func runTasks(sess *xorm.Session, tasks []task) error { if task.fn != nil { if err := task.fn(sess); err != nil { - return err + if task.required { + return err + } + log.Error().Err(err).Msgf("migration task '%s' failed but is not required", task.name) + continue } log.Info().Msgf("migration task '%s' done", task.name) } else { diff --git a/server/store/datastore/migration/migration_test.go b/server/store/datastore/migration/migration_test.go index 1502a2680..6fffaba43 100644 --- a/server/store/datastore/migration/migration_test.go +++ b/server/store/datastore/migration/migration_test.go @@ -81,6 +81,11 @@ func testDB(t *testing.T, new bool) (engine *xorm.Engine, close func()) { } func TestMigrate(t *testing.T) { + // make all tasks required for tests + for _, task := range migrationTasks { + task.required = true + } + // init new db engine, close := testDB(t, true) assert.NoError(t, Migrate(engine))