Использование Bibisect для поиска версии, в которой появляется регрессия

From The Document Foundation Wiki
< QA‎ | Bibisect
Jump to: navigation, search

Введение

Bibisect означает "деление пополам" и предназначен для помощи членам команды QA LibreOffice занимающихся регрессиями. Регрессия наиболее раздражающий артефакт, который, к сожалению, приходит с разработкой программы. Однако, мы хотим иметь дело с ними как можно раньше, так как их поиск и исправление со временем становятся всё сложнее и сложнее.

Git хранит свои вещи так, что одна программа Bibisect может содержать несколько полных 64-разрядных офисных пакетов Linux установленных в очень сжатом размере. И это не требует установки всех версий параллельно, так как можно перейти к любому из них быстро через git checkout source-hash-XXXXXX, что занимает менее 1 секунды.

Ограничения

При помощи Bibisect возможно находить только те ошибки, для которых в репозитории Bibisect есть в наличии круг подтверждённых вопросов. На сегодняшний день это верно для всех регрессий в Linux. Для OSX и Windows мы медленно приближаемся к цели.

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

Видео урок на Youtube

10-ти минутный ролик (Youtube)] от Florian Reisinger. - Урок на английском. Но вроде бы, все ключевые моменты понятны. Качество звука не очень хорошее, но достаточное, чтобы понять что говорят.

Короткие инструкции - Только для Linux

  1. Скачайте репозиторий (12 Гбайт, но не беспокойтесь - это нужно только один раз).
  2. Распакуйте его в удобную папку.
  3. Откройте терминал (не волнуйтесь, всего несколько простых команд).
    1. Если вы используете Ubuntu нужно установить git и libjpeg62: sudo apt-get install git libjpeg62
  4. перейдите в директорию с программой cd каталог_программы
  5. Запустите программуgit bisect start latest oldest
  6. Запустите офис ./opt/program/soffice
  7. Воспроизведите действия которые вызывают ошибку
    1. Если ошибка не воспроизводится: git bisect good
    2. Если ошибка присутствует: git bisect bad
  8. повторите шаги 6 & 7 пока не найдёте ту версию в которой эта ошибка появилась
  9. git bisect log
  10. Прикрепите вывод лога к отчету об ошибке

Версии

Репозиторий 43all должен включать все предыдущие и поэтому они могут считаться устаревшими[1].

Платформа Версия Серия фиксаций (commit) от Серия фиксаций (commit) до Количество фиксаций (commit) Количество сборок Ссылка на загрузку Размер загрузки Bibisected bugs in range Коментарии
Ubuntu 12.04 x64 43all d6cde02d c15927f2 60733 755 builds Canonical: репозиторий подпись 12Gb 542+[2] это заменяет старый репозиторий 42all[3]
43only 22029c7e c15927f2 13951 220 builds Canonical: репозиторий подпись 3.6Gb только в диапазоне от точки ветвления 4.2 до 4.3[4]
Ubuntu 14.04 x64 44alpha2only dea4a3b9 b800d0b6 9859 188 builds Canonical: репозиторий подпись 2.8 Gb только в диапазоне от разделения ветки 4.3 до тега alpha2 4.4
OSX
  • lo-4.1_to_lo-4.2
  • 4.2_to_lo-4.3
  • и release_lo-3.3.0_to_lo-4.1
 ?  ?  ?  ? TDF: репозиторий 6 GB, 3.9GB and 2GB пробная?
WIN 2013-12-13_2013-12-19  ?  ?  ?  ? TDF: репозиторий 3.5GB не активна, только для тестирования
Linux dbgutil более поздняя точка ветвления libreoffice-x-y -> более поздний master TDF: репозиторий 2.6 GB dbgutil[5]

Приготовления

Ручная установка (скачивание архива tar)

Во-первых, вы должны инсталлировать Linux 64-bit. Инсталляция в виртуальной машине тоже будет работать.

Distro 43all 43only
Ubuntu 13.10 (Saucy) необходимо установить libjpeg62 для включены версий старше 3.5 может работать установленный по умолчанию
Ubuntu 12.04 LTS (Precise) необходимо установить libjpeg62 для включены версий старше 3.5 может работать установленный по умолчанию
openSUSE 12.1 нет  ?
Fedora собрать libjpeg8 из исходного кода и установить LD_PRELOAD (для версий старше 3.5)  ?

Затем установите зависимости для вашего дистрибутива:

> sudo apt-get install git libjpeg62 # ubuntu

Затем, скачайте архив bibisect (выбрать здесь) и распакуйте его.

Для 42all команда распаковки выглядит как:

> tar -xf bibisect-42all.tar.xz

Вы также можете проверить подлинность и целостность файлов. Для этого вам понадобится GPG-ключ с https://launchpad.net/~bjoern-michaelsen. Для примера,

> gpg --keyserver keyserver.ubuntu.com --recv-keys XXXXXXXX # замените XXXXXXXX на OpenPGP ключ с веб-страницы
> gpg --verify bibisect-42all.tar.xz.sig

Первое скачивание будет занимать несколько гигабайт (12 гигабайт для 43all). Обновления занимают меньше места.

Поиск места появления регрессии в LibreOffice

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

> git checkout latest
> ./opt/program/soffice

Если ошибка не воспроизводится с этой версией, оставьте комментарий "Regression does not appear in latest version of bibisect-42all.tar.xz and must be younger" ("Ошибка не появляется в последней версии в bibisect-42all.tar.xz и должна быть новее") и добавьте слова bibisected и bibisectednewer в поле статуса whiteboard. Если ошибка воспроизводится, тогда можно продолжить.

Тогда воспользуйтесь самой старой сборкой включенной в загрузку и проверьте, присутствует ли регрессия в ней:

> git checkout oldest
> ./opt/program/soffice

Если ошибка существует в этой сборке, это не регрессия в окружении, которое покрывается загрузкой, .

Если ошибка уже присутствует на данном этапе, это не регрессия в диапазоне, на который распространяется загрузка, но очень старая ошибка. Если вы используете 43all репозиторий, то поместите комментарий к отчету об ошибке "Regression does appear in oldest version of bibisect-42all.tar.xz and must be older" ("Регрессия появляется в версии старше bibisect-43all.tar.xz и должна быть старше"), добавите слово prebibisect в поле статуса whiteboard и установить версию LibreOffice 3.5beta0 (является самой ранней доступной версией). Если ошибка по-прежнему не воспроизводится, продолжайте.

Если ошибка не воспроизводится, это регрессия в диапазоне покрываемой загрузкой, и мы можем "загнать в угол" её. Выполните:

> git bisect start latest oldest

Для начала поиск места появления регрессии. Затем повторяйте эти команды:

> ./opt/program/soffice
> git bisect good # если ошибка не отображается
> git bisect bad  # если ошибка присутствует
> git bisect skip # если вы не можете пройти в программе достаточно далеко, чтобы попробовать воспроизвести ошибку

(Может случиться так, что выбранная версия не будет запускаться. Это происходит из-за того, что нельзя гарантировать успешную работу версии, даже не смотря на то, что для bibisect используются только работающие версии.)

После нескольких повторений, git сообщит вам что-то вроде этого:

 9625329ea5a7e3e8475cd21c07726beec20573bd is the first bad commit
 commit 9625329ea5a7e3e8475cd21c07726beec20573bd
 Author: Bjoern Michaelsen <bjoern.michaelsen@canonical.com>
 Date:   Thu Dec 8 12:29:59 2011 +0100

   source-hash-2d19e9bb07ccff3134f855812dddfda5c07b1fe4
       
   commit 2d19e9bb07ccff3134f855812dddfda5c07b1fe4
   Author:     Jan Holesovsky <kendy@suse.cz>
   AuthorDate: Wed Nov 16 14:17:03 2011 +0100
   Commit:     Jan Holesovsky <kendy@suse.cz>
   CommitDate: Wed Nov 16 14:21:33 2011 +0100
       
     Kill one usage of chrel.sed to fix build.

Приложите это (линия source-hash-2d19e9bb07ccff3134f855812dddfda5c07b1fe4 является очень важной тут) и сделайте вывод:

> git bisect log

Который должен выглядеть примерно так:

git bisect start 'latest' 'oldest'
# good: [2faf4bc12ab490370d2196dedbc8091f9b09d0a5] source-hash-418a35f4861e863feb39eec73f4a39a87fbcb1f3
git bisect good 2faf4bc12ab490370d2196dedbc8091f9b09d0a5
# bad: [b6fca7e58854bc617c5fc9a75d1c1720b0d7e1a4] source-hash-ce60138d339a5eb2a174a5d27063249acf2cac42
git bisect bad b6fca7e58854bc617c5fc9a75d1c1720b0d7e1a4
# good: [0a28a62d53e996cf66d86e9bfb63ddc6ade75b7e] source-hash-71cbcb62028295a98ceee60cb4c4ee425bafcd2e
git bisect good 0a28a62d53e996cf66d86e9bfb63ddc6ade75b7e
# bad: [9625329ea5a7e3e8475cd21c07726beec20573bd] source-hash-2d19e9bb07ccff3134f855812dddfda5c07b1fe4
git bisect bad 9625329ea5a7e3e8475cd21c07726beec20573bd
# good: [89d91bb6074026dc0894bcdc6aaf8f6124102da7] source-hash-fb754a0df859e30255c25af8fa19bfaa75f257e7
git bisect good 89d91bb6074026dc0894bcdc6aaf8f6124102da7

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

Теги в репозиториях bibisect

Репозиторий 42all тэги типа last35onmaster, last36onmaster, которые маркируют последние сборки на ветке master до того как релиз был ответвлён. Если вы имеете ошибку, которую вы уже о которой знаете что она воспроизводится между 4.0 и 4.1, вы мжете сделать следующим образом:

> git bisect start last41onmaster last40onmaster

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

особенности репозитория ежедневных сборок dbgutil

Каждая версия имеет файл build-info.txt, и первая строка файла содержит source-hash который говорит о сборке. Это будет полезно, если вы включите исходные хэши последней хорошей версии и первый плохой в вашем докладе о результатах тестирования bibisect.

Не доступно для поиска

Некоторые ошибки не доступны для поиска при помощи Bibisect. Это включает:

  • Ошибки, которые не воспроизводятся на GNU/Linux
  • Ошибки, которые предшествуют покрытию в сборке Bibisect (Мы работаем над расширением покрытия)
  • Ошибки, которые зависят от параметров создания не включен в сборки TDF (например, ошибки в -kde)

Еслиa ошибка с bibisectrequest в поле статуса whiteboard оказывается не пригодной для поиска при помощи Bibisect, оставьте комментарий на ошибки объясняя, почему мы не можем использовать Bibisect, и заменить bibisectrequest на NotBibisectable в поле статуса whiteboard.

Выбор ошибки

Выберите ошибку нуждающуюся в поиске при помощи Bibisect

Следующие ошибки в поле whiteboard с записью bibisectrequest ожидают обработки:

Failed to load RSS feed from https://bugs.documentfoundation.org/buglist.cgi?list_id=145560&product=LibreOffice&query_format=advanced&status_whiteboard=bibisectrequest&status_whiteboard_type=allwordssubstr&title=Bug%20List&ctype=atom&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED: Error parsing XML for RSS Открыть этот лист в Bugzilla

Кроме того, для всех нерешенных регрессий в LibreOffice можно попытаться использовать bibisecting.

Поиск ошибок уже прошедших проверку на Bibisect

Ссылки на запросы в Bugzilla смотрите тут.

С учетом указанной выше информации добавленой к ошибке разработчик знает, что регрессия появилась между фиксациями fb754a0df859e30255c25af8fa19bfaa75f257e7 (good) and 2d19e9bb07ccff3134f855812dddfda5c07b1fe4 (bad) в мастере.

> git log fb754a0df859e30255c25af8fa19bfaa75f257e7..2d19e9bb07ccff3134f855812dddfda5c07b1fe4

В репозитории исходного кода будет показано 128 фиксаций в том числе та, которая спровоцировала ошибку. Это сильно облегчает поиск для разработчиков, и ускоряет исправление ошибки.

Подробнее можно посмотреть:

Особые ситуации

Работа в отдельном профиле пользователя

Чтобы создать отдельный каталог пользователя в /tmp/ (который будет автоматически удалён при следующей перезагрузке системы):

> ./opt/program/soffice -env:UserInstallation=file:///tmp/soffice-bisect

Если вы хотите, чтобы каждый запуск программы создавал новый каталог с хэш-кодом фиксации git, вы можете добавить в конец имени каталога $(git rev-parse HEAD). Для примера:

> ./opt/program/soffice \
>     -env:UserInstallation=file:///tmp/soffice-bisect-$(git rev-parse HEAD)

Finding a fix

Иногда ошибка неочевидным путём является побочным эффектом другой (возможно маленькой) ошибки. В таких случаях ошибка может быть исправлена на ветке master, но не внесена в основную ветку. Вы можете найти исправление таким же способом как и ошибку, кроме того, что вам нужно вводить git bisect good за git bisect bad и наоборот. Если исправления небольшие и достаточно важные, это может легко быть перенесено в основную ветку.

Поиск проблем и их решение

Пожалуйста, добавьте вашу проблему и способ её решения.

Невозможно извлечь файлы

Если вы не можете извлечь файлы (вы полчите сообщение об ошибке). Попробуйте переименовать файл *.tar.lzma в *.tar.xz.

Появляется ошибка, что LibreOffice изменён

Проблема / Сообщение:

error: Your local changes to the following files would be overwritten by checkout:
  opt/program/pythonloader.pyc
  opt/program/uno.pyc
  opt/program/unohelper.pyc
Please, commit your changes or stash them before you can switch branches.
Aborting

Решение:

> git checkout .

Это решит проблему. После этого вы можете начать следующий тест как обычно:

> git bisect good # or git bisect bad

Если это не помогло решить проблему, попробуйте:

> git clean -fd
> git reset --hard

The ultimate repair is to delete everything except one .git/ hidden folder, and do git checkout oldest.


Не удается запустить soffice

Проблема: После попытки запустить soffice, вы можете получить сообщение от ошибке "unexpected operator terminate called after throwing an instance of 'com::sun::star::uno::DeploymentException'

Решение: Сбросьте пользовательский профиль. Если вы работаете с основным пользовательским профилем, сделайте его копию, и удалите ~/.config/libreoffice, ошибка должна исчезнуть. После работы с Bibisect восстановите профиль из резервной копии.

При тестировании, лучше не использовать основной пользовательский профиль, чтобы не пришлось потом сожалеть о потерянных настройках и времени.


Дополнительная информация

Примечания

  • QA/Bibisect/Implementation - подробная информация о создании архивов для bibisect;
  • Bibisectzilla - информации о слиянии всех наших bibisect хранилищ в одно;
  • Bibisect GUI - мы хотим сделать графический интерфейс для bibisect.

Примечание

  1. Могут быть до сих пор доступны на http://people.canonical.com/~j-lallement/libreoffice/binrepo/
  2. другие 250+ ошибок упоминаются в bibisect, но не имеют тегов. Возможно, просто забыли пометить
  3. сейчас хранится в http://people.canonical.com/~bjoern/bibisect/bibisect-42all.tar.xz , но скоро будут удалены как устаревшие
  4. он один заменяет оба следующие, более мелкие репозитории: в диапазоне от 4.2 до alpha1 и в диапазоне от alpha1 до точки ветвления 4.3 -- скорее всего, будет удален в ближайшее время
  5. Бьорн (Bjoern) создаёт постфактум репозиторий (после создания меток alpha или после ответвления) в автоматическом и понятным способом, с оптимизацией (например, отключением SDK). Миклош (Miklos) создаёт репозиторий на ежедневной основе (отсюда и название) из уже фрагментированной сборки. Поэтому его сборки в долгосрочной перспективе, вероятно, менее полезно (пока вы не охотитесь на проблемы dbgutil). Однако они очень полезны при отслеживании ошибок, которые произошли, например, на прошлой неделе, если меток в репозитории ещё не было. Это также значит, что если вы клонируете упоминаемый репозиторий через несколько дней после ответвления, он содержит только несколько фиксаций (commit). В этом случае вам может быть интересны старые версии. Это также причина, почему число в столбце размера постоянно изменяется.