Рубрики
Uncategorized

Настраиваемые артефакты: как развернуть как профессионал

Настраиваемые артефакты — это метод развертывания, используемый для доставки кода в различные среды в одной сборке. Читайте дальше, чтобы узнать, как лучше автоматизировать ваше развертывание. Tagged с DevOps, развертывание.

Когда проектная команда растет, развертывание функций становятся более частыми. Автоматизация этих развертываний становится критической для оптимизации рабочего процесса разработки. На мой взгляд, лучшая практика-развертывание на основе артефактов, процесс спасения, который я использую как можно больше. Это довольно популярно, и часть Двенадцатифакторное приложение шаблон.

Эта статья иллюстрирует развертывание на основе артефактов в простых терминах посредством практического примера.

Что такое артефакт развертывания

Артефакты — это не новое, но, как и в каждой хорошей практике, лучше, когда записывается.

Артефакт развертывания (или A Build ) — это код приложения, когда он работает на производстве: скомпилирован, строительство, объединяется, минимизировано, оптимизировано и так далее. Чаще всего это единственный двоичный или куча файлов, сжатых в архив.

В таком состоянии вы можете хранить и вернуть артефакт. Конечная цель артефакта состоит в том, чтобы быть загруженным как можно быстрее на сервере и немедленно запустить без прерывания услуг.

Кроме того, артефакт должен быть настраивается, чтобы быть развертываемым в любой среде. Например, если вам нужно развернуть на стационарных и производственных серверах, вы сможете использовать тот же артефакт.

Да, вы правильно прочитали: только конфигурация должна измениться, а не сам артефакт. Это может показаться вредным или трудным, но это главная особенность артефакта развертывания. Если вам нужно в два раза построить ваш артефакт для двух сред, вам не хватает всей смысла.

Пример проекта: базовый прокси

Давайте возьмем пример проекта для развертывания. Я напишу базовый HTTP -прокси, добавив случайный HTTP -заголовок в каждый запрос в node.js.

Советы: Код доступен в эта суть Анкет

Во -первых, установите зависимости:

$ mkdir deployment-example && cd $_ # cd into the directory just created
$ npm init --yes
$ npm install --save express axios reify

Вот сервер, обеспечивая все запросы на http://perdu.com Бэкэнд, после добавления случайного заголовка:

// server.js
import uuid from 'uuid';
import axios from 'axios';
import express from 'express';

const port = process.env.NODE_PORT || 3000;
const baseURL = process.env.PROXY_HOST || 'http://perdu.com/';

const client = axios.create({ baseURL });
const app = express();

app.get('/', (req, res) => {
    const requestOptions = {
        url: req.path,
        method: req.method.toLowerCase(),
        headers: { 'X-Random': uuid.v4() },
    };

    return client(requestOptions).then(response => res.send(response.data));
});

app.listen(port);
console.log(`Proxy is running on port ${port}. Press Ctrl+C to stop.`);

Советы: Вы заметили, как я использовал переменные среды через Process.env ? Это является центральным для моей точки зрения, имейте в виду это на потом.

Небольшой Makefile для запуска сервера:

start:
    # reify is a small lib to fully support import/export without having to install the babel suite
    node --require reify server.js

Сервер запускается в локальной среде, все хорошо, «он работает на моей машине ™»:

$ make start
> Proxy is running on port 3000. Press Ctrl+C to stop.

Построение артефакта

Теперь давайте отправим этот код в промежуточную среду, чтобы проверить его в несколько реальных условиях.

На данный момент, это хорошая идея, чтобы заморозить версию кода (например, с тегом GIT или выпуском GitHub).

Самый простой способ подготовки развертывания — это сборка zip -файл с исходным кодом и всем его зависимостями. Я добавлю следующую цель в Makefile , Создание молнии с идентификатором последнего коммита:

build:
    mkdir -p build
    zip 'build/$(shell git log -1 --pretty="%h").zip' Makefile package.json -R . '*.js' -R . '*.json'

И это работает:

$ make build
$ ls build/
> 4dd370f.zip

Шаг сборки здесь упрощен, но на реальных проектах он может подразумевать бундлер, транспилер, минивер и так далее. Все эти длинные задачи должны выполняться на шаге сборки.

Полученный zip -файл — это то, что мы можем назвать Артефакт Анкет Его можно развернуть на внешнем сервере или храниться в ведре S3 для последующего использования.

Советы: Как только вы найдете процесс сборки, который вам подходит, автоматизируйте его! Обычно система непрерывной интеграции/непрерывной доставки (CI/CD), такая как Travis или Jenkins, запускает тесты, и, если они проходят, создайте артефакт, чтобы хранить его.

Развертывание артефакта

Чтобы развернуть артефакт, просто скопируйте этот файл на сервере, извлеките его и запустите код. Я снова автоматизирую это как Makefile цель:

TAG ?=
SERVER ?= proxy-staging

deploy:
    scp build/$(TAG).zip $(SERVER):/data/www/deployment-example/
    ssh $(SERVER) " \
        cd /data/www/deployment-example/ \
        unzip $(TAG).zip -d $(TAG)/ && rm $(TAG).zip \      # unzip the code in a folder
        cd current/ && make stop \                          # stop the current server
        cd ../ && rm current/ && ln -s $(TAG)/ current/ \   # move the symbolic link to the new version
        cd current/ && make start \                         # restart the server
    "
    echo 'Deployed $(TAG) version to $(SERVER)'

Я использую переменные среды, чтобы указать тег, который хочу развернуть:

$ TAG=4dd370f make deploy
> Deployed 4dd370f version to proxy-staging

Как видите, развертывание на самом деле очень быстрое, потому что мне не нужно сборка в целевой среде.

Советы: Это означает, что если сборка содержит двоичные файлы, они должны быть составлены для целевой среды. Чтобы упростить, это означает, что вы должны Разработать Ваш код в той же системе, что и вы бежать Это. Это проще, что это звучит, когда вы используете Vagrant или Docker.

Советы: Я использовал ssh командование без каких -либо аргументов. Вы не хотите эти полномочия в Makefile , поэтому я советую использовать ваш местный ~/.ssh/config Чтобы спасти их. Таким образом, вы можете безопасно поделиться ими со своими коллегами и сохранить эти полномочия за пределами репозитория — при наличии инструкций по развертыванию в Makefile. Вот конфигурация Exampe SSH для моего Прокси-шаг :

Host proxy-staging
    Hostname staging.domain.me
    User ubuntu
    IdentityFile ~/.ssh/keys/staging.pem

Развертывание в нескольких средах

Сервер теперь может работать в Прокси-шаг Сервер, с конфигурацией по умолчанию. Что если я хочу развернуть ту же сборку в Прокси-производство сервер, но с другим портом?

Все, что мне нужно, это быть уверенным, что везде запускается код, Node_port Переменная среда установлена на правильное значение.

Есть много способов достичь этого Конфигурация Анкет

Самый простой — напрямую написать значения переменных среды в ~/.SSH/Environment Файл на каждом сервере. Таким образом, мне не нужно помнить, как или когда получить конфигурацию: она загружается автоматически каждый раз, когда я вхожу в машину.

> ssh production-server "echo 'NODE_PORT=8000' >> ~/.ssh/environment"
> ssh production-server "echo 'PROXY_HOST=https://host.to.proxy' >> ~/.ssh/environment"
> ssh production-server
> env
NODE_PORT=8000
PROXY_HOST=https://host.to.proxy

Теперь я могу развернуть в Прокси-производство Тот же артефакт, который я использовал для Прокси-шаг , нет необходимости восстанавливать.

$ TAG=4dd370f SERVER=proxy-production make deploy
> Deployed 4dd370f version to proxy-production

Вот и все.

Советы: Откат так же просто, как развертывание предыдущего артефакта.

На этом этапе легко автоматизировать процесс: пусть CI строит артефакт каждый раз, когда PR объединяется, или на каждом толчке для мастера (Travis, Jenkins и любой другой CI позволяет реализовать фазу сборки). Затем храните эту сборку где -то с определенной тегом, такой как хэш для коммита или тег релиза.

Когда кто -то хочет развернуть, он может запустить скрипт на сервере, который загружает артефакт, настраивает его благодаря переменным среды и запускает его.

Советы: Если вы не хотите писать переменные среды на каждом производственном сервере, который у вас есть, вы можете использовать Диспетчер конфигурации как Comfygure Анкет Отказ от ответственности: мы написали это!

Когда вам следует использовать развертывание на основе артефактов

Развертывание на основе артефактов связано со многими преимуществами. Это быстро развертывается, мгновенно отключите, резервные копии доступны и готовы к запуску.

Это позволяет запускать тот же код в каждой среде. Фактически, с артефактами развертывание становится Конфигурация проблема. Если куча кода работает при постановке, нет никаких причин, по которым он не должен терпеть неудачу в производстве, если в конфигурации нет ошибки — или среды не совпадают. По этой причине это хорошая идея инвестировать в стационарную среду, которая строго равняется производственной среде.

Флагнирование функций также проще с таким процессом развертывания: просто проверьте переменные среды. И последнее, но не менее важное, развертывание может быть автоматизировано до такой степени, что это может быть сделано нетехническим человеком (как владелец продукта). Мы делаем это, и нашим клиентам это нравится.

Но автоматизация такого процесса содержит существенную стоимость. Для установки и обслуживания требуется время, потому что, когда процесс сборки включает в себя больше, чем просто наращивание нескольких файлов, вам нужно запустить его с помощью Бундлер как WebPack. Кроме того, рассмотрим дополнительное пространство диска, необходимое для хранения артефактов и резервных копий.

Советы: Используйте переменные среды, не проверяйте окружающую среду. Попробуйте найти экземпляры if (env) в вашем коде и замените их значительной переменной среды, например if (process.env.logging_level) Анкет

Нет необходимости в таком процессе развертывания для проверки концепции, раннего проекта или сольного разработчика. Все преимущества поставляются с командой, работающей над зрелым проектом.

Спросите себя, сколько раз вы тратите на развертывание, и посмотрите на эту диаграмму!

Часто задаваемые вопросы

Мой проект — спа/PWA. Я должен настроить свой пакет на фазе сборки!

Тебе не нужно. Есть много способов настроить приложение с одной страницей позже в процессе. Например, загрузите config.json во время выполнения из другого места, чем другие статические активы. Или напишите окно .__ config__ с рендерингом на стороне сервера.

Не бойтесь отображать конфигурацию Frontend, ее будет легче отладить. Если у вас есть разумная информация в вашей конфигурации фронта, спрятанная в вашей мини -и загадочной сборке WebPack, вы уже делаете это неправильно.

Как насчет миграций базы данных?

Миграции не должны работать при развертывании приложения. У них должен быть свой собственный трубопровод, который может быть вызван в соответствующий момент. Таким образом, вы можете самостоятельно обрабатывать каждое развертывание и откатить любого из них независимо. Это ясно подразумевает, что многое выполняет резервные копии и имел возвращаемые миграции.

В случае большой или болезненной миграции, не стесняйтесь делать это шаг за шагом. Например, как переместить таблицу: сначала создайте новую таблицу, затем скопируйте данные и, наконец, удалите полученную таблицу в трех разных миграциях. Приложение может быть развернуто между копией и удалением таблицы. Если что -то пойдет не так, приложение может быть быстро возвращено, не касаясь базы данных.

Вывод

После того, как этот процесс будет правильно установлен, развертывания становятся быстрее и безопаснее. Это позволяет командам и владельцам продуктов быть более уверенными в развертываниях.

Развертывание на основе артефактов-это мощная техника, которая действительно стоит рассмотреть, когда проект приближается к его зрелости. Он идеально сочетается с гибкими методологиями, такими как Scrum, еще больше с Kanban, и это необходимо непрерывную доставку.

Чтобы пойти дальше с методами развертывания, я рекомендую огромную статью Ника Крейвера: Переполнение стека: как мы делаем развертывание — 2016 издание Анкет

Оригинал: «https://dev.to/kmaschta/configurable-artifacts-how-to-deploy-like-a-pro-4fhk»