Непрерывная интеграция

Общие сведения

Ваш pull request должен пройти все обязательные проверки CI перед ревью/слиянием. Конвейер проверяет форматирование и статический анализ, собирает проект на всех платформах, запускает функциональные тесты (потоки и MPI), измеряет производительность, собирает документацию и публикует артефакты (отчёт по покрытию, документация, табло).

Общая схема конвейера

  • Проверки pre-commit (быстро) — запускает хуки репозитория на изменённых файлах; исправляйте локально командой pre-commit run -a.

  • Сборки и тесты на платформах (Ubuntu, macOS, Windows) — Ubuntu (GCC/Clang, amd64+arm), macOS (Clang), Windows (MSVC/Clang‑CL); функциональные тесты через scripts/run_tests.py для потоков (--counts 1 2 3 4; расширенно 5 7 11 13) и процессов (MPI, --counts 1 2 3 4).

  • Санитайзеры (Ubuntu/Clang) — Address/UB/Leak; тесты запускаются с PPC_ASAN_RUN=1 для пропуска valgrind.

  • Покрытие (Ubuntu/GCC) — -D USE_COVERAGE=ON + gcovr; публикация в Codecov и загрузка артефакта cov-report (HTML).

  • Производительность (perf) — scripts/generate_perf_results.sh формирует build/perf_stat_dir; загружаются артефакты perf-stat (Linux) и perf-stat-macos (macOS).

  • Pages (документация и табло) — сборка Doxygen XML и Sphinx (EN+RU) + табло; в ветке master деплой вместе с покрытием на GitHub Pages.

  • Безопасность и статический анализ — clang‑tidy в PR (избегайте NOLINT/IWYU pragma), плановые CodeQL (C++/Python) и OpenSSF Scorecard.

Схема

The pipeline is illustrated below. Image is auto-generated by scripts/jobs_graph.py:

Конвейер CI (pre-commit → сборки/тесты на ОС → perf → pages)

Локальный запуск тестов

Используйте вспомогательный скрипт scripts/run_tests.py. Основные переменные окружения:

PPC_NUM_THREADS

Количество потоков (также экспортируется в OMP_NUM_THREADS).

PPC_NUM_PROC

Количество процессов MPI, которые нужно запустить.

PPC_ASAN_RUN

Установите 1, если включены санитайзеры, чтобы пропустить запуск под valgrind (по умолчанию 0).

PPC_IGNORE_TEST_TIME_LIMIT

Установите 1, чтобы отключить ограничение времени тестов (по умолчанию 0).

Режимы запуска: — --running-type=threads — backends с общей памятью (OpenMP/TBB/std::thread); — --running-type=processes — MPI‑тесты; — --running-type=performance — бенчмарки производительности (как в CI perf).

Примеры:

export PPC_NUM_THREADS=4
export PPC_NUM_PROC=2

# Threads (functional)
scripts/run_tests.py --running-type=threads --counts 1 2 4

# MPI (functional)
scripts/run_tests.py --running-type=processes --counts 2 4

# Performance (benchmarks)
scripts/run_tests.py --running-type=performance

Опции: — --counts запускает тесты последовательно для нескольких значений потоков/процессов; — --additional-mpi-args передаёт дополнительные флаги MPI‑ланчеру (например, --oversubscribe); — --verbose печатает каждую выполняемую команду.

Санитайзеры и покрытие локально

  • Санитайзеры (Linux): конфигурация с -D ENABLE_ADDRESS_SANITIZER=ON (и опционально UB/Leak), запуск тестов с PPC_ASAN_RUN=1.

  • Покрытие (Linux/GCC): конфигурация с -D USE_COVERAGE=ON, запуск тестов, затем генерация HTML через gcovr (см. команду в CI job gcc-build-codecov).

Артефакты: документация и табло

  • Документация: сначала запустите Doxygen (doxygen Doxyfile), затем Sphinx (EN/RU) через цели CMake docs_gettext, docs_update, docs_html.

  • Табло: сформируйте статистику (scripts/generate_perf_results.sh) и соберите цель табло или воспользуйтесь локально python3 scoreboard/main.py.

Диагностика и решения

  • Падает pre-commit: запустите локально pre-commit run -a (предварительно pre-commit install) и закоммитьте исправления.

  • Падает статический анализ (clang-tidy): поправьте замечания; не используйте NOLINT/IWYU pragma в коде задач.

  • Тесты не находятся/не запускаются: проверьте, что в settings.json включены нужные технологии и тесты существуют; см. Как создать, открыть и отправить на проверку вашу работу.

  • Превышены лимиты времени: уменьшите объёмы данных; используйте переменные окружения (Переменные окружения) вроде PPC_TASK_MAX_TIME/PPC_PERF_MAX_TIME; избегайте задержек/случайностей.

  • Проблемы с локальным запуском MPI: задайте PPC_NUM_PROC и попробуйте --additional-mpi-args="--oversubscribe".

  • Проблемы со сборкой документации: исправьте предупреждения RST; перед целями Sphinx выполните doxygen Doxyfile.

  • Падает job производительности: убедитесь, что ровно два перфтеста (task и pipeline) и длительность в пределах лимитов.

Примеры локального clang-tidy и gcovr

clang-tidy (статический анализ):

# Configure with compile_commands.json
cmake -S . -B build -G Ninja -D CMAKE_BUILD_TYPE=Release -D CMAKE_EXPORT_COMPILE_COMMANDS=ON
cmake --build build -j

# Single file analysis
clang-tidy -p build tasks/<last>_<initial>_<short>/src/<file>.cpp

# Optional: analyze all sources (if run-clang-tidy is available)
run-clang-tidy -p build -j $(nproc) || true

gcovr (покрытие, GCC):

# Configure with coverage flags (use GCC)
cmake -S . -B build -G Ninja -D USE_COVERAGE=ON -D CMAKE_BUILD_TYPE=Release
cmake --build build -j

# Run tests here (threads/processes/performance)
scripts/run_tests.py --running-type=threads --counts 1 2 4

# Generate reports (install gcovr if needed: python3 -m pip install gcovr)
mkdir -p cov-report
(cd build && gcovr --gcov-executable "$(which gcov-14 || which gcov)" \
      -r ../ \
      --exclude '.*3rdparty/.*' \
      --exclude '/usr/.*' \
      --exclude '.*tasks/.*/tests/.*' \
      --exclude '.*modules/.*/tests/.*' \
      --exclude '.*tasks/common/runners/.*' \
      --exclude '.*modules/runners/.*' \
      --exclude '.*modules/util/include/perf_test_util.hpp' \
      --exclude '.*modules/util/include/func_test_util.hpp' \
      --exclude '.*modules/util/src/func_test_util.cpp' \
      --xml --output ../coverage.xml \
      --html=../cov-report/index.html --html-details)

Подсказки по инструментам (версии и установка)

  • Версия clang-tidy — в CI используется clang-tidy 21. Локально лучше использовать ту же версию, чтобы избежать расхождений. На некоторых системах помощник может называться clang-tidy-21 или run-clang-tidy-21.

  • Linux — clang-tidy: установите из репозитория дистрибутива (например, apt install clang-tidy-21) или используйте Docker‑образ курса. gcovr: python3 -m pip install gcovr либо пакет дистрибутива. GCC: при сборке с GCC 14 используйте gcov-14 (как в CI).

  • macOS — clang-tidy: brew install llvm; бинарник: $(brew --prefix)/opt/llvm/bin/clang-tidy. При необходимости добавьте LLVM в PATH или вызывайте по полному пути. gcovr: python3 -m pip install gcovr или brew install gcovr.

  • Windows — clang-tidy: установите LLVM (Clang) или choco install llvm; убедитесь, что clang-tidy.exe доступен в PATH. gcovr: py -m pip install gcovr. Покрытие в основном поддерживается нашим CI на Linux/GCC — предпочтительнее генерировать отчёты на Linux.