Скрипты проекта
В репозитории скрипты сгруппированы по каталогам в scripts/. Скрипты вызывают CMake presets и Docker-сборки, не дублируя логику конфигурации.
Документация CI
- CI_PIPELINE.md — конвейер GitLab, стадии, архитектура
- CI_SCRIPTS.md — справочник по каждому файлу в
scripts/ci - Обслуживание диска Windows (runner):
scripts/ci/docker-prune-keep-bases.ps1— CI_SCRIPTS.md §7 (RU), EN
Структура
scripts/
config/
supported-os.sh
ci/
lint.sh
sanitize.sh
static-analysis.sh
coverage.sh
tests.sh
examples.sh
docs.sh
run-task.sh
run-all.sh
generate-gitlab-os-matrix.sh
docker-build-ci.sh
docker-build-dev.sh
docker-build-release.sh
os-image-build-push.sh
os-full-check.sh
dev/
build-debug.sh
build-docs.sh
build-examples.sh
coverage.sh
pre-push.sh
pre-push-docker.sh
docker/
docker-paths.sh
build-ci-image.sh
build-dev-only-image.sh
build-release-only-image.sh
build-images.sh
release/
build.sh
build-examples.sh
test.sh
install.sh
setup/
install-doxygen-llvm.sh
install-deps-ubuntu-22.04.sh
install-deps-ubuntu-24.04.sh
install-deps-debian-13.sh
install-deps-fedora-42.sh
install-deps-fedora-43.sh
verify-installers-docker.sh
install-deps-for-current-os.shПомеченные секции джобов по одной ОС в .gitlab-ci.yml (между комментариями BEGIN generated / END generated) генерируются из scripts/config/supported-os.sh (см. ниже); правьте только supported-os.sh и скрипты установки install-deps-<slug>.sh, затем выполните generate-gitlab-os-matrix.sh --write.
Поддерживаемые ОС и GitLab matrix
Единый список целевых ОС (slug и образ ID:VERSION для Docker) задается в scripts/config/supported-os.sh (SUPPORTED_OS_ENTRIES, DEFAULT_TARGET_OS_SLUG). Его используют scripts/docker/docker-paths.sh, Docker helper-скрипты и проверки установщиков.
В GitLab CI для каждой ОС задан отдельный джоб (docker-images-<slug>, os-system-validation-main-<slug>) в .gitlab-ci.yml между маркерами BEGIN generated / END generated (без parallel.matrix, чтобы схемы в IDE не ругались). Не правьте сгенерированные строки вручную — они должны совпадать с выводом генератора.
Путь: scripts/ci/generate-gitlab-os-matrix.sh
- без аргументов — печатает сгенерированные блоки в stdout;
--write— перезаписывает помеченные секции в.gitlab-ci.yml;--check— сравнивает маркеры в закоммиченном файле с выводом генератора (используется в джобеgitlab-os-matrix-checkв.gitlab-ci.yml).
После изменения scripts/config/supported-os.sh (или добавления scripts/setup/install-deps-<slug>.sh) выполните:
bash scripts/ci/generate-gitlab-os-matrix.sh --write
и закоммитьте обновленный .gitlab-ci.yml вместе с правками.
Практика при добавлении новой ОС
Ниже — типовой порядок действий при появлении новой целевой системы в матрице (не только правка списка в supported-os.sh).
- Запись в
supported-os.sh. Добавьте элемент вSUPPORTED_OS_ENTRIESв виде"<slug>|<ID>:<VERSION>". ЗначенияIDиVERSION_IDдолжны совпадать с тем, что дает/etc/os-releaseв базовом Docker-образе (дляKEY="${ID}:${VERSION_ID}"в скриптах). - Установщик зависимостей для CI. Создайте
scripts/setup/install-deps-<slug>.sh(разумно взять за основу ближайшую ОС и поправить имена пакетов/репозитории). После шага 1 скриптinstall-deps-for-current-os.shначнет выбирать его дляdockerfile/Dockerfile.ciбез отдельногоcase. - Минимальный toolchain для release. Допишите ветку для того же
ID:VERSIONвscripts/docker/install-release-toolchain.sh(образdockerfile/Dockerfile.releaseвызывает только этот скрипт; без новой ветки сборка release на новой базе завершится ошибкой, даже если пункт 1 выполнен). - GitLab matrix. Выполните
bash scripts/ci/generate-gitlab-os-matrix.sh --writeи включите в коммит обновленный.gitlab-ci.yml. - Дефолт и ссылки в
.gitlab-ci.yml. Если меняете «главную» ОС для переменных по умолчанию, обновитеDEFAULT_TARGET_OS_SLUGвsupported-os.shи проверьте вручную поля в.gitlab-ci.yml: напримерTARGET_OSв джобахos-system-validation-main-*(ручной запуск на default branch), а такжеDOCKER_CI_IMAGE/DOCKER_DEV_IMAGE/DOCKER_RELEASE_IMAGEв секцииvariables, если там зашит slug образа. - Проверка. Запустите
bash scripts/setup/verify-installers-docker.sh <slug>и при необходимости локальную сборку образов, напримерTARGET_OS=<slug> bash scripts/docker/build-images.sh.
Общие рекомендации
- Запускайте скрипты из корня репозитория.
- Для надежности используйте явный вызов через
bash. - Большинство параметров настраивается через переменные окружения.
- Для полного набора скриптов требуются инструменты:
cmake,ninja,clang-format(пин 18.1.8 через PyPI вinstall-clang-format-ci.sh),codespell,doxygen,graphviz, LaTeX toolchain (pdflatex/makeindex),docker(для docker-скриптов).
Скрипт: pre-push проверки
Путь: scripts/dev/pre-push.sh
Назначение:
- проверка базовых инструментов (
cmake,ninja,codespell); - чистая локальная сборка;
format-checkиspell-check;- сборка и тесты для
devиrelease-ci.
Запуск:
bash scripts/dev/pre-push.shПараметры:
JOBS— количество потоков для сборки (по умолчаниюnproc).
Пример:
JOBS=8 bash scripts/dev/pre-push.sh
Скрипт: простая Debug-сборка
Путь: scripts/dev/build-debug.sh
Назначение:
- конфигурация preset
dev; - сборка проекта в режиме Debug.
Запуск:
bash scripts/dev/build-debug.shПараметры:
JOBS— количество потоков для сборки.
Скрипт: локальная сборка документации
Путь: scripts/dev/build-docs.sh
Назначение:
- конфигурация preset
dev(дляcompile_commands.json, нужного libclang в Doxygen); - запуск
scripts/docs/build-doxygen-lang-variants.sh— тот же пайплайн, что иscripts/ci/docs.sh, с выводом вbuild/dev/docs/{html,xml,latex,pdf}/{en,ru}/(по умолчанию английский и русский).
Запуск:
bash scripts/dev/build-docs.shПараметры:
DOXYGEN_LANG_VARIANTS— необязательно; по умолчаниюen=english;ru=russian. Пример одного языка:DOXYGEN_LANG_VARIANTS=en=english.DOXYGEN_SKIP_DOT_GRAPHS,DOXYGEN_SKIP_REFMAN_PDF— как в CI (ускорение итераций).
Вывод в духе CI в build/docs/.../{en,ru}/: bash scripts/ci/docs.sh.
Цель CMake docs (только при BUILD_MCSS_DOCS=ON) использует cmake/docs.cmake для одного языка в build/dev/docs/html (плоская структура); язык — DOXYGEN_DOCUMENTATION_LANGUAGE.
Скрипт: локальное покрытие
Путь: scripts/dev/coverage.sh
Назначение:
- конфигурация и сборка preset
coverage; - запуск тестов;
- генерация отчета покрытия.
Запуск:
bash scripts/dev/coverage.shПараметры:
JOBS— количество потоков для сборки.
Скрипт: pre-push проверки в Docker
Путь: scripts/dev/pre-push-docker.sh
Назначение:
- запускает тот же набор проверок, что и
scripts/dev/pre-push.sh; - выполняет проверки внутри локального dev-образа Docker;
- монтирует текущий репозиторий в контейнер и запускает с вашим UID/GID.
Запуск:
bash scripts/dev/pre-push-docker.shПараметры:
DEV_IMAGE_TAG— полное имя dev-образа (по умолчанию черезscripts/docker/docker-paths.sh, напримерcircuitgen/generator/ubuntu-24.04/dev:local);TARGET_OS— см.scripts/docker/docker-paths.sh;JOBS— количество потоков для сборки внутри контейнера.
Пример:
TARGET_OS=ubuntu-22.04 DEV_IMAGE_TAG=circuitgen/generator/ubuntu-22.04/dev:local JOBS=8 bash scripts/dev/pre-push-docker.sh
Вспомогательный модуль: пути Docker-образов
Путь: scripts/docker/docker-paths.sh
Назначение:
- единые правила имен образов, совпадающие с
.gitlab-ci.yml:$DOCKER_URL/$IMAGE_OS_SUFFIX/ci:<tag>,$DOCKER_URL/$IMAGE_OS_SUFFIX/dev:<tag>,$DOCKER_URL/$IMAGE_OS_SUFFIX/release:<tag>; - выбор ОС через
TARGET_OSилиDOCKER_CI_SYSTEM; - используется скриптами в
scripts/docker/,scripts/ci/docker-build-*.sh,scripts/ci/docs.sh,scripts/ci/run-task.sh,scripts/dev/pre-push-docker.sh.
Скрипт: сборка Docker образов (CI + DEV + RELEASE)
Путь: scripts/docker/build-images.sh
Назначение:
- собрать локальный CI-образ из
dockerfile/Dockerfile.ci; - собрать локальный dev-образ из
dockerfile/Dockerfile.devна базе CI-образа; - собрать локальный release-образ из
dockerfile/Dockerfile.releaseна легком базовом образе ОС (только компилятор, CMake, Ninja, git и т.п. — без Doxygen/TeX и прочего dev/CI-стека).
Имена образов задаются через scripts/docker/docker-paths.sh и совпадают с .gitlab-ci.yml: $DOCKER_URL/$IMAGE_OS_SUFFIX/ci:<tag>, $DOCKER_URL/$IMAGE_OS_SUFFIX/dev:<tag>, $DOCKER_URL/$IMAGE_OS_SUFFIX/release:<tag>.
Запуск:
bash scripts/docker/build-images.shПеременные окружения:
DOCKERFILE_CI_NAME(по умолчаниюdockerfile/Dockerfile.ci);DOCKERFILE_DEV_NAME(по умолчаниюdockerfile/Dockerfile.dev);DOCKERFILE_RELEASE_NAME(по умолчаниюdockerfile/Dockerfile.release);DOCKERFILE_CI(алиас для обратной совместимости, приоритетнееDOCKERFILE_CI_NAME);DOCKERFILE_DEV(алиас для обратной совместимости, приоритетнееDOCKERFILE_DEV_NAME);DOCKERFILE_RELEASE(алиас для обратной совместимости, приоритетнееDOCKERFILE_RELEASE_NAME);DOCKER_URL(по умолчаниюcircuitgen/generator, либо${REGISTRY_URL}/${GROUP_NAME}/${REPO_NAME}если заданы);TARGET_OS— slug изscripts/config/supported-os.sh(задаетDOCKER_CI_SYSTEM);DOCKER_CI_SYSTEM(по умолчаниюubuntu:24.04; из него выводитсяIMAGE_OS_SUFFIX);LOCAL_IMAGE_TAG— суффикс тега для локальных образов (по умолчаниюlocal);CI_IMAGE_TAG/DEV_IMAGE_TAG/RELEASE_IMAGE_TAG— полные имена образов (если не заданы, вычисляются из путей выше).
Пример:
TARGET_OS=fedora-42 bash scripts/docker/build-images.sh
Скрипт: сборка только Docker CI-образа
Путь: scripts/docker/build-ci-image.sh
Назначение:
- собрать только локальный CI-образ из
dockerfile/Dockerfile.ci.
Запуск:
bash scripts/docker/build-ci-image.shСкрипт: сборка только Docker dev-образа
Путь: scripts/docker/build-dev-only-image.sh
Назначение:
- собрать только локальный dev-образ из
dockerfile/Dockerfile.dev; - использовать уже существующий CI-образ как базовый.
Запуск:
bash scripts/docker/build-dev-only-image.shСкрипт: сборка только Docker release-образа
Путь: scripts/docker/build-release-only-image.sh
Назначение:
- собрать только локальный release-образ из
dockerfile/Dockerfile.release; - базовый образ задается через
DOCKER_CI_SYSTEM/TARGET_OS(BASE_IMAGEв Dockerfile), не через fat CI-образ.
Запуск:
bash scripts/docker/build-release-only-image.shСкрипты Release
scripts/release/build.sh
Оптимизированная release-сборка без тестов.scripts/release/test.sh
Release-сборка с тестами через presetrelease-ci.scripts/release/install.sh
Установка артефактов release-сборки.scripts/release/suggest-next-version.sh
Предлагаемый тегvX.Y.Zпо коммитам после последнего SemVer-тега (Conventional Commits); см. Versioning.md.
Примеры:
bash scripts/release/build.sh bash scripts/release/test.sh INSTALL_PREFIX=prefix/release bash scripts/release/install.sh bash scripts/release/suggest-next-version.sh --verbose
Скрипты установки зависимостей
scripts/setup/install-deps-ubuntu-22.04.sh
Устанавливает недостающие зависимости для Ubuntu 22.04.scripts/setup/install-deps-ubuntu-24.04.sh
Устанавливает недостающие зависимости для Ubuntu 24.04.scripts/setup/install-deps-debian-13.sh
Устанавливает недостающие зависимости для Debian 13 (trixie). Пинclang-format18.1.8 черезinstall-clang-format-ci.sh(колесо PyPI), как в остальных образах CI.scripts/setup/install-deps-fedora-42.sh
Устанавливает недостающие зависимости для Fedora Workstation 42.scripts/setup/install-deps-fedora-43.sh
Устанавливает недостающие зависимости для Fedora Workstation 43.
Все install-скрипты:
- проверяют текущий дистрибутив и версию;
- проверяют, какие пакеты уже установлены;
- устанавливают только недостающие пакеты;
- проверяют наличие
codespellи ставят его черезpip, если пакетный менеджер его не дал; - устанавливают
doxygenиз исходников с-Duse_libclang=ON(версия по умолчанию1.13.2), как вdockerfile/Dockerfile.ci.
Отдельный скрипт:
scripts/setup/install-doxygen-llvm.sh
Сборка и установка Doxygen с LLVM/libclang поддержкой.
Проверка install-скриптов в Docker-образах:
bash scripts/setup/verify-installers-docker.shПроверка в одном конкретном образе:
bash scripts/setup/verify-installers-docker.sh ubuntu-24.04
Проверяемые системы совпадают со списком slug в scripts/config/supported-os.sh (и с матрицей в помеченных секциях .gitlab-ci.yml после generate-gitlab-os-matrix.sh --write).
CI скрипты
Скрипты в scripts/ci/ используются в .gitlab-ci.yml и являются единым интерфейсом для CI-джобов.
Для локального запуска CI-этапов доступны два режима:
CI_RUNNER=local— запуск в текущей системе;CI_RUNNER=docker— запуск внутри локального CI-образа Docker.
Для scripts/ci/docs.sh дополнительно доступны параметры:
DOCS_RUNNER=auto|local|docker(по умолчаниюauto).DOXYGEN_LANG_VARIANTS— по умолчаниюen=english;ru=russian. Форматabbr=section1 section2;abbr2=...; для каждого варианта — отдельное деревоbuild/docs/{html,xml,latex,pdf}/<abbr>/.DOXYGEN_SKIP_DOT_GRAPHS,DOXYGEN_SKIP_REFMAN_PDF— передаются вcmake/docs-ci.cmake.DOXYGEN_ENABLED_SECTIONS— устаревшее значение по умолчаниюenglish, если явно не заданы варианты; при использованииDOXYGEN_LANG_VARIANTSсекции задаются для каждого варианта. Вcmake/docs-ci.cmakeвыставляетсяOUTPUT_LANGUAGE(русский, если для варианта секции ровноrussian, иначе английский).
Универсальные запускаторы
scripts/ci/run-task.sh <task>
Запускает один CI-этап (lint,sanitize,static-analysis,coverage,tests,examples,docs) в выбранном режиме.scripts/ci/run-all.sh
Запускает полный CI-пайплайн проверок:lint -> static-analysis -> sanitize -> coverage -> tests -> examples -> docs(локально по шагам; в GitLab часть job’ов параллельна).
Примеры:
# Запуск этапа в текущей системе CI_RUNNER=local bash scripts/ci/run-task.sh lint # Запуск этапа внутри локального Docker CI-образа CI_RUNNER=docker CI_IMAGE_TAG=circuitgen/generator/ubuntu-24.04/ci:local bash scripts/ci/run-task.sh tests # Полный прогон CI-этапов в Docker CI_RUNNER=docker CI_IMAGE_TAG=circuitgen/generator/ubuntu-24.04/ci:local bash scripts/ci/run-all.sh
Проверки и тесты
scripts/ci/lint.sh
Запускает форматирование и орфографические проверки через CMake-скрипты, а также валидирует.clang-formatи проверяет версиюclang-format.scripts/ci/sanitize.sh
Конфигурирует пресетci-sanitize, собирает и запускает тесты с санитайзерами.scripts/ci/static-analysis.sh
Собирает пресетci-static-analysis(clang-tidy при компиляции) и запускаетcppcheckпоcompile_commands.json(см. комментарии в скрипте).scripts/ci/coverage.sh
Конфигурирует пресетci-coverage, запускает тесты и генерирует coverage-отчет.scripts/ci/tests.sh
Собираетrelease-ci, устанавливает артефакты и запускает тесты с JUnit-отчетом.scripts/ci/examples.sh
Собирает примеры в конфигурации Debug (ci-examples-dev) и Release (release-examples), затем запускает цельrun-examples(см.examples/CMakeLists.txt,docs/).ru/ BUILDING.md scripts/ci/docs.sh
Генерирует документацию в CI черезcmake/docs-ci.cmakec включенным libclang-парсером Doxygen.
HTML черезm.css; по умолчанию каталогиbuild/docs/html/{en,ru},build/docs/xml/{en,ru}и т.д. Поддержкаdot(Graphviz) настраивается автоматически в CMake-генерации документации (HAVE_DOT/DOT_PATH). По умолчаниюDOXYGEN_LANG_VARIANTS="en=english;ru=russian"(см.scripts/docs/build-doxygen-lang-variants.sh). Поддерживаются языковые условные блоки Doxygen через алиасы\if english ... \endifи\if russian ... \endif(секции Doxygen\if). При локальном запуске по умолчанию использует Docker-образCI_IMAGE_TAG(по умолчаниюcircuitgen/generator/ubuntu-24.04/ci:localчерезscripts/docker/docker-paths.sh). Скрипт завершится с ошибкой, если обнаружит Doxygen без поддержкиCLANG_ASSISTED_PARSING.
Согласованность matrix GitLab
scripts/ci/generate-gitlab-os-matrix.sh
Обновляет помеченные секции матрицы в.gitlab-ci.ymlизscripts/config/supported-os.sh. В пайплайне джобgitlab-os-matrix-checkзапускает--check: при расхождении нужно выполнить--writeи закоммитить файл.
Docker образы в CI
scripts/ci/docker-build-ci.sh
Собирает и публикует CI-образ (в CI используется matrix по поддерживаемым ОС).scripts/ci/docker-build-dev.sh
Собирает и публикует dev-образ на базе соответствующего CI-образа той же ОС.scripts/ci/docker-build-release.sh
Собирает и публикует release-образ для выбранной ОС (легкий базовый образ, см.dockerfile/Dockerfile.release).
Оба Docker-скрипта поддерживают переменные окружения из .gitlab-ci.yml: DOCKERFILE_CI_NAME, DOCKERFILE_DEV_NAME, DOCKERFILE_RELEASE_NAME, DOCKER_CI_SYSTEM, DOCKER_CI_TAG, REGISTRY_URL, GROUP_NAME, REPO_NAME, DOCKER_URL, DOCKER_CI_IMAGE, DOCKER_DEV_IMAGE, DOCKER_RELEASE_IMAGE.
Проверки по ОС (matrix)
scripts/ci/os-image-build-push.sh
ДляTARGET_OSсобирает отдельный образ.../os-<target>:<tag>на базе соответствующей ОС, запускает внутри негоscripts/setup/install-deps-*.shи публикует образ в registry.scripts/ci/os-full-check.sh
Запускает в опубликованном OS-образе полный CI-прогонscripts/ci/run-all.sh(lint -> static-analysis -> sanitize -> coverage -> tests -> examples -> docs) и тем самым проверяет все шаги компиляции/тестов/документации.
Правила запуска в .gitlab-ci.yml:
- в
mainпроверки выполняются для всех поддерживаемых ОС; - в остальных ветках выполняется только
ubuntu-24.04.
English: Project scripts