SkillGridИзучай computer science на практике

Деплой: как код доходит до реальных людей

Деплой — это переезд твоего кода с ноутбука на машину, до которой могут дотянуться другие люди. И ещё это место, где становятся видны все допущения, которые твой ноутбук молча делал за тебя.

15 мин · 48 XP

Твой проект работает. Ты показывал его друзьям на своём ноутбуке, и всё работало. Ты выкладываешь его на сервер, рассылаешь ссылку — и он ломается мгновенно. Тот же код, те же файлы, всё то же самое. Изменилось только одно: где он запущен. У этого момента есть название, и это шутка, которую рассказывают, потому что он случается со всеми: «но у меня на машине работало».

Сломалось оно потому, что твой ноутбук никогда не запускал только твой код. Он ещё поставлял сотню вещей, от которых твой код тихо зависит: на каком порту слушать, где живёт база данных, какие ключи API использовать, какая версия языка установлена, какие файлы случайно лежат в той папке. Ничего этого нет в твоём коде, поэтому ничего этого не уехало вместе с кодом. Места, где запускается код, называются окружениями. Обычно их три: твой ноутбук, где ты всё делаешь и где ломать не страшно; staging — копия настоящей установки, где команда проверяет всё до того, как это увидят пользователи; и production — настоящее, с реальными людьми и реальными деньгами. Одна и та же программа работает во всех трёх, а значения в каждой свои.

env:         laptop     staging    production
-----------  ---------  ---------  -----------
PORT         3000       8080       80
API_KEY      test       test       live
LOG_LEVEL    debug      info       warn

Прежде чем код сможет работать на сервере, его часто нужно превратить в то, что сервер сумеет запустить: это и есть сборка. Скомпилировать TypeScript в JavaScript, собрать много файлов в один, сжать картинки, получить одну папку, готовую к запуску. Разница важна, потому что это два разных шага с двумя разными видами поломок. Сборка падает на твоей машине, до всякого деплоя, и это дёшево: до пользователей ещё ничего не дошло. А падение при запуске случается на сервере, когда пользователи смотрят. Ты хочешь, чтобы как можно больше поломок были поломками сборки.

src/cart.ts       ---> dist/app.js
package.json      ---> node_modules/

ts ---> js

$ npm start
PORT=80 listening

Так что честная версия «у меня на машине работает» — это список вопросов, и он короткий. Здесь другая конфигурация — порт, база, ключи? Какой-то зависимости не хватает или у неё другая версия? Файл, которого ждёт код, вообще есть на этой машине и с тем же регистром букв? Есть ли у этой машины право пользоваться сетью, папкой, портом? И тот вопрос, который все забывают: работает ли оно до сих пор, в этот час, под такой нагрузкой? Ни один из этих вопросов не про то, насколько умён твой код. Все они про мир, в который код попал.

YouServerUsersdeploy v41, the new cart pageserve v41the cart total is wrong for every customerreports start arriving at 09:14roll back to v40serve v40, the old cart page againthe bug is still there, but nobody is hitting it any more

Каждый деплой — это ещё и небольшая ставка. Поэтому до деплоя реши, как ты вернёшься назад. У этого плана есть название: откат. Он означает возврат к предыдущей версии, про которую известно, что она работала, обычно одной командой, и занимать это должно секунды, а не часы. Смысл отката не в том, чтобы что-то починить: он в том, чтобы остановить ущерб, пока ты разбираешься, что сломалось. Заметь, что для него нужно. Нужно, чтобы предыдущая версия всё ещё существовала и всё ещё работала. Нужно, чтобы данные пережили путешествие назад, и это самое трудное: если новая версия уже записала в базу записи нового вида, старая версия должна их терпеть. И нужно узнать, что всё сломано, а значит — смотреть, что происходит сразу после деплоя, а не предполагать.

Практика

  1. Ты настраиваешь проект так, чтобы он работал в трёх местах. Разложи значения: это то, что настраивают под каждое окружение, или секрет, который должен остаться вне репозитория?

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

    15 XP

  2. Ты выложил обновление, и теперь итог в корзине неверный у всех клиентов. Что правильно сделать первым делом?

    Подсказки
    • Откат — это не то же самое, что починка: он про то, на кого влияет баг, пока ты чинишь.
    • Старая версия находится в одной команде от тебя только если ты её сохранил.

    16 XP

  3. Расставь по порядку шаги аккуратно сделанного деплоя.

    Подсказки
    • Изменение, которое не записали, нельзя отменить, а изменение, которое не проверили, нельзя доверять.
    • Покажи это одному клиенту раньше, чем покажешь всем.

    16 XP