Русский
Русский
English
Статистика
Реклама

Публикуем либку в maven central

Предисловие


Решил я что то сделать полезное. Был проект в котором мы должны были вместо старого сервиса сделать новый, но лучше. Сервис большой получился, 10к строк бизнесс-правил+код на джаве 15к строк. Сейчас уже раза в два больше. Но так как логики много и никто толком уже многого не помнит (за тем нас и призвали, что бы были тесты, доки и минимум багов) надо было сравнить старый сервис и новый. Что бы наши тестеры не умерли от старости, пытаясь все проверить я подумал и написал сервис, который дергал апи старого и нового, сравнивал и сливал разницу ответов в базу, что бы тестеры проверили и мы пофиксили разницу. Но вот проблема, на входе у нас много параметров и возможных их значений, это же миллиарды комбинаций будут, проверять несколько месяцев с полной нагрузкой, да и похожих много.
В итоге сначала была рождена идея взять и сократить возможные изменения параметров и вообще выкинуть некоторые из перебора, а потом была взята на вооружение Pairwise testing теория и она позволила закинуть все параметры и все значенеия и все проверить целиком.


Эта нехитрая теория утверждает, что если мы создадим тесткейсы где каждая пара параметров встречается хотя бы однажды, то так покроем чуть ли не 90% багов. При этом можно все так подобрать, что тест кейсов будут не миллиарды, а может несколько тысяч. Отличный результат! В итоге мы нашли сотни расхождений и даже кучу багов в легаси сервисе, а так же надоумлили сочинителей бизнесс-логики подумать о том, о чем они ранее вообще не задумывались, так как мы им просто подкинули новые интересные тест кейсы в которых было непонятно "как правильно".
Код написан, все работает, все счастливы, но выкидывать генератор тест кейсов как то не хотелось, потому я сел на выходных и написал либку, которая использовала тот же алгоритм, что и в рабочем сервисе, но была полностью оторвана от всего кроме lombok и написана в нерабочее время :) Потому, захотелось ее опубликовать под Apache 2.0 лицензией в мавен централе. Но это было настолько муторно и плохо описано, что я решил оставить себе памятку на хабре, что бы потом если вдруг, не мучиться второй раз.
Если вдруг надо, то либка опубликована тут: https://github.com/3DRaven/pairwiser
Итак, поехали.


Регистрируемся на sonatype.org


Напрямую в Maven Central опубликовать ничего не выйдет просто так, потому я воспользовался промежуточным сервисом sonatype.org Сначала нужно там зарегистрироваться.
У них есть документация как все зарелизить


https://central.sonatype.org/pages/releasing-the-deployment.html


Есть дока, которую надо обязательно посмотреть с требованиями к проекту и особенно к pom.xml


https://central.sonatype.org/pages/requirements.html


Готовим проект


Для этого нам понадобится: gnupg, maven release plugin да собственно и все. Причем в принципе без второго обойтись можно, да еще и релизы он делает в той же ветке git репы, в которой версию прибавил. Во всяком случае без возни. Так что второе по желанию. Возиться я не стал и его все же исползовал.


GNUpg


Это много кому известная штука для генерации ключей и много чего еще. И главная засада была в том, что ключи, которые по инструкции сделать можно из командной строки у меня потом не принял ни один сервер ключей публичных. Принимают и либо ошибку выдают, либо ключей там нет в итоге. Потому, вместо того что бы мучится с этим я рекомендую просто использовать GUI утилитку, хотя сначала я все делал с консоли и по докам. В итоге взял gpa и в два клика сделал себе ключи, которые сервера прожевали.
Там все просто:


  1. Открыть диспетчер ключей.
    Imgur
  2. Создание нового ключа Ctrl+N.
  3. Далее заполняем свое имя и это все.
  4. Это важный этап, что бы sonatype.org мог проверить после публикации подпись вашей либки, надо что бы ваш публичный ключ был на сервере публичных ключей. Для этого в меню "Сервер" выбираем "Отправить ключи".
    Imgur
    Ваш публичный ключ будет опубликован и его можно любой желающий взять что бы проверить подпись.

Готовим settings.xml


В этом файле хранятся глобальные настройки Maven. В него нам надо добавить пароль к нашей связке ключей и репозиторию sonatype.org (вашему аккаунту там), которую мы сделали на прошлом шаге.


<settings xmlns="http://personeltest.ru/away/maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://personeltest.ru/away/www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://personeltest.ru/away/maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">  <localRepository/>  <interactiveMode/>  <usePluginRegistry/>  <offline/>  <servers>    <server>      <id>ossrh</id>      <username>3DRaven</username>      <password>passwordForYourAccountInSonata</password>    </server>  </servers>  <mirrors/>  <proxies/>  <profiles>    <profile>      <id>ossrh</id>      <activation>        <activeByDefault>true</activeByDefault>      </activation>      <properties>        <gpg.executable>gpg2</gpg.executable>        <gpg.passphrase>passwordForGPGKey</gpg.passphrase>      </properties>    </profile>  </profiles>  <activeProfiles/></settings>

Обратите внимние на ossrh этот айдишник мы встретим потом в помнике.


Готовим pom.xml


Далее нужно настроить помник проекта так что бы он подписал проект, сделал javadoc, собрал source. Это обязательные требования к публикации. Пример будет кусками, в помнике либки можете полный глянуть


Обязательные элементы


<description>Generate array of minimal size of pairwise tests cover all pairs of changing params</description>    <url>https://github.com/3DRaven/pairwiser</url>    <inceptionYear>2020</inceptionYear>    <licenses>        <license>            <name>Apache License, Version 2.0</name>            <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>            <distribution>repo</distribution>            <comments>A business-friendly OSS license</comments>        </license>    </licenses>    <developers>        <developer>            <id>3DRaven</id>            <name>Renat Eskenin</name>            <email>email</email>        </developer>    </developers>    <scm>        <connection>scm:git:ssh://git@github.com:3DRaven/pairwiser.git</connection>        <developerConnection>scm:git:ssh://git@github.com:3DRaven/pairwiser.git</developerConnection>        <tag>HEAD</tag>        <url>https://github.com/3DRaven/pairwiser</url>    </scm>    <issueManagement>        <system>GitHub</system>        <url>https://github.com/3DRaven/pairwiser/issues</url>    </issueManagement>    <distributionManagement>        <snapshotRepository>            <id>ossrh</id>            <url>https://oss.sonatype.org/content/repositories/snapshots</url>        </snapshotRepository>        <repository>            <id>ossrh</id>            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>        </repository>    </distributionManagement>

Самое важное тут это distributionManagement. В нем указан как сервер, на который будет опубликован итоговый артефакт, так и id ossrh по которому будет найден в settings.xml логин и пароль на сервере. Далее нам нужно что бы наш артефакт был подписан, собран javadoc и source. Если три эти плагина не поместить именно в profiles раздел, то релиз плагин их запускать не будет. Так что они вписаны отдельно.


<profiles>        <!-- GPG Signature on release -->        <profile>            <id>release-sign-artifacts</id>            <activation>                <property>                    <name>performRelease</name>                    <value>true</value>                </property>            </activation>            <build>                <plugins>                    <plugin>                        <groupId>org.apache.maven.plugins</groupId>                        <artifactId>maven-gpg-plugin</artifactId>                        <version>${maven.gpg.plugin.version}</version>                        <executions>                            <execution>                                <id>sign-artifacts</id>                                <phase>verify</phase>                                <goals>                                    <goal>sign</goal>                                </goals>                            </execution>                        </executions>                    </plugin>                    <plugin>                        <groupId>org.apache.maven.plugins</groupId>                        <artifactId>maven-source-plugin</artifactId>                        <version>${maven.source.plugin.version}</version>                        <executions>                            <execution>                                <id>attach-sources</id>                                <goals>                                    <goal>jar-no-fork</goal>                                </goals>                            </execution>                        </executions>                    </plugin>                    <plugin>                        <groupId>org.apache.maven.plugins</groupId>                        <artifactId>maven-javadoc-plugin</artifactId>                        <version>${maven.javadoc.plugin.version}</version>                        <executions>                            <execution>                                <id>attach-javadocs</id>                                <goals>                                    <goal>jar</goal>                                </goals>                            </execution>                        </executions>                    </plugin>                </plugins>            </build>        </profile>    </profiles>

Так же использован плагин от sonatype.org, который публикует staging репозитрий на их сайте. Этот репозиторий видите только вы. После его публикации он будет в статусе Open и на нем запустятся автопроверки. Если они все пройдут, то можно будет его "закрыть", это такой статус репозитория у них. Среди проверок будет и проверка подписи и проверки требований sonatype.org к проектам.


<plugin>    <groupId>org.sonatype.plugins</groupId>    <artifactId>nexus-staging-maven-plugin</artifactId>    <version>${nexus.staging.maven.plugin.version}</version>    <extensions>true</extensions>    <configuration>        <serverId>ossrh</serverId>        <nexusUrl>https://oss.sonatype.org/</nexusUrl>        <autoReleaseAfterClose>true</autoReleaseAfterClose>    </configuration></plugin>

Просим опубликовать наш проект


На этом этапе нужно в sonatype.org сделать задачку, о том, что вы хотите свой проект опубликовать. Jira задачку типа такой https://issues.sonatype.org/browse/OSSRH-57701


Публикуем staging репозиторий


Эти команды включат релиз плагин, он подпишет ваш проект, поднимет версию, соберет исходники и доки, а так же запустит отправку проекта на sonatype.org


mvn release:clean release:prepare mvn release:perform

Если все хорошо, после того как ваш репозиторий создан тут https://oss.sonatype.org/#stagingRepositories все проверки прошли, вы можете его выбрать и нажать "Close".


Просим зарелизить наш проект


На этом этапе нужно в задачке, которую мы ранее сделали https://issues.sonatype.org/browse/OSSRH-57701 написать, что хотите релизиться. Дело в том, что синк релиз репозитория с Maven Central они включают по требованию. Так как у вас уже есть свой стеджинг (спрятанный и видимый только вами) репозиторий вы можете идти далее. Нужно его "Закрыть", нажав Close. После закрытия, можно нажать Release и Drop. С этого момента ваш стейджинг репозиторий попадет в релизный репозиторий и будет удален из стейджинга. Через десять минут после этого, если синк с централом для вашей репы включен, он будет доступен в Maven Central


Ура! :)


Краткий итог


  1. Регаемся на sonatype.org
  2. Просим их ваш проект опубликовать
  3. Делаем ключи для подписи и публикуем их
  4. Закидываем логопасы в settings.xml
  5. Настраиваем pom.xml
  6. Запускаем публикацию
  7. Заходим в sonatype.org и закрываем, релизим и дропаем свой репозиторий
  8. PROFIT!!!
Источник: habr.com
К списку статей
Опубликовано: 11.01.2021 00:10:33
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Java

Maven

Sonatype nexus

Pairwise

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru