Vsos JAVA WIP — различия между версиями

Материал из Rosalab Wiki
Перейти к: навигация, поиск
(init)
 
Строка 83: Строка 83:
  
 
[[Категория:Сборочная среда ABF]]
 
[[Категория:Сборочная среда ABF]]
 +
 
[[Участник:Mikhailnov|Михаил Н.]] ([[Обсуждение участника:Mikhailnov|обсуждение]]) 01:01, 16 июля 2020 (MSK)
 
[[Участник:Mikhailnov|Михаил Н.]] ([[Обсуждение участника:Mikhailnov|обсуждение]]) 01:01, 16 июля 2020 (MSK)

Версия 01:02, 16 июля 2020

Эта страница описывает процесс первичной сборки множества Java-пакетов в платформе rosa2019.1. Актуальна на июль 2020 года.

Ситуация и задача

Старый стек Java времен платформы rosa2016.1 для сборки выкачивает бинарные артефакты из maven-репозитория. Такое положение вещей недопустимо для обеспечения самодостаточной самопересобираемости репозитория, а на платформах rosa2019.x интернет в сборочнице выключен, такая сборка невозможна.

В связи с этим на ABF была создана группа https://abf.io/vsos_java, в которую была импортирована немалая часть Java-стека из Fedora. Стек начинается с двух пакетов:
- java-1.8-openjdk (сама явомашина), версия 1.8 пока основная, java-11-openjdk тоже существует и при необходимости применяется как компилятор для некоторых java-пакетов
- javapackage(s)-tools (генераторы Requires, Provides RPM и макросы для сборки java-пакетов)

Типовая проблема сборки — сильная закольцованность зависимостей: пакет А для сборки требует пакет Б, а пакет Б для сборки требует пакет А, также часто пакет требует сам себя для сборки. Эта проблема бутстрапа явостека решается так: в репозиторий по SSH (доступ по SSH к нужной директории есть у mikhailnov и slava86) подкладываются бинарные rpm-пакеты из Fedora, затем собираются родные пакеты rosa, и специальный скрипт удаляет (перемещает в ../__REMOVED) fc-пакеты, которые уже собраны в варианте для Росы. Вот этот скрипт mvjava.sh:

 #!/bin/bash
 _main(){
  for i in $(ls *.fc3*.rpm *.fc2*.rpm | sort -u); do
    fc_name=$(rpm -qp --qf '%{NAME}' $i 2>/dev/null);
    for j in $(ls | grep -E "^${fc_name}.*-.*rosa2019\.1.*\.rpm$") ; do
       rosa_name=$(rpm -qp --qf '%{NAME}' $j 2>/dev/null)
       mkdir -p ../___REMOVED/
       if [ "$fc_name" = "$rosa_name" ]; then mv -v $i $i ../___REMOVED/ ; fi
    done
  done
 }
 pushd скрыто/repository/rosa2019.1/x86_64/main/release
 _main
 popd

После прохода скрипта запускается пересоздание метаданных репозитория, либо в настройках репозитория, либо перепубликацией какого-нибудь пакета. Почти все пакеты noarch, сборка производится пока только для одной архитектуры — x86_64, затем сокпируем пакеты и пересоберем их.

В репозиторий были подложены почти все java-пакеты из Fedora, многие не используются, но пока лежат, многие были уже пересобраны в родном варианте, а fc перемещены в ../__REMOVED.

Если какой-то пакет из fc требует зависимостей, которые в Росе называются по-другому, то вставляем Provides в соответствующий родной пакет (важно: сразу и в 2019.1, и в 2019.05). Пример: https://abf.io/import/fonts-ttf-dejavu/commit/6270ee611ce8bedaefa6ee1b84f7904ceb5edfdd (в пределах разумного).

Периодически запускается массовая пересборка всех пакетов (https://abf.io/platforms/vsos_java_personal/mass_builds), а nginx на сервере настроен на логирование пакетов, скачиваемых из репозитория vsos_java_personal. По этому логу определяем список fc-пакетов, которые были использованы, их импортируем в SRPM, пытаемся собрать, повторяем процесс.

В будущем, вероятно, отошлем в Fedora Java Special Interest Group наши правки и патчи, чтобы помочь проекту Fedora привести java-стек в лучшее состояние, чем сейчас, и чтобы в будущем заимствовать обновления из Fedora. Для упрощения дальнейших завимствований diff спеков Федоры и Росы должен оставаться минимальным. Обычно только удаляем %changelog (он не используется в Росе) и добавляем тег "Group: Development/Java".

Задача: обеспечить самопересобираемость репозитория vsos_java полностью на пакетах rosa, без fc-пакетов.

Типовые проблемы сборки и их решения

Причины проблем

В Fedora, похоже, люди, которые занимались java, куда-то ушли, в результате многие пакеты не пересобирались несколкьо релизов и лежат в просто бинарном виде от предыдущих релизов (например, пакеты с суффиксом fc30 в репозитории fc32), либо были выкинуты из репозитория по причине непересобираемости и отсутствия мейнтейнера. Было выкинуто очень многое. Часть из этого мы по тем или иным причинам собираем у себя, чиня и/или костылируя сборку. Многие пакеты нужны только как сборочные зависимости для дргуих пакетов.

Также для java характерно ломать совместимость между мажорными версиями, а во многие проектах необходимые версии жестко прописаны в зависимостях maven/ant/gradle, поэтому просто так пакеты не обновляем мажорно, одно обновление поломает слишком многое. Т.е. обновить, например, с 8.1 до 8.3, обычно нормально, а вот с 8 до 9 ­— нет. В Fedora, похоже, часть пакетов обновили, потом пошла цепная реакция по разваливанию репозитория.

Не находит зависимость

Вариант 1

Некоторые пакеты собраны с --with=jp_minimal, Requires могут быть завернуты в %if %{with jp_minimal}. Маловероятно.

Вариант 2

Хочет java 11 для сборки. Прописать ее в BuildRequires. Пример: https://abf.io/vsos_java/byteman/commit/b477da6ae345ba98969263ed400250ba0333c616

Вариант 3

Править xml-файлы с зависимостями, пример: https://abf.io/vsos_java/takari-lifecycle/blob/4b48f0a439/0004-FTBFS-switch-to-modern-xmlunit.patch

Вариант 4

Править зависимости с помощью макросов %pom_*, иногда там просто ненужные зависимости, без которых сборка идет, иногда зависимости переименовывались, примеры: https://abf.io/vsos_java/maven-site-plugin/commit/9cff5f930d172f5116c86fb61d03bf5870c9c865
https://abf.io/vsos_java/findbugs/commit/9537f6ca3381458a36ad1584a8ecbd71f7be9767

Падает на этапе тестов

Добавить ключ -f к %mvn_build или починить по-нормальному.

Падает с руганью, что класс не переопределяет метод

Пример: "org.springframework.mock.web.MockServletContext is not abstract and does not override abstract method setResponseCharacterEncoding(java.lang.String) in javax.servlet.ServletContext"

Иногда требуется, чтобы в классе были переопределены все методы родительского класса. В новой версии сборочной зависимости, откуда класс наследуется, появляются новые методы, а они не переопределены, сборка падает. Решается добавлением заглушек с переопределением вновь появившихся функций, прототипы функций легко гуглятся, прототип должен совпадать с исходным (JLS 8.4.2, https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.2), иногда требуется добавить "import <...>", чтобы подгрузить "типы".

Примеры:
https://abf.io/vsos_java/springframework/blob/82b3428a81/0001-Fix-building-with-Servlet-4.x.patch
https://abf.io/vsos_java/infinispan/blob/632e87228d/0001-Fix-building-with-jboss-marshalling-1.4.patch
https://abf.io/vsos_java/infinispan/blob/632e87228d/0002-Fix-building-with-Lucene-7.patch

Несовместим с новой версией зависимости

Идем в апстрим, ищем проблемный файл (он мог быть перемещен, иногда проще склонировать git и воспользоваться find), смотрим git history и git blame, в веб-морде Github это удобно делать, часто находим решением, которое бекпортируем, т.е. клонируем git, git checkout тег_с_версией (его узнаем так: git tag | grep версия), вносим правки, git diff или git commit -a + git format-patch -1, прикладываем к пакету. Иногда прокатит просто взятие коммиты с git и прикладывание патчем или git cherry-pick. Если ничего не находим, чешим затылок, пытаемся исправить.

Примеры:
https://abf.io/vsos_java/eclipse-webtools/commit/9abc9d41c16f2818eb976ba88f7ad9fe439c4d9f
https://abf.io/vsos_java/jersey/commit/bc0f5d0b8bad91e63cadba1181676f60312b4256
https://abf.io/vsos_java/hibernate/commit/cc6f937c190670655d98408eea05205fd0aaed1e
https://abf.io/vsos_java/shrinkwrap-resolver/commit/894243e67be87e3f70c4e912f0136275b8e71ad2

Ошибка сборки из-за невалидного HTML в комментариях

Можно попробовать отключить сборку javadocs (%mvn_build --skip-javadoc) или запатчить, пример: https://abf.io/vsos_java/hibernate3/blob/70327f75f2/0001-Fix-invalid-HTML.patchМихаил Н. (обсуждение) 01:01, 16 июля 2020 (MSK)