Hacker News new | ask | show | jobs
by ccmcarey 1899 days ago
Great writeup.

How do you handle database migrations when using an otherwise automated CI/CD flow with gradual deployment?

3 comments

You could probably do something like (for django):

  python manage.py migrate
on pod startup. If there are no changes, it'll do nothing. If there are changes, it'll do the migration.
Yeah, it's basically this. I'm running this as an initContainer for my K8s-based deployments. Took me a bit to get everything going, but my stack is pretty much similar to OP's article, although not quite as advanced in the automated-deployment of containers and monitoring. I'm not at a position where usage needs heavy monitoring because I'm still in the pre-launch phase of things and I'm using this side project to learn stuff I've yet to get experience with at multiple companies.
You can use any normal DB migration tool. For k8s, I put the app's readiness probe to false, run the migrations and then toggle the probe back to true.

Here are some migration libraries:

Go - https://github.com/golang-migrate/migrate

Node - https://github.com/salsita/node-pg-migrate

I wonder what happens during blue green or canary deployment? if your migration changes database schema in a way that affect previous version negatively?

is it even possible to do blue/green deploy if your schema changes radically?

It's definitely possible but we need to spend sometime to make sure the changes are backwards compatible and gradually rollout the destructive change.

Here's a really good guide on how to do this - https://docs.gitlab.com/ee/development/avoiding_downtime_in_...

thank you very much! this is a treasure find for me
It's fine if you make the changes backwards compatible a version. And in general, any change can be done in a backwards compatible way (although it can be a PITA)
He's using Django, so most likely Django Migrations which is built into that framework. If you're using Flask, you're probably using Alembic with SQLAlchemy. Those are the two main ways to handle schema migrations in Python.