Когда проектная команда растет, развертывание функций становятся более частыми. Автоматизация этих развертываний становится критической для оптимизации рабочего процесса разработки. На мой взгляд, лучшая практика-развертывание на основе артефактов, процесс спасения, который я использую как можно больше. Это довольно популярно, и часть Двенадцатифакторное приложение шаблон.
Эта статья иллюстрирует развертывание на основе артефактов в простых терминах посредством практического примера.
Что такое артефакт развертывания
Артефакты — это не новое, но, как и в каждой хорошей практике, лучше, когда записывается.
Артефакт развертывания (или 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»