Уже около 12 часов наш плагин Google Hangouts не работает. Я обнаружил это вчера, когда пытался начать схватку Кент Бек. Я открыл проблему в нашем репозитории HangoutConnection. Плагин Hangout запрашивает авторизацию, что обычно происходит только при первой установке:

нажатие «продолжить» вызывает этот экран с ошибкой:

Вчера я отчаянно пытался обойти это. Та же проблема возникала в нескольких браузерах. Когда плагин видеовстречи дает сбой, мы не получаем уведомления в Slack. Естественно, мы можем опубликовать URL-адрес видеовстречи непосредственно в Slack вручную, но это проблема. Более серьезная проблема здесь заключается в том, что в случае сбоя плагина видеовстречи основной веб-сайт AV не обновляется о существовании видеовстречи, поэтому мы не отслеживаем ее использование. Что еще более важно, на сайте не установлены ссылки на живые видеовстречи. Это означает, что люди, просматривающие веб-сайт и видящие «Scrum live», не могут получить доступ к правильному Scrum. У нас есть функция ручного переопределения, позволяющая скрам-мастеру устанавливать ссылку на видеовстречу для события, но она не работает.

Я открыл для этого другой вопрос и заскрежетал зубами из-за того, что никто не присоединился к Scrum. Три человека ответили на приглашение на встречу; не то, чтобы это имело большое значение — нажать кнопку RSVP на встрече быстро и легко, а для онлайн-встреч я бы сказал, что нам обычно повезло, что 1 из 4 RSVP попадает в тусовку. Даже если система работает без сбоев, многих людей отпугивают такие действия, как необходимость установки плагина Google Talk или уведомление о том, что люди, которых вы не знаете, смогут следить за вами, которое появляется в наших видеовстречах Google. в прямом эфире и т. д. Я вручную разместил ссылку в чате встречи, но любой, кто перейдет на основной сайт по ссылке, которая есть у нас в месте встречи, не сможет присоединиться к моей видеовстрече.

У меня было плохое настроение, я ругала своих детей за непрекращающийся беспорядок в коридоре с разбросанной обувью. Это был не очень хороший вечер. Я плохо спал и рано вставал. Так как я проснулся, я решил пойти на охоту за жуками. Накануне вечером я был озадачен тем, что у нас, кажется, нет теста для функции ручного обновления ссылки на видеовстречу. Частично мое разочарование было связано с трудностями, с которыми мне приходилось на протяжении многих лет убеждать разных разработчиков в том, что это важная функция. Они как будто не понимали, зачем это нужно, пытались его убрать и т. д. Зачем нам это нужно, когда у нас есть плагин для тусовки? Потому что 1 раз из 50 плагин тусовки дает сбой. Может быть, этот случай 1 из 50 не стоит затраченных усилий, но мы, кажется, всегда находимся на пороге постоянного сбоя плагина видеовстречи. Летом он два дня не работал, а потом снова включался. Google переходит с «Hangouts в прямом эфире» на «YouTube Live». Если мы потеряем функциональность плагина видеовстречи, нам потребуются ручные обновления, чтобы сохранить актуальность многих существующих функций нашего сайта.

В любом случае, поэтому я искал тест, выбирая термин «Редактировать ссылку на видеовстречу» (это пункт меню, по которому вы щелкаете) в каталогах спецификаций и функций. Нет хитов. Разве у нас не было теста для этого? Разве это не было интермедией? Разве я не должен отлаживать сам плагин видеовстречи? У меня не было оптимизма по поводу решения проблемы с плагином видеовстречи, поэтому я подумал, что, по крайней мере, смогу протестировать эту функцию, которую я действительно хочу использовать. Более глубокое расследование показало мне, что был тест, и я не смог его найти, потому что он использовал трюк JavaScript, чтобы щелкнуть пункт меню:

@javascript
  Scenario: Edit Hangout URL
    Given I am on the show page for event "Scrum"
    And I open the Edit URL controls
    And I fill in "hangout_url" with "http://test.com"
    And I click on the Save button
    Then I should see link "Join now" with "http://test.com"
When(/^I open the Edit URL controls/) do
  page.execute_script(  %q{$('li[role="edit_hoa_link"] > a').trigger('click')}  )
end

Хорошо, отлично, у нас был тест, но функциональность не работала на производстве. Мои мысли о раннем утреннем TDD испарились, и я перешел к тестированию системы на сервере разработки. Сервер разработки был спит Heroku из-за того, что я израсходовал все доступные часы в моей личной учетной записи. Гах. Я подключил сервер разработки к своей учетной записи компании NeuroGrid, где он начал потреблять 7 долларов в месяц. Не идеально, но мне нужно было сосредоточиться на этой ошибке. Хотя по иронии судьбы меня отвлекла мысль о том, что пока я ждал запуска сервера разработки, я мог видеть, не работает ли плагин видеовстречи на промежуточном сервере. Промежуточный сервер настроен на использование плагина для видеовстречи разработки, который мы проверяли накануне, чтобы увидеть, будет ли работать PR Жоао для обновления заголовка. Плагин для разработки видеовстреч теперь немного отличался, но стоило попробовать посмотреть, возникнет ли такая же ошибка аутентификации. Я был поставлен в тупик из-за некоторых ошибок, связанных с загрузкой проектов на стадии. Мы обошли их в ручном тестовом сеансе с Майклом и Сашей накануне, но теперь я играл соло и подумал: «Давайте разберемся в этом».

На странице индекса проектов произошел сбой:

No route matches {:action=>"show", :controller=>"users", :id=>nil} missing required keys: [:id]
/app/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.6/lib/action_dispatch/routing/route_set.rb:234:in `optimized_helper'
/app/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.6/lib/action_dispatch/routing/route_set.rb:220:in `call'
/app/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.6/lib/action_dispatch/routing/route_set.rb:345:in `block (2 levels) in define_url_helper'
/app/app/views/projects/_listing.html.erb:52:in `_app_views_projects__listing_html_erb___4267003586796215631_69973986642740'

который соответствовал этому коду:

<div><%= "Created #{time_ago_in_words(project.created_at)} ago" %> by <%= link_to project.user.display_name, user_path(project.user) %></div>

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

Project.all.each { |p| p.delete if p.user.id.nil? }

Теперь я снова мог видеть индексную страницу проектов на стадии подготовки. Но была еще одна ошибка для просмотра отдельной страницы проекта:

Parameters: {"id"=>"websiteone"}
undefined method `display_profile' for nil:NilClass
/app/app/models/project.rb:42:in `select'
/app/app/models/project.rb:42:in `members'
/app/app/controllers/projects_controller.rb:18:in `show'

соответствующий этому коду:

def members
  followers.select(&:display_profile)
end

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

Follow.select { |f| User.find_by_id(f.follower_id).nil?}.each{ |f| f.delete }

Теперь я мог видеть отдельную страницу проекта на стадии подготовки и кнопку «Начать видеовстречу». У меня такая же ошибка аутентификации. Я привел в порядок постановку таким образом, чтобы в будущем было проще тестировать видеовстречи, но мне удалось только подтвердить, что ошибка аутентификации плагина возникает по крайней мере для двух версий плагина и, следовательно, более вероятно, что это что-то на стороне Google. что мы не сможем исправить. Я почти начал писать блог об ограничениях целостности данных и изящных ошибках кода. Суть здесь; Пожалуйста, интерфейс просто отображает некоторые детали, любые детали! Меня не интересуют 500 ошибок. Я вернулся к повествованию о тусовке и начал гуглить. Я нашел несколько полезных ссылок:

Следующие 30 минут я потратил на настройку через консоль Google API. Похоже, наши «авторизованные источники JavaScript» для OAuth были обновлены. Мне даже удалось заставить работать вход в G+ на сервере разработки, создав впечатление, что на стороне Google не было массовой ошибки аутентификации. Последняя ссылка в списке выше (по иронии судьбы заблокированная дискуссия) говорила о потенциально хрупком исправлении проблемы аутентификации. Я попробовал это на постановке, но не в восторге. Казалось, что URL-адрес googlecontent, который он предложил добавить к источникам JavaScript, был переменным. Разочаровывающее утро, но я подумал про себя, что, возможно, мы можем использовать это как толчок для поиска лучшего решения. Может быть, мы сможем запустить трансляции YouTube Live прямо из Slack…

Однако, по иронии судьбы, когда я писал первый абзац этого сообщения в блоге, я заметил, что URL-адрес googleusercontent в проблеме, которую я открыл, был таким же, как и в видеовстрече, которую я только что открыл для создания скриншотов. для блога. Я попытался добавить его в «Авторизованные источники JavaScript» для плагина видеовстречи, и о чудо, все заработало. Гах! Я думаю, что помещал URL-адрес производственного googleusercontent в плагин разработки. Я попытался проверить эту теорию на постановке. Постановка работала, и у нее уже был правильный URL-адрес googleusercontent в конфигурации видеовстречи разработки в API консоли Google. Я думаю, может быть, просто потребовалось дополнительное время для распространения. Ааааааааааа…. Тем не менее, это была настройка, в которой мы не нуждались в течение предыдущих 3 лет — что-то изменилось на стороне Google.

Чтобы свести концы с концами, я, наконец, проверил ручное редактирование ссылки на видеовстречу на сервере разработки, и это сработало для события, у которого не было существующего URL-адреса видеовстречи. Я предполагаю, что в производственной среде должен быть какой-то краеугольный случай, когда у нас есть событие, которое было запущено и завершено, и осталось со старым URL-адресом видеовстречи, и попытка вручную переопределить это не удается. Итак, путь свободен — плагин Google Hangout продержится еще несколько дней? недели? месяцы? Тем временем я должен попытаться создать тест, который фактически воспроизведет обстоятельства, при которых ручное обновление URL-адресов видеовстреч не удается на производстве.

Не то чтобы я не думал о том, что мы не могли бы создать собственное приложение для демонстрации экрана с помощью WebRTC, или перейти на Zoom или GotoMeeting, или найти какую-то другую среду для совместной работы, которая не приводила бы к массовым сеансам отладки каждые три месяца, как кажется вообще происходят под сенью возможного заката Google…

Первоначально опубликовано по адресу: http://nonprofits.agileventures.org/2016/10/19/bug-hunt/