1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-iceoryx

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
CONTRIBUTING.md 29 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 01:51 01c7879

Вклад в Eclipse iceoryx

Спасибо за интерес к этому проекту.

Описание проекта

В таких областях, как автомобилестроение, робототехника или игры, между различными частями системы необходимо передавать огромное количество данных. Если эти части фактически представляют собой разные процессы в операционной системе на базе POSIX, такой как Linux, это огромное количество данных должно передаваться через механизм межпроцессного взаимодействия (IPC). Подробнее об этом можно узнать на сайте Eclipse.

Соглашение участника Eclipse

Прежде чем ваш вклад будет принят командой проекта, участники должны подписать электронное соглашение участника Eclipse (ECA).

Коммиты, предоставленные не коммиттерами, должны иметь поле Signed-off-by в футере, указывающее, что автор знает о условиях, на которых вклад был предоставлен проекту. У не коммиттера также должен быть аккаунт в Eclipse Foundation и подписанное соглашение участника Eclipse (ECA).

Для получения дополнительной информации см. Справочник коммиттера Eclipse.

Контакты

Свяжитесь с разработчиками проекта через список «dev» проекта.

Запрос функций и ошибки

Мы любим пул реквесты! В следующих разделах рассматриваются большинство соответствующих вопросов. Для более крупных вкладов или архитектурных изменений мы просим вас:

или

  • Создать проектный документ и поднять его в отдельном пул реквесте заранее

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

Пожалуйста, убедитесь, что вы:

  1. Подписали Соглашение участника Eclipse
  2. Создали вопрос перед созданием ветки, например, Супер-пупер функция с номером вопроса 123
  3. Все ветки имеют следующий формат именования: iox-[вопрос]-branch-name, например, iox-123-супер-пупер-функция
  4. Все коммиты имеют следующий формат именования: iox-#[вопрос] Сообщение коммита, например, iox-#123 Реализовать супер-пупер функцию
  5. Все коммиты были подписаны с помощью git commit -s
  6. Файл iceoryx-unreleased.md в doc/website/release-notes обновляется с GitHub вопросом, который закрыт пул реквестом
  7. Вы открываете свой пул реквест по направлению к базовой ветке main
  8. Связываете пул реквест с соответствующим вопросом GitHub и устанавливаете метку соответственно

ПРИМЕЧАНИЕ: Для поддержки во время разработки вы можете использовать небольшие вспомогательные скрипты, см. git-hooks.

Экспериментальные функции

Большие функции или функции, где API ещё не ясен, могут быть реализованы с помощью флага функции IOX_EXPERIMENTAL_POSH. Эти функции не должны быть доступны в установленных заголовках, когда флаг функции IOX_EXPERIMENTAL_POSH не был установлен во время компиляции.

По возможности это должно быть достигнуто путём установки заголовков экспериментальной функции вместо ifdefs. С помощью этого подхода экспериментальные функции всё ещё могут быть собраны на всех целях на CI без указания флага функции IOX_EXPERIMENTAL_POSH и не требуют новых целей CI.

Экспериментальная функция должна находиться в пространстве имён experimental, а путь включения заголовка также должен содержать имя experimental.

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

Стратегия ветвления

main

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

Если требуются конструкции, создающие предупреждения clang-tidy, их можно подавить с помощью обоснования и либо NOLINTNEXTLINE(warning-type), либо NOLINTBEGIN(warning-type) и NOLINTEND(warning-type).

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

Кроме того, NOLINTBEGIN следует использовать только для как можно меньшего диапазона и, возможно, для всей функции, но не более.

Примеры

// NOLINTJUSTIFICATION нам требуется 'construct' для реализации XXX, а безопасное использование
//                         гарантируется через YYY
// NOLINTBEGIN(some-warning)
auto a = myLineOfCodeWithWarning();

Doxygen

Пожалуйста, используйте doxygen для документирования вашего кода.

Следующие комментарии doxygen необходимы для заголовков общедоступного API:

/// @brief краткое описание
/// @param[in] / [out] / [in,out] имя описание
/// @return описание

Для переопределения виртуальных методов можно использовать тег copydoc:

/// @copydoc BaseClass::method
/// @note Необязательно опишите некоторые особенности переопределения

Хороший пример форматирования кода и структуры doxygen можно найти в swe_docu_guidelines.md (WIP).

Внешние зависимости

Внешние зависимости, такие как STL или другие библиотеки, должны быть сведены к минимуму для iceoryx_posh и iceoryx_hoofs. Если вы считаете, что новая зависимость необходима, выполните следующие действия:

  1. Предварительно свяжитесь с сопровождающими, открыв проблему для обсуждения необходимости.
  2. Если принято, добавьте новый заголовок в tools/scripts/used-headers.txt, чтобы CI прошёл.

Устранение дублирования кода

В некоторых случаях код в конструкторе и операциях присваивания может быть сильно дублирован. Рекомендуется перенести этот дублированный код в отдельную функцию (например, copy_and_move_impl) для лучшего повторного использования. Кроме того, MoveAndCopyHelper в iceoryx/design (см. MoveAndCopyHelper) предлагает некоторые функции, которые упрощают этот процесс.

Структура папок

Структура папок сводится к следующему:

  • iceoryx_COMPONENT
    • cmake: все файлы CMake идут сюда, нужны для find_pkg()
    • doc: руководства и документация
    • include: публичные заголовки со стабильным API
      • internal: публичные заголовки с внутренним API, который может меняться довольно часто
    • source: файлы реализации
    • test: модульные и интеграционные тесты
    • CMakeLists.txt: отдельно собрать компонент
  • examples_iceoryx: Примеры описаны в iceoryx_examples

Весь новый код должен соответствовать структуре папок.

Как добавить новый пример

  1. Добавьте пример в «Список всех примеров».
  2. Создайте новый файл в doc/website/examples/foobar.md и добавьте его в doc/website/examples/.pages. Этот файл должен содержать только заголовок и включать ридми из /iceoryx_examples/foobar/README.md.
  3. Добавьте директиву add_subdirectory в iceoryx_meta/CMakeLists.txt в разделе if(EXAMPLES).
  4. Рассмотрите возможность использования geoffrey для синхронизации кода в кодовых блоках с соответствующими исходными файлами.
  5. Добавьте интеграционный тест (добавьте в качестве зависимости в package.xml и напишите launch_test для примера).
  6. Запишите asciicast и вставьте ссылку на изображение. Тестирование программного обеспечения

Для наших модульных и интеграционных тестов мы используем Google Test (gtest). Требуется совместимость с версией 1.10.0.

Ознакомьтесь с нашими рекомендациями по передовой практике написания тестов и руководством по установке для участников для их создания.

Модульные тесты (они же модульные)

Модульные тесты — это тесты чёрного ящика, которые проверяют общедоступный интерфейс класса. Они требуются для всего нового кода.

Каждому тестовому случаю нужен уникальный идентификатор (UUID согласно RFC 4122) в форме:

::testing::Test::RecordProperty("TEST_ID", "12345678-9ab-cdef-fedc-1234567890ab");

UUID можно сгенерировать, например, с помощью Python или инструмента командной строки:

import uuid
uuid.uuid4()
uuidgen -r

В редких случаях вы можете захотеть исключить случай GoogleTest из выполнения (например, спорадические сбои). При этом вам нужно добавить вызов макроса сразу после идентификатора теста:

::testing::Test::RecordProperty("TEST_ID", "12345678-9ab-cdef-fedc-1234567890ac");
GTEST_SKIP() << "@todo iox-#1234 Enable test once the API is supported";

Необходимы техническая причина и действительный номер заявки для отслеживания повторного включения (или удаления) теста.

Интеграционные тесты

Интеграционные тесты проверяют взаимодействие нескольких классов. Они необязательны для нового кода.

Сканирование покрытия

Чтобы убедиться, что предоставленный тестовый код покрывает рабочий код, вы можете выполнить сканирование покрытия с помощью gcov. Отчётность выполняется с использованием lcov и htmlgen. Вам потребуется установить следующие пакеты:

sudo apt install lcov

У нас есть несколько уровней тестирования для покрытия тестами: unit, integration, component и all для всех уровней тестирования вместе. Вы можете создавать отчёты для этих различных уровней тестирования или для всех тестов. Покрытие осуществляется с помощью gcc. Сканирование покрытия применяется к уровню качества 3 и частично к уровню 2 с покрытием ветвей.

Чтобы создать отчёт о покрытии, iceoryx необходимо скомпилировать с флагами покрытия, а тесты должны быть выполнены. Вы можете сделать это одной командой в папке iceoryx, например:

./tools/iceoryx_build_test.sh clean build-all -c <testlevel>

При желании вы можете использовать опцию build-all, чтобы получить покрытие для расширений, таких как C-Binding. Флаг -c указывает, что вы хотите создать отчёт о покрытии и требует указать уровень тестирования. По умолчанию уровень тестирования установлен на all.

./tools/iceoryx_build_test.sh clean debug build-all -c unit

Примечание: iceoryx должен быть собран как статическая библиотека для работы с флагами gcov. Скрипт делает это автоматически.

Флаг -с unit предназначен для создания отчётов только для модульных тестов. В скрипте tools/scripts/lcov_generate.sh начальное сканирование, фильтрация и генерация отчётов выполняются автоматически.

Все отчёты хранятся локально в build/lcov в виде HTML-отчёта (index.html). В GitHub мы используем Codecov для общей отчётности о покрытии кода. Codecov даёт краткий обзор покрытия кода и также указывает в запросах на вытягивание, если вновь добавленный код не покрыт тестами. Если вы хотите увидеть подробные HTML-отчёты для конкретных запросов на вытягивание или веток, вы можете проверить здесь.

Юридические вопросы и соответствие требованиям

Безопасность и надёжность

Разработчики iceoryx стремятся к соответствию ASIL-D. ISO26262 — хороший источник информации, если вы хотите узнать больше об автомобильной безопасности. На CppCon 2019 было представлено хорошее вводное видео.

Если вы хотите сообщить об уязвимости, пожалуйста, используйте процесс Eclipse.

Статический анализ кода

Разработчики iceoryx имеют партнёрство с Axivion и используют их Axivion. Suite для запуска статического анализа кода.

Для группировки проблем по наборам правил используются метки Github:

Набор правил Метка Github Приоритет
Adaptive AUTOSAR C++14 AUTOSAR :star::star::star:
SEI CERT C++ 2016 Coding Standard CERT :star::star:
MISRA C++ 2008 MISRA :star:

Если одно из правил не соблюдается, добавляется обоснование следующим образом:

  • либо с комментарием в той же строке:
*mynullptr = foo; // AXIVION Same Line Ruleset-A1.2.3 : Краткое описание почему
  • либо с комментарием на одну строку выше:
// AXIVION Next Line Ruleset-A1.2.3 : Краткое описание почему
*mynullptr = foo;

Также можно подавить правило для всей конструкции:

// AXIVION Construct Ruleset-A1.2.3 : Краткое описание почему
class Foo
{
  void doSomething()
  {
    // Do something useful
  }
};

Заголовок

Каждый исходный файл должен иметь такой заголовок:

// Copyright (c) [ГОД НАЧАЛЬНОГО ВКЛАДА] - [ГОД ПОСЛЕДНЕГО ВКЛАДА] by [ВКЛАДЧИК]. Все права защищены.
//
// Лицензировано в соответствии с лицензией Apache версии 2.0 (далее «Лицензия»);
// вы не можете использовать этот файл, кроме как в соответствии с Лицензией.
// Вы можете получить копию Лицензии по адресу
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Если иное не требуется применимым законодательством или не согласовано в письменной форме, программное обеспечение,
// распространяемое в соответствии с настоящей Лицензией, распространяется на условиях «КАК ЕСТЬ»,
// БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ ЛЮБОГО РОДА, явных или подразумеваемых. См. Лицензию для конкретного языка, регулирующего разрешения и
// ограничения в рамках Лицензии.
//
// Идентификатор лицензии SPDX: Apache-2.0

Примечание: дата — это год или диапазон лет с разделением первого и последнего года диапазона дефисом. Например: «2004» (начальный и последний вклад в один и тот же год) или «2000–2004». Первый год — когда содержимое файла было впервые создано, а последний год — когда содержимое было последний раз изменено. Годы вклада должны быть упорядочены в хронологическом порядке, поэтому последняя дата в списке должна быть годом самого последнего вклада. Если между вкладами есть разрыв в один или несколько календарных лет, используйте запятую для разделения периодов вклада (например, «2000–2004, 2006»). Пример:

// Copyright (c) 2019 - 2020, 2022 by Acme Corporation. Все права защищены.
// Copyright (c) 2020 - 2022 by Jane Doe <jane@example.com>. Все права защищены.
//
// Лицензировано в соответствии с лицензией Apache версии 2.0 (далее «Лицензия»);
// вы не можете использовать этот файл, кроме как в соответствии с Лицензией.
// Вы можете получить копию Лицензии по адресу
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Если иное не требуется применимым законодательством или не согласовано в письменной форме, программное обеспечение,
// распространяемое в соответствии с настоящей Лицензией, распространяется на условиях «КАК ЕСТЬ»,
// БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ ЛЮБОГО РОДА, явных или подразумеваемых. См. Лицензию для конкретного языка, регулирующего разрешения и
// ограничения в рамках Лицензии.
//
// Идентификатор лицензии SPDX: Apache-2.0

Примечание: для скриптов или файлов CMake можно использовать соответствующий синтаксис комментариев # для заголовка.

Уровни качества

Цели CMake разрабатываются в соответствии с уровнями качества ROS. Несмотря на разработку некоторых целей в соответствии с автомобильными стандартами, такими как ISO26262, кодовая база сама по себе НЕ узаконивает использование в критически важных системах безопасности. Все требования более низкого уровня качества включены в более высокие уровни качества, например, уровень качества 4 включён в уровень качества 3.

Уровень качества 5

Этот уровень качества является уровнем качества по умолчанию. Он предназначен для примеров и вспомогательных инструментов.

  • Производное от уровня качества ROS. Уровень качества 5

  • Проверено двумя утверждающими.

  • Нет предупреждений компилятора.

  • Доступны лицензии и заявления об авторских правах.

  • Не требуется политика версий.

  • Не требуются модульные тесты.

Уровень качества 4

Этот уровень качества основан на уровне качества ROS 4:

  • Требуются базовые модульные тесты.
  • Сборка и запуск на Windows, MacOS, Linux и QNX.

Уровень качества 3

Этот уровень качества основан на уровне качества ROS 3:

  • Требуется Doxygen и документация.
  • Необходима спецификация тестов.
  • Нужна политика версий.

Уровень качества 2

Этот уровень качества предназначен для всех целей, которым нужна поддержка уровня 1 в ROS 2:

  • Необходимо иметь документ с декларацией качества (ссылка).

Уровень качества 1

Этот уровень качества основан на уровне качества ROS 1:

  • Нужна политика версий для стабильного API и ABI.
  • Имеются тесты ASPICE SWE.6.
  • Необходимы тесты производительности и политика регрессии.
  • Устранены предупреждения статического анализа кода Axivion.
  • Нужно обеспечить соблюдение стиля кода.
  • Модульные тесты имеют полное покрытие операторов и ветвей.

Уровень качества 1+

Этот уровень качества выходит за рамки уровней качества ROS и содержит расширения:

  • Имеется покрытие кода согласно MC/DC.

Учебные материалы, рекомендуемые для участников

  • «Эффективный C++» Скотта Мейерса.
  • «Модульное тестирование и паттерн Arrange, Act и Assert (AAA)» Пауло Гомеша.
  • «Стандартная библиотека C++» Николаи М. Йосуттиса.
  • «Современное программирование на C++ с разработкой через тестирование: код лучше, спите лучше» Джеффа Лангра.
  • «Современный дизайн C++: универсальное программирование и шаблоны проектирования» Андрея Александреску.
  • «Исключительный C++» Херба Саттера.
  • «Параллелизм C++ в действии» Энтони Уильямса.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-iceoryx.git
git@api.gitlife.ru:oschina-mirror/mirrors-iceoryx.git
oschina-mirror
mirrors-iceoryx
mirrors-iceoryx
main