6. Политики качества: rpmlint и автоматические проверки
Раздел руководства по RPM-пакетированию для openSUSE.
Три уровня проверок:
brp-check-suse- build root policy scripts после%install, до упаковки RPM. Например, сжатие man pages, debug info, rpath checks.post-build-checks- проверки build script-а как root по установленному результату.rpmlint- комплексный linting RPM/spec/source package.
rpmlint выводит E (error), W (warning), I (information). Не все E одинаковы: часть имеет высокий badness и валит build, часть требует review.
Локальная проверка:
osc build openSUSE_Tumbleweed x86_64 foo.spec
rpmlint foo.spec /var/tmp/build-root/*/home/abuild/rpmbuild/RPMS/*/*.rpm
Правильный rpmlintrc - это не мусорная корзина для предупреждений. Каждый фильтр должен отвечать на вопрос "почему это false positive или осознанное исключение".
# foo embeds test fixtures with intentionally executable snippets; not installed into PATH.
addFilter("foo.* executable-docs .*/usr/share/doc/packages/foo/tests/.*")
Частые ошибки:
wrong-script-interpreter- исправь shebang на/usr/bin/python3,/usr/bin/bash,/usr/bin/envтолько если есть причина.arch-dependent-file-in-usr-share- ELF/binary нельзя класть в/usr/share; используй%{_libexecdir}/%{name}.no-packager-tag- не добавляйPackager:; openSUSE spec guidelines прямо не рекомендует этот tag.hardlink-across-partition- не создавай hardlinks между разными top-level деревьями.shlib-policy-name-error- runtime shared library package должен соответствовать SONAME.invalid-spec-name- spec должен называться%{name}.spec.suse-logrotate-log-dir-not-packaged- пакет обязан владеть log directory или зависеть от пакета, который им владеет.
Проверка bundling:
find . -type f \( -name '*.a' -o -name '*.so' -o -name '*.jar' -o -name 'vendor.tar*' \) -print
licensecheck -r .
Bundled libraries/software запрещены по умолчанию; исключения нужны только с документированным обоснованием. Rust vendor crates - практическое исключение, но оно не отменяет audit и воспроизводимость.