Иногда, когда вы работаете в удаленных средах с несколькими промежуточными серверами, сложно отследить, какие из серверов можно использовать бесплатно. В последнем месте, где я работал, у нас было 3 таких окружения. Когда кому-то нужно было развернуть ветку для тестирования чего-то, что мы выбирали случайным образом, мы спрашивали в канале технической группы, был ли этот сервер уже занят кем-то другим. Как вы понимаете, люди всегда заняты своей повседневной работой. Очень часто человек, который уже использовал промежуточный сервер, не торопится, пока не ответит.

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

Идеальным решением этой конкретной проблемы стал бот.

Бот

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

  • help: показывает список доступных команд.
  • список: показывает список доступных и загруженных серверов.
  • take ‹server_name› ‹reason›: помечает сервер как занятый вами
  • leave ‹server_name›: помечает сервер как доступный.
  • create ‹server_name›: добавляет новый сервер.
  • remove ‹server_name›: удаляет существующий сервер.
  • rename ‹old_server_name› ‹new_server_name›: переименовывает сервер

Все команды должны начинаться с префикса ! Staging.

Альтернатива №1: Самостоятельный бот. Неа

Вначале моим первым намерением было создать проект nodejs или elixir. Я бы создал традиционного бота, который подключается к каналу Slack и слушает конкретные команды, которые нам нужны.

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

Чтобы облегчить эти проблемы, мы рассмотрели Heroku, который упрощает настройку и развертывание, однако, учитывая 30-минутную политику бездействия бесплатных дино, мы отклонили эту идею.

Альтернатива №2: Бессерверный бот? ДА!

После объяснения идеи бота моему другу Alvivi он намекнул мне о Google Apps Script. Оказалось, что он использовал его раньше в сочетании с Google Docs, выступающим в качестве уровня сохраняемости.

С помощью скрипта Google Apps вы можете написать кучу функций javascript и предоставить их в качестве конечной точки, не беспокоясь о настройке чего-либо.

Звучит хакерски, но работает очень хорошо!

Рецепт

Скриптов и таблиц Google Apps недостаточно для настройки всего решения, поэтому вот полный рецепт того, что нам нужно:

  • 1x входящий веб-перехватчик Slack
  • 1x исходящий веб-перехватчик Slack
  • 1x таблица Google
  • 1x скрипт Google Apps

Реализация

Таблица

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

Мы можем дать таблице желаемое имя. Для следующих шагов это не имеет значения. Содержимое электронной таблицы может быть примерно таким:

Как только мы добавим в нашу электронную таблицу это содержание, мы можем сохранить ее и скопировать ее идентификатор. Идентификатор можно найти в URL-адресе.

Настроить входящий веб-перехватчик Slack

Настроить входящий веб-перехватчик Slack очень просто, и, вероятно, вы это уже делали раньше. Вам просто нужно перейти в каталог Slack Apps и найти «входящий веб-перехватчик», создать новый и скопировать URL-адрес веб-перехватчика. Вы можете оставить остальные настройки по умолчанию, поскольку мы переопределим некоторые из них в нашем скрипте.

Сценарий

Посетите script.google.com, нажмите Новый скрипт, и вы попадете в редактор скриптов Google Apps. Там вы просто копируете содержимое скрипта, находящегося в этом репозитории github. Сценарий в основном содержит логику для взаимодействия со Slack и изменения содержимого электронной таблицы, в которой мы сохраняем статусы всех наших промежуточных сред.

Сам сценарий не является чем-то действительно сложным. Я не буду объяснять это подробно, но думаю, стоит упомянуть, как это запускается в Google Apps Script. Учитывая, что наш скрипт будет считаться веб-приложением, доступ к которому осуществляется по определенному URL-адресу, он может получать запросы GET и POST. В нашем случае, поскольку мы будем использовать его в сочетании с Slack Outgoing Webhook, который выполняет запросы POST, потребуется реализовать функцию doPost.

function doPost(e){
  var commandReceived = e.parameter["text"];

  if (commandReceived.match(/help/)) showHelp();
  if (commandReceived.match(/list/)) listStaging();
  if (commandReceived.match(/take/)) take(e);
  if (commandReceived.match(/leave/)) leave(e);
  if (commandReceived.match(/create/)) create(e);
  if (commandReceived.match(/remove/)) remove(e);
  if (commandReceived.match(/rename/)) rename(e);
}

Как видите, функция doPost в основном действует как маршрутизатор команд. Он определяет, какую команду мы используем, а затем выполняет соответствующую функцию для ее обработки.

Наш скрипт ведет учет всех отправляемых нами событий, записывая их на отдельной странице нашей электронной таблицы. Для облегчения этой работы мы используем библиотеку Петера Херманна BetterLog. Добавить его в наш проект довольно просто, следуя инструкциям в файле readme.

Теперь мы собираемся раскрыть несколько свойств, которые нам понадобятся в нашем скрипте. Мы можем сделать это, перейдя на вкладку Свойства проекта ›Свойства скрипта. Добавим следующие:

  • SPREADSHEET_ID
  • SLACK_CHANNEL_NAME
  • SLACK_INCOMING_WEBHOOK

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

Это должно быть все, что касается скрипта Google Apps!

Настроить исходящий веб-перехватчик Slack

Последний шаг позволяет нашему скрипту Google Apps прослушивать команды слабого канала. На самом деле наш сценарий не будет активно слушать. Slack будет нести ответственность за то, чтобы держать его в курсе, когда кто-то отправляет команду, начиная с ! Staging.

Это делается путем создания исходящего веб-перехватчика Slack. Нам нужно перейти в каталог Slack Apps и найти «исходящие веб-перехватчики». Затем создаем новый со следующими настройками:

  • Канал: канал, с которого мы будем отправлять команды.
  • Триггерные слова: ! Постановка
  • URL-адреса: URL-адрес, созданный скриптами Google Apps на последнем этапе.

Нажмите Сохранить настройки, и все готово.

Демо