Pull to refresh

Публикуем проект с помощью Gradle и Sonatype в Maven Central без рук

Reading time5 min
Views8.3K

Привет, меня зовут Дима и я разработчик в компании Turbomates Soft. В этой статье я хочу поделиться своим опытом публикации Kotlin | Java проектов через Gradle и рассказать о некоторых тонкостях настройки. Начнем...

1. Регистрируем репозиторий в Sonatype

Сначала мы должны зарегистрироваться в Sonatype JIRA.

Sonatype OSSRH – это хостинг репозиториев для двоичных файлов проектов с открытым исходным кодом. OSSRH использует формат репозитория Maven и позволяет:

  • развернуть бинарные файлы для разработки

  • staging вашего проекта

  • синхронизировать их с центральным репозиторием

После регистрации создаем ticket в JIRA. Выбираем тип New Project. И наверное самое основное это указываем верный groupId. Иначе придется снова создавать таску и вам создадут новый репозиторий. Напоминание. Репозиторий при подключении будет выглядеть вот так:

implementation("groupId:artifactiId:version")

Это мы делаем для того, чтобы подтвердить владение данным доменом или профилем. Если вы указали профиль гитхаба, попросят создать публичный репозиторий с нужным именем. Через некоторое время для вас создадут репозиторий и мы сможем перейти к следующему шагу.

2. Требования Central Repositry

Перед тем как приступить уже к Gradle настройке деплоя, есть ряд требований для публикации твоего репозитория.

  1. Наличие Javadoc и JavaSource. Eсли нет возможно предоставить исходные коды или документацию, можно сделать пустышки sources.jar или javadoc.jar

  2. Подпись файлов с помощью GPG/PGP

  3. Наличие конфигурационного pom файла. Gradle сам сгенерирует нам pom файл со всеми указаными конфигурация в последующих пунктах.

  4. Корректные координаты вашего проекта (artefactId, groupId, version)

  5. Наличие имени проекта, url и описания

  6. Лицензия

  7. Информация о разработчиках

  8. SCM информация

Pom файл сгенерированый с помощью Gradle и всеми ниже перечисленными требованиями мы разберем чуть позже. А пока я хотел бы остановиться подробнее на пункте с подписью GPG/PGP

3. Подписываем файлы с помощью GPG

GPG (GnuPG) – програма для шифрования информации и создания электронных цифровых подписей. И именно такая подпись нам потребуется. Прежде всего нужно установить gpg если она еще у вас не установлена.

1. Проверяем наличие gpg

gpg --version

2. Устанавливаем: на прямую через сайт для вашей ОС или через терминал

brew install gpg macOs

sudo apt install gpg Linux

3. Генерируем ключи. Выполняем все условия которые нам предлагаются

gpg --gen-key

4. Проверяем наши ключи

gpg --list-keys

5. Загружаем наши ключики на сервер этих ключей, где <PUBLIC-KEY-ID> — идентификатор открытого ключа для загрузки, который вы найдете в листе ключей.

gpg --keyserver hkp://pool.sks-keyservers.net --send-keys <PUBLIC-KEY-ID>

Отлично! Наш секретный шифр уже на сервере и теперь мы можем подписывать наши файлы. Мы же крутые программисты и не будем подписывать файлы в ручную, поэтому оставим это для Signing Plugin. Всю настройку я покажу позже, а пока согласно документации нам нужно заполнить наши секреты в файле gradle.properties

signing.keyId=24875D73
signing.password=1111111
signing.secretKeyRingFile=/Users/me/.gnupg/secring.gpg
  • keyId -> последние 8 символов <public-key-id> который мы использовали ранее

  • password -> пароль который вводился при генерировании ключей. Желательно чтобы он быть секретный как в примере

  • secretKeyRingFile -> путь до твоего файла с ключом. Но перед этим нужно его нам найти или создать.

Файл ~/.gnupg/secring.gpg — это закрытый ключ, который будет использоваться для подписи. Здесь есть подвох: если ты используешь GnuPG v2.1 или более позднюю версию, файла ~/.gnupg/secring.gpg не существует. Эта проблема обсуждается здесь, и ты можешь обойти ее, создав файл secring.gpg следующим образом:

gpg --export-secret-keys >~/.gnupg/secring.gpg

Если не будет работать попробуй

gng --export-secret-keys -o ~/secring.kbx

Готово! Теперь отметь путь к этому файлу в наших gradle.properties

4. Gradle конфигурация

Ну что, теперь самое вкусное. Коооод....

Для публикации проектов через Gradle есть замечательный плагин Maven Publish Plugin, который мы будем использовать совместно с Signing Plugin для нашей GPG подписи. Для начала подключим наши плагины

plugins {
    `maven-publish`
    signing
}

Maven Publish Plugin сгенерирует все необходимые файлы за нас, нам лишь необходимо указать нужную информацию согласно выше описаным требования. Смотри согласно документации, некоторые поля например версия опциональные, если ты их указал для проекта в build.gradle.kts.

Примечание. С февраля 2021 г. все новые проекты начали размещаться на https://s01.oss.sonatype.org/, до этого они размещаются на https://oss.sonatype.org/

java {
    withJavadocJar()
    withSourcesJar()
}

publishing {
    publications {
        create<MavenPublication>("mavenJava") {
            artifactId = "super-project"
            groupId = "com.turbomates"
            version = "0.0.1"
            from(components["java"])
            pom {
                packaging = "jar"
                name.set("Super Puper Project")
                url.set("https://github.com/turbomates/super-project")
                description.set("Some description")

                licenses {
                    license {
                        name.set("The Apache License, Version 2.0")
                        url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
                    }
                }

                scm {
                    connection.set("scm:https://github.com/turbomates/super-puper-project.git")
                    developerConnection.set("scm:git@github.com:turbomates/super-puper-project.git")
                    url.set("https://github.com/turbomates/super-puper-project")
                }

                developers {
                    developer {
                        id.set("JinEngine")
                        name.set("Dmitry Korotin")
                        email.set("jin.engine@gmail.com")
                    }
                }
            }
        }
    }
    repositories {
        maven {
            val releasesUrl = uri("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/")
            val snapshotsUrl = uri("https://s01.oss.sonatype.org/content/repositories/snapshots/")
            url = if (version.toString().endsWith("SNAPSHOT")) snapshotsUrl else releasesUrl
            credentials {
                username = project.properties["ossrhUsername"].toString()
                password = project.properties["ossrhPassword"].toString()
            }
        }
    }
}

Логин и пароль от Sonatype ("ossrhUsername & ossrhPassword") можно тоже положить в gradle.properties.

Что касается подписи, то достаточно указать какую публикацию подписать в build.gradle и наши секреты в gradle.properties

signing {
    sign(publishing.publications["mavenJava"])
}

В итоге Gradle сгенерирует для нас 4 файла:

  • super-project-0.0.1.pom

  • super-project-0.0.1.jar

  • super-project-0.0.1-source.jar

  • super-project-0.0.1-javadoc.jar

И с помощью команды ./gradle publish мы наконец уже сможем опубликовать наш проект, но пока только в репозиторий который мы создали в Sonatype

5. Релиз репозитория в Sonatype

Мы будем использовать Gradle Nexus Staging Plugin. Сам sonatype его рекомендует для staging своего проекта. Что касается настройки, то все просто, там много опциональных переменных, но я думаю такая простая конфигурация покроет большую часть кейсов.

plugins {
	  apply("io.codearte.nexus-staging:0.30.0")
}


nexusStaging {
    serverUrl = "https://s01.oss.sonatype.org/service/local/"
    username = project.properties["ossrhUsername"].toString()
    password = project.properties["ossrhPassword"].toString()
}

6. Радуемся новому релизу

Надеюсь эта статья помогла разобраться с достаточно раздутыми процессом публикации. Теперь легким сочетанием команд ./gradlew publish closeAndReleaseRepository мы можем опубликовать и зарелизить наш проект.

Что еще можно добавить: ставим пальцы вверх, нажимаем на колокольчики и пишем комментарии!

Дима jin_engine

Software Engineer | Turbomates Soft

Tags:
Hubs:
+14
Comments7

Articles