Непрерывная интеграция
Общие сведения
Ваш 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:
Локальный запуск тестов
Используйте вспомогательный скрипт 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 jobgcc-build-codecov).
Артефакты: документация и табло
Документация: сначала запустите Doxygen (
doxygen Doxyfile), затем Sphinx (EN/RU) через цели CMakedocs_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.