Как вы программно определяете эквивалентность системы сборки в двоичном выводе?

Фон: Предположим, у вас есть два сервера, выступающие в качестве серверов сборки (Jenkins, если это имеет значение) для кода C / C ++. Оба сервера были построены с одинаковыми кикстартами, версиями ОС, библиотеками и т. Д. Код поддерживается в Git в двух ветках — Development и Release Candidate. Код в разработке является авторитетным и повышен до RC. Мерзавцы совпадают. Код, построенный на инфраструктуре разработчика, создает функционирующие двоичные файлы. Код, созданный в инфраструктуре RC, отсутствует (или, по крайней мере, при тестировании, по-видимому, в Dev обнаружены ошибки). Как бы вы доказали, что сборка Dev и сборка RC идентичны. Какие инструменты вы бы использовали? Что бы вы проверили? Какие метрики вы бы захватили? Как другие софтверные компании делают это? Это не теоретическое упражнение — я вынужден это доказать. Прочитал Проверка двух разных архитектур сборки (одна переписывает другую) функционально эквивалентна. ОС RHEL 6.2.

2

Решение

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

Однако на шаге 1 можно изменить конфигурацию сборки RC, чтобы она соответствовала конфигурации dev. Если получающиеся двоичные файлы не совпадают, это может дать некоторое представление о различиях в среде сборки. Большинство людей называют эту конфигурацию «бета».

Шаг 2 состоит в создании промежуточной сборки, которая имеет конфигурацию сборки Dev, но RC определяет. Убедитесь, что двоичные файлы различаются — вероятно, есть некоторый код # ifdef, который ведет себя по-другому в RC.

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

cd $BUILD
mkdir dev-bin beta-bin prerc-bin
make dev && mv $BINARIES dev-bin
make beta && mv $BINARIES beta-bin
make prerc && mv $BINARIES prerc-bin

Дифф и профит. Вы можете повторить через коробки сборки.

Я озадачен, почему у вас есть отдельная среда сборки для каждого этапа. Это, кажется, гарантированно подведет вас на периодической основе.

Мой самый успешный опыт всегда заключался в разработке конкретной сборки для всего диапазона итераций в данном каталоге сборки.

  1. Создать рабочую копию из системы контроля версий,
  2. Build Dev -> Test,
  3. Если исправления: применить, перейдите к шагу 2,
  4. Build RC -> Test,
  5. Если исправления: применить, перейдите к шагу 2,
  6. Построить Rel

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

1

Другие решения

Если существуют разные директивы препроцессора и разные параметры компиляции, то, скорее всего, они не идентичны.
Другая среда сама по себе может быть еще одним фактором, способствующим разному поведению.

Если вы видите другое поведение, чем мне жаль сообщать вам, что, вероятно, есть ошибка, и вам нужно ее устранить.

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

0

По вопросам рекламы [email protected]