Рубрики
Uncategorized

Создание непрерывной доставки для миграций базы данных с помощью Gitlab и AWS

фото JJ Ying на Unsplash после протестирования инструментов для автоматизации миграций базы данных, я … Tagged с помощью AWS, CICD, Gitlab, Pipeline.

Фотография JJ Ying на Неспособный

После Имея тестируемые инструменты Чтобы автоматизировать миграции базы данных, пришло время интегрировать выбранную с моим хранилищем Gitlab и создать конвейер непрерывной доставки для AWS.

Проектный стек

Вы можете проверить мою предыдущую историю о сравнении Flyway и Liquibase Здесь , но предупреждение о спойлере Эта реализация имеет следующий стек:

Процесс

Изображение ниже иллюстрирует процесс.

Процесс непрерывной доставки

Гитлаб 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»