{"id":20645018,"url":"https://github.com/romanow/database-migration","last_synced_at":"2026-02-12T06:31:52.468Z","repository":{"id":209161632,"uuid":"722711602","full_name":"Romanow/database-migration","owner":"Romanow","description":"Demo application for automatic database migration and rollback process using k8s","archived":false,"fork":false,"pushed_at":"2024-12-02T12:29:30.000Z","size":162655,"stargazers_count":2,"open_issues_count":5,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-06T02:51:41.483Z","etag":null,"topics":["database-migrations","liquibase","spring-boot"],"latest_commit_sha":null,"homepage":"https://romanow.github.io/database-migration/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Romanow.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-11-23T19:02:04.000Z","updated_at":"2024-09-19T07:58:54.000Z","dependencies_parsed_at":"2023-12-12T21:30:56.589Z","dependency_job_id":"f7b6165c-43d0-40a0-b705-8928de9c0fe7","html_url":"https://github.com/Romanow/database-migration","commit_stats":null,"previous_names":["romanow/database-migration"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Romanow/database-migration","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fdatabase-migration","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fdatabase-migration/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fdatabase-migration/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fdatabase-migration/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Romanow","download_url":"https://codeload.github.com/Romanow/database-migration/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fdatabase-migration/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29360644,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T01:03:07.613Z","status":"online","status_checked_at":"2026-02-12T02:00:06.911Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database-migrations","liquibase","spring-boot"],"created_at":"2024-11-16T16:18:25.336Z","updated_at":"2026-02-12T06:31:52.448Z","avatar_url":"https://github.com/Romanow.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build project](https://github.com/Romanow/database-migration/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/Romanow/database-migration/actions/workflows/build.yml)\n[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit)\n\n# Database migration\n\n## Реализация\n\n1. Собрать образ liquibase и запускать как `initContainer`.\n2. При откате использовать последнюю версию и помимо `helm rollback \u003crelease\u003e`, запускать job для отката до\n   тега `liquibase rollback --tag=$ROLLBACK_TAG`.\n\n```shell\n$ docker run --rm \\\n    --network database-migration \\\n    romanowalex/liquibase-container:latest \\\n    rollback --tag=v3.0 \\\n    --url=jdbc:postgresql://postgres:5432/migration \\\n    --username=program \\\n    --password=test\n```\n\n### Прямые и обратные операции\n\n|                         Операция                          |                                 Revert                                 |\n|:---------------------------------------------------------:|:----------------------------------------------------------------------:|\n| `CREATE TABLE (VIEW, INDEX, FUNCTION, TRIGGER, SEQUENCE)` |                                 `DROP`                                 |\n|                       `ADD COLUMN `                       |                             `DROP COLUMN`                              |\n|                      `ALTER COLUMN `                      |                             `ALTER COLUMN`                             |\n|                   `ADD CONSTRAINT ...`                    |                           `DROP CONSTRAINT`                            |\n|                 `ALTER ... RENAME TO ...`                 |                       `ALTER ... RENAME TO ...`                        |\n|     `DROP TABLE (VIEW, FUNCTION, TRIGGER, SEQUENCE)`      |                                `CREATE`                                |\n|                 `DROP COLUMN (NOT NULL)`                  |      `ADD COLUMN, UPDATE ... SET ..., ALTER COLUMN SET NOT NULL`       |\n|                     `DROP CONSTRAINT`                     | `DELETE ...` (records, which not meet constraint), `CREATE CONSTRAINT` |\n|                         `INSERT`                          |       `DELETE` (can leave unmodified, if doesn't affect process)       |\n|                         `UPDATE`                          |       `UPDATE` (can leave unmodified, if doesn't affect process)       |\n|                   `DELETE`, `TRUNCATE`                    |                         `INSERT` (if possible)                         |\n\n### Тестовые данные\n\n#### Запрос на получение версии сервиса\n\n**Request**\n\n```http request\nGET http://localhost:8080/api/v1/version\n```\n\n**Response**\n\n```json\n{\n  \"version\": \"${git.build.version}\",\n  \"commit\": \"${git.commit.id.abbrev}\",\n  \"time\": \"${git.commit.time}\"\n}\n```\n\n#### Запрос на получение данных из БД\n\n**Request**\n\n```http request\nGET http://localhost:8080/api/v1/users\n```\n\n**Response**\n\n```json\n[\n  {\n    \"name\": \"${user.name}\",\n    \"status\": \"${user.status}\",\n    \"location\": \"${user.location}\"\n  }\n]\n```\n\n#### Миграции\n\n1. [Миграция v1.0: Создание таблицы users](src/main/resources/db/liquibase/changelog/v1.0_CreateUserTable.xml)\n2. [Миграция v2.0: Изменение поля id на тип IDENTITY](src/main/resources/db/liquibase/changelog/v2.0_ChangeIdToIdentity.xml)\n3. [Миграция v3.0: Создание таблицы address и перенесение данных из поля location](src/main/resources/db/liquibase/changelog/v3.0_CreateAddressTable.xml)\n4. [Миграция v4.0: Изменение типа колонки status на enum](src/main/resources/db/liquibase/changelog/v4.0_ChangeStatusToEnum.xml)\n5. [Миграция v5.0: Партиционирование таблицы users](src/main/resources/db/liquibase/changelog/v5.0_MigrateUsersToPartitions.xml)\n6. [Миграция v6.0: Увеличение поля login до 80 символов и добавление новых пользователей](src/main/resources/db/liquibase/changelog/v6.0_EnlargeLoginFieldSize.xml)\n\n## Тестирование в кластере k8s\n\n```shell\n# create local cluster\n$ kind create cluster --config kind.yml\n$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml\n\n# install required repos\n$ helm repo add romanow https://romanow.github.io/helm-charts/\n$ helm repo update\n\n# install postgres\n$ helm install postgres romanow/postgres --values postgres/values.yaml\n\n# install service\n$ helm upgrade \\\n    migration-application \\\n    romanow/java-service \\\n    --values=k8s/migration-application/values.yaml \\\n    --set image.tag=\"$IMAGE_VERSION\" \\\n    --set ingress.name=k8s \\\n    --set ingress.domain=romanow-alex.ru \\\n    --description \"$IMAGE_VERSION\" \\\n    --install \\\n    --wait\n\n# rollback migration\n$ helm install \\\n    --generate-name \\\n    romanow/common-job \\\n    --values=k8s/rollback-job/values.yaml \\\n    --set rollbackTag=\"$VERSION\" \\\n    --wait\n\n# rollback revision\n$ helm rollback migration-application \"$REVISION\" --wait\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromanow%2Fdatabase-migration","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fromanow%2Fdatabase-migration","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromanow%2Fdatabase-migration/lists"}