Наша история начинается 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"} }
- Это был бы идеальный способ проверить уведомление сборки как концепцию и превратить его в реальную вещь, если это сработает. Я уже хорошо выяснил, как искать пользователя в системе, и проверить их полномочия за выполнение конкретных сценариев/выполнения сценариев против определенных серверов из предыдущего проекта.
- Все части, чтобы сделать эту работу, здесь, просто нужен кто -то, чтобы собрать головоломку. Если бы я удвоился, я мог бы дать ему аромат и ощущение, но не откровенно давить на них играть в мою игру, если они не заинтересованы или не имеют времени. Я получаю свою любовь к розыскам и быть полезным одновременно.
В тот день я протестировал бот и работал. Весь процесс работает так:
- Пользователь запускает сборку, и случайно они бросают вызов игре.
- Я смотрю пользователя в белом списке и черном списке. Если пользователь не в белом списке или в черном списке, когда его выбрали для вызова, то он вызывает вызов серверу команды City Build непосредственно в Slack. Им будет указано (если они хотят) играть в игру, используя сборку пилы в нижней части страницы, в разделе, зарезервированном для коммунальных услуг.
- Team City обновляет белый список, позволяя этому пользователю играть.
- Командный город отправляет я Сообщение, поэтому у меня есть запись о том, что игра идет, и должна быть готова отправить им очки.
- Пользователь играет в игру. Основываясь на другой рулетке, основанной на времени, как указанная выше, им дали или наказывали незначительное, произвольное количество точек. Любой пользователь, пойманный на попытке сыграть в игру, который не был приглашен через 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»