Рубрики
Uncategorized

Трагедия бота -приподнята

Наша история начинается 25 марта. Я работал над билетом, который был передо мной для W … с меткой DevOps, Slack, Mussondled, отладки.

Наша история начинается 25 марта. Я работал над билетом, который был передо мной в течение недели или двух в отношении нашего сервера сборки ( Team City ), не отправляя никаких электронных писем людям. Официальной группе поддержки сервера Build Server потребовалась довольно много времени, чтобы вернуться ко мне, и я попробовал все, о чем я мог придумать. Не желая оставлять это нетронутым на некоторое время, я решил придумать план.

«Что, если вместо электронной почты мы получаем уведомление о неудачной сборке, отправленной через Slack непосредственно пользователю в частном чате? Большинству моих товарищей по команде не нравится электронная почта в любом случае, и это сделало бы мне шаг или два дальше на мои цели по интеграции всего конвейера CI/CD с клиентом чата ».

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

Я писал PowerShell на стороне, чтобы отправить себе простые сообщения, чтобы я мог проверить разрешения бота. Как выясняется, есть много документации для Slackbots , но я не видел единого руководства по настройке их со всеми прицелами разрешений, которые вы хотели бы в одном месте, так, как я искал, а именно что -то, что объясняло их методом, который сделал это, чтобы я мог понять. Я знал, что вы можете отправить чат бота на канал, но частные пользователи были другим делом, и это не имело (для меня) простой логики для этого.

Как правило, государственный/частный канал требует только Входящая-ВЕБХУК для применения и входящего URL -адреса Webhook для публикации на канале. Тем не менее, личный канал Slackbot человека уникален. Прицелы, которые я в конечном итоге предоставил боту: Входящая кепхук, каналы: написать, Чат: Напишите: бот, Группы: написать, бот, Пользователи: Читать: Пользователи: Читать: Электронная почта Анкет

**$stuff** = "_I have the shiniest meat bicycle_!"

**Invoke-RestMethod** -Method POST -Uri "https://slack.com/api/chat.postMessage?token=xoxb-SUPER\_LONG\_TOKEN&channel=SlackUserID&text= **$stuff**" -ContentType "application/json"

«У меня самый блестящий мясо велосипед?» — Было ли первое, что я увидел в своем канале Slack Bot от моего собственного бота (на мой взгляд, сообщения о тестовых сообщениях должны быть веселыми, поэтому я использую Borderlands 2 Цитаты ). Вскоре после этого я посылал URL-адреса и полукомплексные текстовые структуры в Urlencoding, за которыми следуют объекты JSON. _Успех!

Однако это было только начало. Это было бы серьезной задачей и огромным спойлером веселья, чтобы попросить моих друзей в разработке пройти полусложную процедуру, чтобы получить необходимый в мне токен слабых, а затем записать его где -то в некой базе данных или файле. Следующим логическим шагом было рассказать моему сценарию мой адрес электронной почты, выяснить его оттуда, а затем отправить сообщение таким образом. Хорошей новостью для меня является то, что Team City имеет встроенную переменную для этого, и я спрашивал всех, кто зарегистрировался на сервере, использовать их рабочее письмо, чтобы они могли получить электронные письма, когда сборки потерпели неудачу.

**$who** = "%teamcity.build.triggeredBy.username%"

**$targetUser** = **Invoke-RestMethod** -Method POST -Uri "https://slack.com/api/users.lookupByEmail?email= **$who@emaildomain.com** &token=xoxb-super\_long\_token" -ContentType 'application/x-www-form-urlencoded' | **ConvertTo-Json**

( **$targetUser** -split "`r`n") | **ForEach-Object** {
**$userID** = **Select-string** -InputObject $\_ -Pattern '"id": '
 if( **$userID** ){

**Write-Output** "FOUND"
**$cleanID** = **$userID** -Replace '"id":', "" -replace '"', "" -replace ',', ""

**$cleanID** = **$cleanID**.trim()
 }
}

Выше я делаю уборку. Ответ от API — это объект JSON, и для поиска моего идентификатора строки, который поступает в Slack, мне нужно проанализировать его. Как только я беру линию, которая имеет «id»: «my_id», я просто удаляю дополнительные вещи, которые мне не нужны, и это оставляет меня только с моим целевым идентификатором в качестве строки.

Через час, я настроил его, так что если бы я дал ему электронное письмо, он искал мой пользователь в славу, очистил токен, который он вышел из JSON, который он вернулся, а затем отправил его обратно в Slack с API Позвоните, чтобы отправить частного пользователя сообщение. Легко, верно?

Сейчас пятница И у меня осталось около полудня на рабочей неделе, когда осознание меня поражает —

  • 1 апреля в понедельник в этом году. Я мог бы разыграть команду Dev, бросая им вызов в российской рулетке в случайном случае на каждой запускаемой сборке. Если бы я занялся текущим временем, взял последнюю цифру минуты и использовал это в переключении, я бы создал разумно честную рулетку. Примером этого является: представьте, что это 13:25, мы получаем последнюю цифру за время, 5 и генерируем результат на основе этого. Используя логику, которую я представляю ниже, запуск сборки в 1:25 ничего не получит пользователя, но сборка, запускаемая в 1:29, заработает им 200 очков, а сборка, запускаемая в 1:23
**$a** = Get-Date
**$array** = [int[]](($a.Minute -split '') -ne '')
**$yei** = 0
switch( **$array** [-1]){
 0 { **$yei** =0}
 1 { **$yei** =-25}
 2 { **$yei** =50}
 3 { **$yei** =-100}
 4 { **$yei** =100}
 5 { **$yei** =0}
 6 { **$yei** =25}
 7 { **$yei** =-50}
 8 { **$yei** =0}
 9 { **$yei** =200}
default { **$yei** ="ID:10-T Error"}
}
  • Это был бы идеальный способ проверить уведомление сборки как концепцию и превратить его в реальную вещь, если это сработает. Я уже хорошо выяснил, как искать пользователя в системе, и проверить их полномочия за выполнение конкретных сценариев/выполнения сценариев против определенных серверов из предыдущего проекта.
  • Все части, чтобы сделать эту работу, здесь, просто нужен кто -то, чтобы собрать головоломку. Если бы я удвоился, я мог бы дать ему аромат и ощущение, но не откровенно давить на них играть в мою игру, если они не заинтересованы или не имеют времени. Я получаю свою любовь к розыскам и быть полезным одновременно.

В тот день я протестировал бот и работал. Весь процесс работает так:

  1. Пользователь запускает сборку, и случайно они бросают вызов игре.
  2. Я смотрю пользователя в белом списке и черном списке. Если пользователь не в белом списке или в черном списке, когда его выбрали для вызова, то он вызывает вызов серверу команды City Build непосредственно в Slack. Им будет указано (если они хотят) играть в игру, используя сборку пилы в нижней части страницы, в разделе, зарезервированном для коммунальных услуг.
  3. Team City обновляет белый список, позволяя этому пользователю играть.
  4. Командный город отправляет я Сообщение, поэтому у меня есть запись о том, что игра идет, и должна быть готова отправить им очки.
  5. Пользователь играет в игру. Основываясь на другой рулетке, основанной на времени, как указанная выше, им дали или наказывали незначительное, произвольное количество точек. Любой пользователь, пойманный на попытке сыграть в игру, который не был приглашен через WhiteList, был бы в черном списке и издевался в Slack перед всеми в их команде. Как только пользователь завершит игру, он также занесен в черный список снова от игры, чтобы сделать ее простой и не допустить, чтобы все слишком много выиграли. Если двигатель RNG не был щедрым с разработчиками, и к середине недели не было много игроков, мой план состоял в том, чтобы очистить черный список и позволить им попробовать еще раз, чтобы повеселиться.

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

Это то, что я ожидал увидеть в моем личном канале Slackbot.

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

Ничто не может пойти не так с этим планом, верно?

Riiiiiiiiiight…

Плохо, он понятия не имеет, с кем разговаривает. % teamcity.build.triggeredby% будет только именем, на которое он рассердится и будет вызвать. Для этой записи я отслеживал пользователя, который победил мою игру и дал ему 100 очков просто за то, что помог мне исправить ошибки.

Приходите в понедельник, ад был в значительной степени разбился в моем канале Slackbot. Оказывается, если пользователь не нажал кнопку [RUN] или […] Рядом с ним, чтобы инициировать сборку, он установил бы имя учетной записи службы по умолчанию как % teamcity.build.triggeredby.username % системной переменной, когда он пошел на поиски. Слэк затем попытался бы найти этого недействительного пользователя, а затем ничего не отправит мне. Я был на 100% в темноте на том, что происходило. Только вторник этой недели, прежде чем у меня был настоящий пользователь, был помечен как триггер-эвер сборки. К тому времени у меня уже было около 100 IMS в чате, в котором говорилось, что % teamCity.Build.Triggeredby.username % был брошен на игру. Очень полезно. Veeeeeeery полезный.

Помните функцию белого списка/черного списка, о которой я упоминал ранее? Его единственной целью было быть артефакт сборки, который был составной из всех других пользователей, которые были оспаривали, и добавили к нему свои имена по мере продвижения недели. По мере того, как пользователь бросает вызов, он ставит в белый список, чтобы никогда не беспокоиться снова, пока они не сыграют в игру. Функция белого списка не работала для кого -либо, поэтому к середине недели Мэтт пришел ко мне, сказав, что ему бросают вызов в игру каждые 5 минут, запустив серию изменений в базе данных в нескольких базах данных. Несмотря на то, что он не был расстроен (он был на самом деле слегка удивлен), он спросил, могу ли я выключить его, пока я искал способ заставить Jigsawbot не играть в фаворитов с ним.

О, и я упоминал, что почти все нашли это раздражающим и считали, что это какая -то мошенничество в социальной инженерии? Практически все, с кем я говорил, либо верил, что это была мошенничество со социальной инженерии, либо просто я Играйся, и никто не сообщил об этом мне или моей команде в любом случае, за исключением 4 пользователей, которые активно связались со мной, потому что они были достаточно удивлены, чтобы спросить. Из этого подмножества разработчиков половина из них даже отдаленно заинтересована в игре и сделала это (за что я вознаградил в соответствии с правилами игры). По крайней мере, антифишинг-подготовка нашего ИТ-отделения не была потеряна для моих друзей-разработчиков.

Все шло так гладко.

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

Псевдокод для того, что я делал:

If (we should challenge the user) {
 challenge the user;
 if (not on whitelist and not on blacklist) {whitelist them;}
}

Что я должен был делать:

if (we should challenge the user){
 if (not on whitelist and not on blacklist){
 challenge the user;
 whitelist them;
 }
}

Это никогда не появлялось в моих тестах, потому что я играл в игру сразу после того, как мне бросили вызов. У меня не было сценария тестового примера, который будет адекватно охватывать экземпляр «Мне нужно запустить 5 разных сборки одновременно, которые запустили бы это перед игрой», и разрыв в поведении моего кода не был очевиден, пока он не вышел «мир», чтобы увидеть.

С правильной логикой я смог решить, в чем были мои проблемы, и Мэтт наконец получил немного покой и спокойствия. Я, однако, не был удовлетворен. Если я хотел превратить это в сценарий для использования бота для ошибок сборки, мне нужно было понять, как программное обеспечение для сборки получает изменения венчурного капитала от GIT, чтобы узнать, кто такой пользователь.

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

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

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

Обложка изображения Хосе Франциско Моралес на Неспособный

Оригинал: «https://dev.to/dealeron/the-tragedy-of-the-jigsaw-bot-3n75»