mirror of
https://github.com/coder/coder.git
synced 2025-07-15 22:20:27 +00:00
feat: run all migrations in a transaction (#10966)
Updates coder/customers#365 This PR updates our migration framework to run all migrations in a single transaction. This is the same behavior we had in v1 and ensures that failed migrations don't bring the whole deployment down. If a migration fails now, it will automatically be rolled back to the previous version, allowing the deployment to continue functioning.
This commit is contained in:
@ -7,6 +7,34 @@
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
cat <<EOF
|
||||
|
||||
WARNING: Migrations now all run in a single transaction. This makes upgrades
|
||||
safer, but means that 'ALTER TYPE resource_type ADD VALUE' cannot be used if the
|
||||
enum value needs to be referenced in another migration.
|
||||
|
||||
This also means you should not use "BEGIN;" and "COMMIT;" in your migrations, as
|
||||
everything is already in a migration.
|
||||
|
||||
An example way of the proper way to add an enum value:
|
||||
|
||||
CREATE TYPE new_logintype AS ENUM (
|
||||
'password',
|
||||
'github',
|
||||
'oidc',
|
||||
'token' -- this is our new value
|
||||
);
|
||||
|
||||
ALTER TABLE users
|
||||
ALTER COLUMN login_type DROP DEFAULT, -- if the column has a default, it must be dropped first
|
||||
ALTER COLUMN login_type TYPE new_logintype USING (login_type::text::new_logintype), -- converts the old enum until the new enum using text as an intermediary
|
||||
ALTER COLUMN login_type SET DEFAULT 'password'::new_logintype; -- re-add the default using the new enum
|
||||
|
||||
DROP TYPE login_type;
|
||||
ALTER TYPE new_logintype RENAME TO login_type;
|
||||
|
||||
EOF
|
||||
|
||||
SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}")
|
||||
(
|
||||
cd "$SCRIPT_DIR"
|
||||
|
Reference in New Issue
Block a user