diff --git a/build/cicd/README.md b/build/cicd/README.md index c0c5510..db7ddc1 100644 --- a/build/cicd/README.md +++ b/build/cicd/README.md @@ -377,10 +377,10 @@ Access/Secret Keys are required --dry-run print out the deploy details ``` -* `schema` - Runs the database migration using credentials from AWS Secrets Manager. +* `schema migrate` - Runs the database migration using credentials from AWS Secrets Manager. ```bash - $ cicd -env [dev|stage|prod] schema + $ cicd -env [dev|stage|prod] schema migrate ``` * `help` - Shows a list of commands @@ -398,12 +398,12 @@ Access/Secret Keys are required Build the example service _web-app_ ```bash -$ cicid --env=dev build service --name=web-app --release-tag=testv1 --dry-run=false +$ cicid --env=prod build service --name=web-app --release-tag=testv1 --dry-run=false ``` Deploy the example service _web-app_ ```bash -$ cicid --env=dev deploy service --name=web-app --release-tag=testv1 --dry-run=false +$ cicid --env=prod deploy service --name=web-app --release-tag=testv1 --dry-run=false ``` diff --git a/go.mod b/go.mod index 88ff7d7..a8e7871 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/tinylib/msgp v1.1.0 // indirect github.com/urfave/cli v1.21.0 github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 - gitlab.com/geeks-accelerator/oss/devops v1.0.2 + gitlab.com/geeks-accelerator/oss/devops v1.0.3 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 // indirect diff --git a/go.sum b/go.sum index 5848f0e..87fb34c 100644 --- a/go.sum +++ b/go.sum @@ -201,6 +201,8 @@ github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 h1:zzrxE1FKn5ryB github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY= gitlab.com/geeks-accelerator/oss/devops v1.0.2 h1:LqME1zTc9bgB+J/tw7tv1WDjvgmrgl2OZdKcRToleqg= gitlab.com/geeks-accelerator/oss/devops v1.0.2/go.mod h1:rvI71qNJyNiO99ZgGnv/PmJCVrjJjupsXBmfYFXdjGM= +gitlab.com/geeks-accelerator/oss/devops v1.0.3 h1:SE2ZD4Csvmm3t/50RoJkVLjDcwXKHayQYawSkpOSqIw= +gitlab.com/geeks-accelerator/oss/devops v1.0.3/go.mod h1:rvI71qNJyNiO99ZgGnv/PmJCVrjJjupsXBmfYFXdjGM= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= diff --git a/internal/schema/migrations.go b/internal/schema/migrations.go index c37ef5a..3e5c40a 100644 --- a/internal/schema/migrations.go +++ b/internal/schema/migrations.go @@ -26,7 +26,7 @@ func migrationList(ctx context.Context, db *sqlx.DB, log *log.Logger, isUnittest return []*sqlxmigrate.Migration{ // Create table users. { - ID: "20190522-01a", + ID: "20190522-01b", Migrate: func(tx *sql.Tx) error { q1 := `CREATE TABLE IF NOT EXISTS users ( id char(36) NOT NULL, @@ -57,10 +57,10 @@ func migrationList(ctx context.Context, db *sqlx.DB, log *log.Logger, isUnittest }, // Create new table accounts. { - ID: "20190522-01b", + ID: "20190522-01c", Migrate: func(tx *sql.Tx) error { q1 := `CREATE TYPE account_status_t as enum('active','pending','disabled')` - if _, err := tx.Exec(q1); err != nil { + if _, err := tx.Exec(q1); err != nil && !errorIsAlreadyExists(err) { return errors.WithMessagef(err, "Query failed %s", q1) } @@ -103,15 +103,15 @@ func migrationList(ctx context.Context, db *sqlx.DB, log *log.Logger, isUnittest }, // Create new table user_accounts. { - ID: "20190522-01d", + ID: "20190522-01e", Migrate: func(tx *sql.Tx) error { q1 := `CREATE TYPE user_account_role_t as enum('admin', 'user')` - if _, err := tx.Exec(q1); err != nil { + if _, err := tx.Exec(q1); err != nil && !errorIsAlreadyExists(err) { return errors.WithMessagef(err, "Query failed %s", q1) } q2 := `CREATE TYPE user_account_status_t as enum('active', 'invited','disabled')` - if _, err := tx.Exec(q2); err != nil { + if _, err := tx.Exec(q2); err != nil && !errorIsAlreadyExists(err) { return errors.WithMessagef(err, "Query failed %s", q2) } @@ -157,7 +157,7 @@ func migrationList(ctx context.Context, db *sqlx.DB, log *log.Logger, isUnittest ID: "20190622-01", Migrate: func(tx *sql.Tx) error { q1 := `CREATE TYPE project_status_t as enum('active','disabled')` - if _, err := tx.Exec(q1); err != nil { + if _, err := tx.Exec(q1); err != nil && !errorIsAlreadyExists(err) { return errors.WithMessagef(err, "Query failed %s", q1) } @@ -178,12 +178,12 @@ func migrationList(ctx context.Context, db *sqlx.DB, log *log.Logger, isUnittest }, Rollback: func(tx *sql.Tx) error { q1 := `DROP TYPE project_status_t` - if _, err := tx.Exec(q1); err != nil { + if _, err := tx.Exec(q1); err != nil && !errorIsAlreadyExists(err) { return errors.WithMessagef(err, "Query failed %s", q1) } q2 := `DROP TABLE IF EXISTS projects` - if _, err := tx.Exec(q2); err != nil { + if _, err := tx.Exec(q2); err != nil && !errorIsAlreadyExists(err) { return errors.WithMessagef(err, "Query failed %s", q2) } return nil @@ -668,3 +668,11 @@ func migrationList(ctx context.Context, db *sqlx.DB, log *log.Logger, isUnittest }, } } + +// errorIsAlreadyExists checks an error message for the error "already exists" +func errorIsAlreadyExists(err error) bool { + if strings.Contains(err.Error(), "already exists") { + return true + } + return false +} \ No newline at end of file diff --git a/tools/schema/main.go b/tools/schema/main.go index b2f9a64..131b452 100644 --- a/tools/schema/main.go +++ b/tools/schema/main.go @@ -7,7 +7,6 @@ import ( "net/url" "os" "strings" - "time" "geeks-accelerator/oss/saas-starter-kit/internal/platform/web/webcontext" "geeks-accelerator/oss/saas-starter-kit/internal/schema" @@ -163,7 +162,7 @@ func runMigrate(log *log.Logger, targetEnv string, dbInfo DB) error { ctx := context.Background() // Execute the migrations - if err = schema.Migrate(ctx, env, masterDb, log, false); err != nil { + if err = schema.Migrate(ctx, targetEnv, masterDb, log, false); err != nil { return err }