Я знаю, как смею я предлагаю вести скрипт в производстве. Я инженер надежности на сайт, я никогда не должен поддерживать такую сумасшествие. Но правда в том, что, вероятно, наступит время, когда вам нужно запустить скрипт в производстве для обновления или очистки некоторых данных. В этом посте я собираюсь дать вам несколько советов о том, как писать и выполнять сценарий в производстве как можно более безопасно.
Ничто хуже, чем писать гигантский блок кода, вставив его в консоль, затем ударить ввод и смотреть там сидеть там. Вы понятия не имеете, где код находится в сценарии или что он делает, и что, по крайней мере, для меня, ужасает.
По этой причине вы всегда хотите убедиться, что вы выводят какой-то счетчик прогресса из ваших скриптов. Это позволяет вам следовать и знать, где вы находитесь в своем процессе. В случае, если вы используете Ruby, рассмотрите некоторые хорошо размещенные заявления. Ниже приведен сценарий, который мы недавно использовали в разработке, чтобы очистить некоторые неправильно кэшированные данные. Обратите внимание на получение заявлений на протяжении всего сценария, позволяющего нам следовать по мере его работы.
invalid_articles = [] Tag.where(id: tag_ids).find_each do |tag| puts tag.taggings.count tag.taggings.each_with_index do |tagging, index| puts index if index%100 == 0 article = tagging.taggable next unless article result = article.update(cached_tag_list: article.tags.pluck(:name).join(", ")) if result puts "Artcle update success #{article.id}" else puts "Artcle update failure #{article.id}" invalid_articles << article end end end
Также обратите внимание, что мы отслеживаем любые недопустимые статьи, которые мы можем найти при запуске этого сценария. Особенно, когда вы убираете плохие данные, всегда предполагайте, что вы можете наткнуться на него больше и подготовиться к этому в вашем скрипте. Здесь мы используем Если/else
заявление, чтобы поймать любые недопустимые статьи. Вы также можете использовать Начало/спасение
блокировать.
Когда вы обновляете записи, всегда есть шанс, что что-то уйдет с рельсов. Для того, чтобы иметь возможность «откатить» отслеживать вашу договор, как вы делаете обновления. Если мы обновим наш скрипт выше, чтобы сделать это, вот то, что он выглядел.
invalid_articles = [] before_update_tag_lists = {} Tag.where(id: tag_ids).find_each do |tag| tag.taggings.each_with_index do |tagging, index| puts index if index%100 == 0 article = tagging.taggable next unless article # Record the current cached tag list for every article before_update_tag_lists[article.id] = article.cached_tag_list result = article.update(cached_tag_list: article.tags.pluck(:name).join(", ")) if result puts "Artcle update success #{article.id}" else puts "Artcle update failure #{article.id}" invalid_articles << article end end end
Если что-то пойдет не так, пока этот скрипт работает, до_update_tag_lists
У хэша есть все наши оригинальные данные в нем. Используя эти исходные данные, мы можем обратно через статьи и использовать их со старыми списками при необходимости.
Может быть заманчивый, когда вы пишете скрипт, чтобы использовать как можно меньше синтаксиса. Обычно это означает, что бросается в одну букву переменных везде. Вы, вероятно, никогда не будем использовать этот код еще раз, так почему же тратить время, заставляя его выглядеть красиво и читабельно? Причина, по которой вы хотите сделать это красивым и читаемым, это потому, что тогда сценарий легче понять и следовать. Наличие скрипта, который легко понять, поможет вам избежать записи ошибок.
В моем приведенном выше примере скрипта я четко выписывая, с чем каждый объект, с которым я работаю. Это позволяет почти кому-либо смотреть на скрипт и иметь возможность понять, что он делает. Это приводит меня к моему следующему сочинению сценария.
Точно так же, как вы никогда не хотите нажать на производство без обзора кода, вы не должны запускать скрипт в производстве без обзора кода. Это еще одна причина, по которой вы хотите убедиться, что ваш сценарий понятен и читабелен, потому что вы хотите, чтобы кто-то еще мог быть в состоянии, также выяснить, что это делает.
Мы все знаем ценность второго набора глаз на наш код приносит. Даже если вы окажетесь в ситуации, когда время крепко, и вам нужно запустить скрипт как можно скорее, попробуйте так сильно, как вы можете получить на нем второй набор глаз. Я не могу сказать вам количество раз, когда свежий набор глаз удержал меня от падения обновления скрипта.
TMUX и экран позволяют запустить сеанс SSH в оболочке и сохранить эту оболочку активной даже через сбои сети. Это гарантирует, что если вы потеряете соединение, когда ваш скрипт работает, прогон сценария не будет прерван. Спасибо @kinduff для напоминания!
Если задача занимает хорошее количество времени, у вас есть риски отсоединения от сеанса SSH, вашего интернет-провайдера и т. Д.
Чтобы избежать этого, я рекомендовал запустить эти скрипты (хотя, я не рекомендую использовать такие сценарии, как это вообще), используя экран. Это супер легко использовать:
- Ssh в желаемый экземпляр
- Начните новую сеанс экрана, используя
экран
- Запустите длинный рабочий скрипт
- Нажмите
Ctrl
+А
сопровождаетсяD
отсоединить сеанс - Теперь вы можете закрыть все, даже сеанс SSH
- Вы можете присоединиться к сеансу экрана, используя
Экран -R.
Экран имеет много потрясающих вещей, обязательно проверить человек страницы .
Запуск скрипта в производстве никогда не является идеальным, но если вы используете эти советы, когда вы делаете это, он может сделать опыт гораздо менее пугающим.
Счастливые сценарии!
Оригинал: «https://dev.to/molly/tips-for-running-scripts-in-production-4c72»