Фотография JJ Ying на Неспособный
После Имея тестируемые инструменты Чтобы автоматизировать миграции базы данных, пришло время интегрировать выбранную с моим хранилищем Gitlab и создать конвейер непрерывной доставки для AWS.
Проектный стек
Вы можете проверить мою предыдущую историю о сравнении Flyway и Liquibase Здесь , но предупреждение о спойлере Эта реализация имеет следующий стек:
- Пролет Управление миграциями базы данных.
- База данных MySQL.
- Пролет Docker изображение.
- Gitlab ci/cd Анкет
- Amazon Web Services (AWS) Анкет
- Проверьте хранилище здесь Анкет
Процесс
- Gitlab CI создает изображение Docker Docker и подталкивает его к Amazon Реестр эластичных контейнеров (ECR).
- Gitlab CI запускает лямбду, которая управляет Amazon Упругая контейнерная служба (ECS) Задача с изображением Docker Docker от ECR.
- Команда пролета » Migrate » выполняется, и схема базы данных обновляется.
Изображение ниже иллюстрирует процесс.
Процесс непрерывной доставки
Гитлаб CI
A Демо -проект имеет папку DB-миграция/сценарии где расположены миграционные сценарии. Каждый раз, когда в этой папке в репозитории Gitlab будет выдвигаться изменение, трубопровод будет работать, создавать изображение Docker Docker со сценариями и выдвигать его в реестр эластичных контейнеров Amazon (ECR).
Кроме того, Gitlab CI запускает лямбду, которая вызывает задачу Amazon Elastic Container Service (ECS), которая будет запускать встроенное изображение.
Детали изображения находятся на Dockerfile ниже.
# Get image "flyway" from Flyway's repository FROM flyway/flyway WORKDIR /flyway # Database credentials COPY db-migrations/flyway.conf /flyway/conf # Add the scripts I've pushed to my project folder to the Docker image ADD db-migrations/scripts /flyway/sql # Execute the command migrate CMD [ "migrate" ]
Следующее .gitlab-ci.yml показывает действия Гитлаба. Проверьте этапы » build-docker-image » и »
stages: - build-docker-image - execute-migrations build-docker-image: stage: build-docker-image image: name: gcr.io/kaniko-project/executor:debug-v0.19.0 entrypoint: [""] script: - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/db-migrations/Dockerfile --destination $AWS_REPOS_FLYWAY:latest only: refs: -changes: - db-migrations/scripts/* execute-migrations: stage: execute-migrations image: python:3.8-alpine before_script: - apk add --no-cache python3 - python3 -m pip install awscli script: - aws lambda invoke --function-name MyLambdaToTriggerFlyway response.json only: refs: - changes: - db-migrations/scripts/*
Лямбда
Lambda не требуется строго: те же результаты могут быть достигнуты с помощью CLI.
Тем не менее, Lambda предлагает большую гибкость в процессе. Можно получить результаты выполнения, отправлять электронные письма, подавать таблицу базы данных с информацией для сбора статистики и всего остального, которое позволяет ваше воображение.
Кроме того, он поддерживает контроль инфраструктуры через код и его версии.
Lambda был написан в node.js 12.x, и я повторно использовал код i написал для другого теста Анкет Задача запускается в строке 47 с помощью команды » ecs.runtask (params) «.
/** * MyLambdaToTriggerFlyway * * This lambda relies on 3 environment variables: ENV_CLUSTER, ENV_SUBNET, ENV_SECURITY_GROUP. * */ var aws = require('aws-sdk'); var ecs = new aws.ECS(); exports.handler = async (event, context) => { var taskDefinition = null; var CLUSTER = process.env.ENV_CLUSTER; var SUBNET = process.env.ENV_SUBNET.split(","); var SECURITY_GROUP = process.env.ENV_SECURITY_GROUP; var LAUNCH_TYPE = "FARGATE"; var FAMILY_PREFIX = "flyway"; var CONTAINER_NAME = "flyway"; var taskParams = { familyPrefix: FAMILY_PREFIX }; const listTaskDefinitionsResult = await ecs.listTaskDefinitions(taskParams).promise(); if(listTaskDefinitionsResult) { taskDefinition = listTaskDefinitionsResult.taskDefinitionArns[listTaskDefinitionsResult.taskDefinitionArns.length-1]; taskDefinition = taskDefinition.split("/")[1]; } var params = { cluster: CLUSTER, count: 1, launchType: LAUNCH_TYPE, networkConfiguration: { "awsvpcConfiguration": { "subnets": SUBNET, "securityGroups": [SECURITY_GROUP] } }, taskDefinition: taskDefinition, }; const runTaskResult = await ecs.runTask(params).promise(); if (runTaskResult.failures && runTaskResult.failures.length > 0) { console.log("Error!"); console.log(runTaskResult.failures); } return runTaskResult; };
Задача обслуживания эластичного контейнера
Задача ECS получает изображение Docker Docker и запускает его. Команда » Migrate » будет выполнена, будут применяться сценарии, а схема базы данных будет обновлена.
В случае ошибок я решил сохранить Руководство по выполнению исправления, но было бы возможно автоматизировать использование других команд, таких как « validate » и « ремонт ».
Я создал тревогу на CloudWatch Чтобы уведомить меня по электронной почте в случае любой ошибки. Для будущей реализации я намерен управлять ошибками выполнения через Lambda.
Выводы
Может быть больно управлять миграциями базы данных вручную, особенно если у нас есть несколько сред, такие как разработка, постановка или производство.
Тем не менее, инструмент миграции, такой как Flayway, интегрированный с непрерывной доставкой, избегайте ручного выполнения и, следовательно, смягчает человеческую ошибку. Кроме того, это снимает бремя и скуку деятельности.
Эта статья была написана в партнерстве с ЭЛСОН НЕТО.
Первоначально опубликовано на моем Средние истории
Оригинал: «https://dev.to/danianepg/building-a-continuous-delivery-pipeline-for-database-migrations-with-gitlab-and-aws-3oh8»